Update Java 虚拟机.md
This commit is contained in:
parent
58f11f78a8
commit
90e46ab379
|
@ -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 一般包含以下内容:
|
||||
|
||||
- 虚拟机栈中引用的对象
|
||||
- 虚拟机栈 (局部变量表) 中引用的对象
|
||||
- 本地方法栈中引用的对象
|
||||
- 方法区中类静态属性引用的对象
|
||||
- 方法区中的常量引用的对象
|
||||
|
|
Loading…
Reference in New Issue
Block a user