浅析Java对象布局

目录

问题描述:

可以使用JOL查看Java 对象布局

什么是java的对象头?

java对象头的组成

总结图:


问题描述:

此文要分析的问题:Java对象布局,即Java对象由什么组成、对象在堆上分配多少内存。

1,至少要考虑实例属性--不固定,对象中的属性如。

2,对象头

3,数据对齐(填充数据),如64bit jvm定义一个类对象必须是8的整数倍。便于计算机编址和寻址。

 

浅析Java对象布局_第1张图片

可以使用JOL查看Java 对象布局

(1)引入jol

  
    org.openjdk.jol  
    jol-core  
    put-the-version-here  
 

(2)创建一个非常简单的L类

public class L {
  int flag;
}

(3)测试

public class Test {
 public static void main(String[] args) {
	 L l=new L();
	 System.out.print( ClassLayout.parseInstance(l).toPrintable());
  }
}

(4)结果

浅析Java对象布局_第2张图片

什么是java的对象头?

对象的第一个部分,所有对象都有的公共部分

从上面的结果可以看出在64位jvm环境下对象头占12byte

java对象头的组成

我们可以直接访问http://openjdk.java.net/groups/hotspot/docs/HotSpotGlossary.html查看hotspot实现Jvm规范中对对象头

object header

Common structure at the beginning of every GC-managed heap object. (Every oop points to an object header.) Includes fundamental information about the heap object's layout, type, GC state, synchronization state, and identity hash code. Consists of two words. In arrays it is immediately followed by a length field. Note that both Java objects and VM-internal objects have a common object header format.

翻译:

对象头

每个gc管理的堆对象开头的公共结构。(每个oop都指向一个对象标头。)包括堆对象的布局、类型、GC状态、同步状态和标识哈希码的基本信息。由两个词组成。在数组中,它后面紧跟着一个长度字段。注意,Java对象和vm内部对象都有一个通用的对象头格式。

(1)64位jvm环境java对象头中的mark word占64bit

The first word of every object header. Usually a set of bitfields including synchronization state and identity hash code. May also be a pointer (with characteristic low bit encoding) to synchronization related information. During GC, may contain GC state bits

 

翻译:每个对象标头的第一个单词。通常是一组位域,包括同步状态和标识哈希码。也可以是同步相关信息的指针(具有特征的低比特编码)。在GC期间,可能包含GC状态位。

(2)klass pointer/class metadat address正常情况占64bit,当开启指针压缩占32bit

The second word of every object header. Points to another object (a metaobject) which describes the layout and behavior of the original object. For Java objects, the "klass" contains a C++ style "vtable".

翻译:每个对象标头的第二个单词。指向描述原始对象的布局和行为的另一个对象(元对象)。对于Java对象,“klass”包含一个c++风格的“vtable”。

(3)数组长度

当属性中存在数组时需要。

总结图:

浅析Java对象布局_第3张图片

 

注:

jvm--(虚拟机规范) 

hotspot,j9,taobaovm等虚拟机(根据规范实现的产品)

openJdk 项目--开源的hotspot代码/c++

你可能感兴趣的:(Java)