Java中对象在内存中的大小、分配等问题
时间:2020-10-14 20:46:17
收藏:0
阅读:41
Java创建一个对象的过程
- 是否对象指向的类已经加载到内存了
- 如果没有加载,就要经过load、linking(verification、preparation、resolution)、initializing把类加载进内存中。
- 为对象分配内存空间、成员变量赋默认值
- 执行构造方法
- 成员变量赋指定值
- 执行构造方法语句
对象在内存中的存储布局(这里指在64位的JVM中)
普通对象
- 对象头:markwork 8个字节
- ClassPointer指针 JVM默认开启了 -XX:userCompressedClassPoniters参数,把ClassPointer指针从8个字节压缩到4个字节
- 实例数据
- 引用类型 JVM默认开启了 -XX:userCompressedOops参数,把原本普通引用类型指针从8个字节压缩到4个字节
- Padding对齐,将对象大小对齐到8的倍数
数组
- 对象头:markword 8个字节
- ClassPointer指针 (如上)
- 数组大小 4个字节
- 数组数据
- Padding 对齐到8个字节
对象头具体包括什么
- 上图中指的是在32位JVM虚拟机中,在64为JVM虚拟机中hashcode占了31位,另外有25位没用过,有一位是没用的,其他都一样
- hashcode只有在对象调用了hashcode方法才会计算出hashCode,并把值存入里面。另外需要注意的是,在调用hashCode之后,该对象就不能进入偏向锁,因为偏向锁中需要记录线程ID,和线程重入次数(Epoch),但是他们位置被hashCode占了
- JVM中默认GC年龄最大为15,是因为如果所示,分代年龄只有4位,最大表示15。
对象如何定位
-
通过句柄池
-
通知直接指针
参考这篇博客: https://blog.csdn.net/clover_lily/article/details/80095580
评论(0)