Java内存区域对象的内存布局和访问定位(Header、Instance、Padding)
Java普通对象被创建出以后,就需要关注下它在JVM堆中的内存布局是什么样子的。
大致分为3个区域:
1.对象头(Header)
2.实例数据(Instance)
3.对齐补充(Padding)
1.对象头(Header)
对象头在JVM这本书中有个专门的章节去讲Class文件的布局,这一章还没有去看,因此,对于这个暂时没有什么概念。
主要分为2部分:
1)存储对象自身的运行时数据(Mark Word)
常见的包括hash码,GC年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等等。
具体布局我不想关注了,先知道下是什么,之后再去想为什么。
2)存储指向对象类型数据的指针
这个指针就是确定这个对象是哪个类的实例。 但是书中说这个不是必须的,需要对应对象的访问方式
存在的意义在于,栈中对象的引用使用直接指针的时候,该指针指向堆内存中的对象,所以对象头是需要存储它的类云数据指针,这个指针才是指向方法区中对象的类型 数据。
3)Java数组是特例
当是数组时还需要记录数组长度,这是因为数组对象类型的数据中没有数组长度信息。
2.实例数据(Instance)
对象存储的真正有效的数据,也就是程序代码中所定义的各种类型字段内容。包括父类继承的和子类定义的。
说下存储顺序:
1).受到JVM分配策略影响(FieldsAllocationStyle)
longs/doubles、
ints、
shorts/chars、
bytes/booleans、
oops(Ordinary Object Pointers) 差不多相同长度的被分在一块。
2).字段在Java源码中定义顺序影响
3.对齐补充(Padding)
对齐补充不是必须存在的,就是占位的作用。不去管它。
对象的访问定位
相信大家都是知道,一个对象的访问,是通过栈中的引用 访问堆中具体的地址获取到这个对象的,但是JVM并没有规定需要用何种方式去定位这个对象的具体位置。
目前主流的方式是两种:
1).句柄
2).直接指针
1).句柄
本质还是通过栈去访问,但是在堆中多出一块区域,存放的是句柄池,reference中存放的是对象的句柄地址,而不是真正对象的地址。句柄池内存放着对象实例数据与类型数据各自的地址,
优势: reference中存储的是稳定的句柄地址,在对象被移动(进行垃圾处理时)只改变句柄中的实例数据指针,而reference不需要修改。
2).直接指针
如果使用了直接地址,那么从图中也可见对象里面需要存放了类型数据的相关信息。
优势: 速度更快,省去通过句柄的另一次开销,这是常见的访问对象的方式。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
nginx配置出错duplicate location “/”nginx: [emerg] duplicate location “/”
将nginx配置文件中的两个location合并成一个 就好了。 server { listen ******; listen *****; server_name ****; root /*****; location / { index index.php index.html index.htm; } location ~ .php$ { ********* } location / { 这个注释掉,即可 } error_page 404 /404.html; location = /40x.html { }
- 下一篇
十分钟上线 - 函数计算构建支付宝小程序的后端
阿里云函数计算服务(FunctionCompute,FC)是一个事件驱动的全托管计算服务。通过函数计算与云端各个服务的广泛集成,开发者只需要编写函数代码,就能够快速地开发出弹性高可用的后端系统。接下来我们使用FC,来快速实现一个图片转换服务, 并把这个图片转换服务作为支付宝小程序的后端。 支付宝小程序demo前端效果图: 资源下载及准备工作 示例代码附件 【必须】 支付宝小程序开发工具下载 【非必须】 函数计算FC 快捷入口对象存储OSS 快捷入口日志服务Log Service 快捷入口 简明架构图 函数入口 普通函数入口 def my_handler(event, context): return 'hello world' 函数名 my_handler需要与创建函数时的"Handler"字段相对应:例如创建函数时指定的 Handler 为m
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Red5直播服务器,属于Java语言的直播服务器