auto commit

This commit is contained in:
CyC2018 2018-03-22 22:29:20 +08:00
parent b9be426f90
commit ce0468c06f

View File

@ -15,9 +15,9 @@
* [4. 方法区的回收](#4-方法区的回收)
* [5. finalize()](#5-finalize)
* [垃圾收集算法](#垃圾收集算法)
* [1. 标记-清除](#1-标记-清除)
* [1. 标记 - 清除](#1-标记---清除)
* [2. 复制](#2-复制)
* [3. 标记-整理](#3-标记-整理)
* [3. 标记 - 整理](#3-标记---整理)
* [4. 分代收集](#4-分代收集)
* [垃圾收集器](#垃圾收集器)
* [1. Serial 收集器](#1-serial-收集器)
@ -103,9 +103,9 @@ java -Xss=512M HackTheJava
当一个对象被创建时,它首先进入新生代,之后有可能被转移到老年代中。新生代存放着大量的生命很短的对象,因此新生代在三个区域中垃圾回收的频率最高。为了更高效地进行垃圾回收,把新生代继续划分成以下三个空间:
- Eden 空间
- From 空间
- To 空间
- Eden
- From Survivor
- To Survivor
<div align="center"> <img src="../pics//ppt_img.gif"/> </div><br>
@ -253,7 +253,7 @@ finalize() 类似 C++ 的析构函数,用来做关闭外部资源等工作。
不足:
1. 标记和清除过程效率都不高
2. 会产生大量碎片
2. 会产生大量碎片,内存碎片过多可能导致无法给大对象分配内存
之后的算法都是基于该算法进行改进。
@ -280,7 +280,7 @@ finalize() 类似 C++ 的析构函数,用来做关闭外部资源等工作。
一般将 Java 堆分为新生代和老年代。
1. 新生代使用:复制算法
2. 老年代使用:标记-清理 或者 标记-整理 算法
2. 老年代使用:标记 - 清理 或者 标记 - 整理 算法
## 垃圾收集器
@ -391,7 +391,7 @@ Region 不可能是孤立的,一个对象分配在某个 Region 中,可以
### 8. 七种垃圾收集器的比较
| 收集器 | 串行、并行 or 并发 | 新生代 / 老年代 | 算法 | 目标 | 适用场景 |
| --- | --- | --- | --- | --- | --- |
| :---: | :---: | :---: | :---: | :---: | :---: |
| **Serial** | 串行 | 新生代 | 复制算法 | 响应速度优先 | 单 CPU 环境下的 Client 模式 |
| **Serial Old** | 串行 | 老年代 | 标记-整理 | 响应速度优先 | 单 CPU 环境下的 Client 模式、CMS 的后备预案 |
| **ParNew** | 并行 | 新生代 | 复制算法 | 响应速度优先 | 多 CPU 环境时在 Server 模式下与 CMS 配合 |
@ -635,13 +635,15 @@ public static void main(String[] args) {
从 Java 虚拟机的角度来讲,只存在以下两种不同的类加载器:
一种是启动类加载器Bootstrap ClassLoader这个类加载器用 C++ 实现,是虚拟机自身的一部分;另一种就是所有其他类的加载器,这些类由 Java 实现,独立于虚拟机外部,并且全都继承自抽象类 java.lang.ClassLoader。
- 启动类加载器Bootstrap ClassLoader这个类加载器用 C++ 实现,是虚拟机自身的一部分;
- 所有其他类的加载器,这些类由 Java 实现,独立于虚拟机外部,并且全都继承自抽象类 java.lang.ClassLoader。
从 Java 开发人员的角度看,类加载器可以划分得更细致一些:
- 启动类加载器Bootstrap ClassLoader 此类加载器负责将存放在 <JAVA_HOME>\lib 目录中的,或者被 -Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar名字不符合的类库即使放在 lib 目录中也不会被加载)类库加载到虚拟机内存中。 启动类加载器无法被 Java 程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给启动类加载器,直接使用 null 代替即可。
- 启动类加载器Bootstrap ClassLoader 此类加载器负责将存放在 &lt;JAVA_HOME>\lib 目录中的,或者被 -Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar名字不符合的类库即使放在 lib 目录中也不会被加载)类库加载到虚拟机内存中。 启动类加载器无法被 Java 程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给启动类加载器,直接使用 null 代替即可。
- 扩展类加载器Extension ClassLoader 这个类加载器是由 ExtClassLoadersun.misc.Launcher$ExtClassLoader实现的。它负责将 <Java_Home>/lib/ext 或者被 java.ext.dir 系统变量所指定路径中的所有类库加载到内存中,开发者可以直接使用扩展类加载器。
- 扩展类加载器Extension ClassLoader 这个类加载器是由 ExtClassLoadersun.misc.Launcher$ExtClassLoader实现的。它负责将 &lt;JAVA_HOME>/lib/ext 或者被 java.ext.dir 系统变量所指定路径中的所有类库加载到内存中,开发者可以直接使用扩展类加载器。
- 应用程序类加载器Application ClassLoader 这个类加载器是由 AppClassLoadersun.misc.Launcher$AppClassLoader实现的。由于这个类加载器是 ClassLoader 中的 getSystemClassLoader() 方法的返回值因此一般称为系统类加载器。它负责加载用户类路径ClassPath上所指定的类库开发者可以直接使用这个类加载器如果应用程序中没有自定义过自己的类加载器一般情况下这个就是程序中默认的类加载器。