谁知道Java中对象在内存中的大小、分配等问题

2020年10月18日 星期日 seo网站关键词优化

 

标签:blog数组classload加载micooplovepad

Java创建一个对象的过程

  1. 是否对象指向的类已经加载到内存了
    1. 如果没有加载,就要经过load、linking(verification、preparation、resolution)、initializing把类加载进内存中。
  2. 为对象分配内存空间、成员变量赋默认值
  3. 执行构造方法
    1. 成员变量赋指定值
    2. 执行构造方法语句

对象在内存中的存储布局(这里指在64位的JVM中)

普通对象

  1. 对象头:markwork 8个字节
  2. ClassPointer指针 JVM默认开启了 XX:userCompressedClassPoniters参数,把ClassPointer指针从8个字节压缩到4个字节
  3. 实例数据
    1. 引用类型 JVM默认开启了 XX:userCompressedOops参数,把原本普通引用类型指针从8个字节压缩到4个字节
  4. Padding对齐,将对象大小对齐到8的倍数

数组

  1. 对象头:markword 8个字节
  2. ClassPointer指针 (如上)
  3. 数组大小 4个字节
  4. 数组数据
  5. Padding 对齐到8个字节

对象头具体包括什么

技术图片

  1. 上图中指的是在32位JVM虚拟机中,在64为JVM虚拟机中hashcode占了31位,另外有25位没用过,有一位是没用的,其他都一样
  2. hashcode只有在对象调用了hashcode方法才会计算出hashCode,并把值存入里面。另外需要注意的是,在调用hashCode之后,该对象就不能进入偏向锁,因为偏向锁中需要记录线程ID,和线程重入次数(Epoch),但是他们位置被hashCode占了
  3. JVM中默认GC年龄最大为15,是因为如果所示,分代年龄只有4位,最大表示15。

对象如何定位

  1. 通过句柄池

  2. 通知直接指针

参考这篇博客: https://blog.csdn.net/clover_lily/article/details/80095580

Java中对象在内存中的大小、分配等问题

标签:blog数组classload加载micooplovepad

原文地址:https://www.cnblogs.com/zcrxiaozhai/p/13816054.html

您可能也喜欢