JVM 读书笔记(一)之 java 内存区域
2017-12-13 本文已影响9人
innovatorCL
1.java 运行时数据区域
java 虚拟机运行时的数据区-
java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。几乎所有的对象实例和数据都要在堆上分配内存。
-
方法区也是被各个线程共享的区域,存储已被虚拟机加载的类信息(类名、访问修饰符、常量池、字段描述、方法描述等)、常量、静态变量、即时编译器编译后的代码等数据。
2.在 HotSpot 虚拟机中对象创建过程
-
对象所需的内存大小在类加载完成后便完全可以确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。有两种方法划分:指针碰撞、本地线程分配缓冲(TLAB)
-
虚拟机在分配好对象的存储空间后会对对象进行必要的设置,如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。这些都放在对象的对象头(Object Header)中。
-
对象的内存布局
-
对象头
对象头包括两个部分:
1.存储对象自身的运行时数据,如 哈希码、GC 年龄分代、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等。
2.存储类型指针,即对象指向他的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
-
实例数据
这部分是对象真正存储的有效信息,也是程序代码定义的各种类型的字段内容。无论是从父类继承的,还是在子类中定义的。
-
对齐填充
这部分主要是用来对齐对象的大小的(8 字节的整数倍),没实际意义。
-