From 90e46ab379964e38a9e16b8ee08493ff9ede383c Mon Sep 17 00:00:00 2001 From: showCodes <22638002+showCodes@users.noreply.github.com> Date: Thu, 30 Aug 2018 11:02:33 +0800 Subject: [PATCH] =?UTF-8?q?Update=20Java=20=E8=99=9A=E6=8B=9F=E6=9C=BA.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Java 虚拟机.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index 1a1adc5a..40972bfd 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -7,6 +7,8 @@ * [方法区](#方法区) * [运行时常量池](#运行时常量池) * [直接内存](#直接内存) + * [类的创建过程](#类的创建过程) + * [对象的结构](#对象的结构) * [二、垃圾收集](#二垃圾收集) * [判断一个对象是否可被回收](#判断一个对象是否可被回收) * [引用类型](#引用类型) @@ -102,6 +104,28 @@ Class 文件中的常量池(编译器生成的各种字面量和符号引用 这样能在一些场景中显著提高性能,因为避免了在 Java 堆和 Native 堆中来回复制数据。 +## 对象的创建过程 + +[图解JAVA对象的创建过程](https://www.cnblogs.com/chenyangyao/p/5296807.html) + +![111](https://images2015.cnblogs.com/blog/592743/201603/592743-20160319235423381-1926278401.png) + +## 对象的结构 + +对象包含 3 个部分: +1. Header(对象头):如下图所示; +2. InstanceData(实例数据):将等宽的类型放在一起; +3. Padding(对齐填充):Hotspot 虚拟机的内存管理系统要求对象的起始地址要是 8 个字节的整数倍,而对象头就是 8 个字节的整数倍。padding 是用来填充实例数据不足 8 个字节整数倍的部分,可以理解为占位符。 + +![112](https://images2015.cnblogs.com/blog/592743/201603/592743-20160319235633553-1910724119.png) + +## 对象的地址访问 + +1. 直接指针:对象的引用直接指向堆中的内存地址 (Hotspot 采用的方式); +2. 使用句柄:Java 堆中划分出一块内存作为句柄池,对象的引用指向句柄池。 + +![113](https://images2015.cnblogs.com/blog/592743/201603/592743-20160319235555303-769658219.jpg) + # 二、垃圾收集 垃圾收集主要是针对堆和方法区进行。 @@ -138,7 +162,7 @@ public class ReferenceCountingGC { Java 虚拟机使用该算法来判断对象是否可被回收,在 Java 中 GC Roots 一般包含以下内容: -- 虚拟机栈中引用的对象 +- 虚拟机栈 (局部变量表) 中引用的对象 - 本地方法栈中引用的对象 - 方法区中类静态属性引用的对象 - 方法区中的常量引用的对象