Merge pull request #395 from showCodes/patch-1

Update Java 虚拟机.md
This commit is contained in:
郑永川 2018-08-30 20:24:20 +08:00 committed by GitHub
commit f74691aa0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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 一般包含以下内容:
- 虚拟机栈中引用的对象
- 虚拟机栈 (局部变量表) 中引用的对象
- 本地方法栈中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中的常量引用的对象