From 4a8835bf2e8f774285e6d0cc181bc65685301852 Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Mon, 13 Aug 2018 22:03:33 +0800
Subject: [PATCH] auto commit
---
notes/Java 虚拟机.md | 406 +++++++++++++++++++++----------------------
1 file changed, 203 insertions(+), 203 deletions(-)
diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md
index 136ca5ad..891211da 100644
--- a/notes/Java 虚拟机.md
+++ b/notes/Java 虚拟机.md
@@ -8,15 +8,22 @@
* [运行时常量池](#运行时常量池)
* [直接内存](#直接内存)
* [二、垃圾收集](#二垃圾收集)
- * [判断一个对象是否存活](#判断一个对象是否存活)
+ * [判断一个对象是否可被回收](#判断一个对象是否可被回收)
+ * [引用类型](#引用类型)
* [垃圾收集算法](#垃圾收集算法)
* [垃圾收集器](#垃圾收集器)
- * [内存分配与回收策略](#内存分配与回收策略)
-* [三、类加载机制](#三类加载机制)
+* [三、内存分配与回收策略](#三内存分配与回收策略)
+ * [Minor GC 和 Full GC](#minor-gc-和-full-gc)
+ * [内存分配策略](#内存分配策略)
+ * [Full GC 的触发条件](#full-gc-的触发条件)
+* [四、类加载机制](#四类加载机制)
* [类的生命周期](#类的生命周期)
- * [类初始化时机](#类初始化时机)
* [类加载过程](#类加载过程)
- * [类加载器](#类加载器)
+ * [类初始化时机](#类初始化时机)
+ * [类与类加载器](#类与类加载器)
+ * [类加载器分类](#类加载器分类)
+ * [双亲委派模型](#双亲委派模型)
+ * [自定义类加载器实现](#自定义类加载器实现)
* [参考资料](#参考资料)
@@ -48,19 +55,17 @@ java -Xss=512M HackTheJava
## 本地方法栈
-本地方法不是用 Java 实现,对待这些方法需要特别处理。
+本地方法一般是用其它语言(C、C++ 或汇编语言等)编写的,并且被编译为基于本机硬件和操作系统的程序,对待这些方法需要特别处理。
-与 Java 虚拟机栈类似,它们之间的区别只不过是本地方法栈为本地方法服务。
-
-本地方法一般是用其它语言(C、C++ 或汇编语言等)编写的, 并且被编译为基于本机硬件和操作系统的程序。
+本地方法栈与 Java 虚拟机栈类似,它们之间的区别只不过是本地方法栈为本地方法服务。
## 堆
-所有对象实例都在这里分配内存,是垃圾收集的主要区域("GC 堆")。
+所有对象都在这里分配内存,是垃圾收集的主要区域("GC 堆")。
-现代的垃圾收集器基本都是采用分代收集算法,针对不同的对象采取不同的垃圾回收算法,可以将堆分成两块:
+现代的垃圾收集器基本都是采用分代收集算法,针对不同类型的对象采取不同的垃圾回收算法,可以将堆分成两块:
- 新生代(Young Generation)
- 老年代(Old Generation)
@@ -83,9 +88,7 @@ java -Xms=1M -Xmx=2M HackTheJava
用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
-和堆一样不需要连续的内存,并且可以动态扩展。
-
-动态扩展失败一样会抛出 OutOfMemoryError 异常。
+和堆一样不需要连续的内存,并且可以动态扩展,动态扩展失败一样会抛出 OutOfMemoryError 异常。
对这块区域进行垃圾回收的主要目标是对常量池的回收和对类的卸载,但是一般比较难实现。
@@ -107,15 +110,15 @@ Class 文件中的常量池(编译器生成的各种字面量和符号引用
# 二、垃圾收集
-垃圾回收主要是针对堆和方法区进行。
+垃圾收集主要是针对堆和方法区进行。
程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收。
-## 判断一个对象是否存活
+## 判断一个对象是否可被回收
### 1. 引用计数算法
-给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数不为 0 的对象仍然存活。
+给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。
两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。
@@ -123,6 +126,7 @@ Class 文件中的常量池(编译器生成的各种字面量和符号引用
```java
public class ReferenceCountingGC {
+
public Object instance = null;
public static void main(String[] args) {
@@ -147,61 +151,7 @@ Java 虚拟机使用该算法来判断对象是否可被回收,在 Java 中 GC
- 方法区中类静态属性引用的对象
- 方法区中的常量引用的对象
-### 3. 引用类型
-
-无论是通过引用计算算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关。
-
-Java 具有四种强度不同的引用类型。
-
-**(一)强引用**
-
-被强引用关联的对象不会被回收。
-
-使用 new 一个新对象的方式来创建强引用。
-
-```java
-Object obj = new Object();
-```
-
-**(二)软引用**
-
-被软引用关联的对象只有在内存不够的情况下才会被回收。
-
-使用 SoftReference 类来创建软引用。
-
-```java
-Object obj = new Object();
-SoftReference