博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java内存区域与内存溢出异常---对象的内存布局和对象的访问定位
阅读量:5110 次
发布时间:2019-06-13

本文共 668 字,大约阅读时间需要 2 分钟。

对象的内存布局

  在HotSpot虚拟机中,对象在内存中的存储布局可以划分为三个区域:对象头实例数据对齐填充

  对象头包括两部分信息:第一部分用于存储对象自身的运行时数据,如哈希码GC分代年龄锁状态标志等。对象头的另一部分是类型指针,即对象指向向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例

  实例数据部分是对象真正存储的有效信息,也是代码中所定义的各种类型字段的内容。

  对齐填充并不是一定存在的,它仅仅起着占位符的作用,这是由于HotSpot VM规定对象的起始地址必须是以8字节的整数倍,也就是说对象的大小必须是8字节的整数倍。因此当实例的数据部分没有对齐的话,就会进行对齐填充。

对象的访问定位

  java程序需要通过栈上的reference数据来操作堆上的具体对象。对象的访问方式也是有虚拟机的实现所决定的。目前主流的访问方式有:使用句柄直接指针两种。

  使用句柄访问,Java堆会分配一块内存来作为句柄池,reference中存储的就是对象的句柄地址

  使用指针直接访问,Java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而reference中存储的直接就是对象地址

  使用句柄来进行访问的好处就是reference中存储的是稳定的句柄地址,在对象被移动时,只会改变对象中的实例数据指针,而reference本身不需要改变。指针直接访问的优势就是速度快。

转载于:https://www.cnblogs.com/yjxyy/p/10695322.html

你可能感兴趣的文章
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
Html5 离线页面缓存
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Android打包key密码丢失找回
查看>>
VC6.0调试技巧(一)(转)
查看>>
类库与框架,强类型与弱类型的闲聊
查看>>
webView添加头视图
查看>>
php match_model的简单使用
查看>>
在NT中直接访问物理内存
查看>>
Intel HEX 文件格式
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
php_扑克类
查看>>
回调没用,加上iframe提交表单
查看>>
(安卓)一般安卓开始界面 Loding 跳转 实例 ---亲测!
查看>>
Mysql 索引优化 - 1
查看>>
LeetCode(3) || Median of Two Sorted Arrays
查看>>
大话文本检测经典模型:EAST
查看>>
待整理
查看>>
一次动态sql查询订单数据的设计
查看>>