Java 虚拟机程序员

【Java 虚拟机笔记】垃圾收集器相关整理

2019-02-25  本文已影响50人  58bc06151329

文前说明

作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。

1. 概述

2. 垃圾收集算法

2.1 引用计数法

互相循环引用

2.2 根搜索法/可达性分析算法

可达性分析

Java 中可以主动垃圾回收吗

判断对象生存还是死亡

2.3 Java 中的引用类型

3. 垃圾收集算法

3.1 标记-清除(Mark-Sweep)算法

标记-清除算法

3.2 复制(Copying)算法

复制算法

3.3 标记-整理(Mark-Compact)算法

标记-整理算法

3.4 分代收集算法

分代收集算法

4. HotSpot 虚拟机

4.1 HotSpot 虚拟机中对象可达性分析的实现

可达性分析的问题

枚举根节点

安全点

如何在安全点上停顿

安全区域

4.2 HotSpot 虚拟机中的垃圾收集器

4.2.1 Serial 收集器

Serial 收集器

4.2.2 ParNew 收集器

ParNew 收集器

4.2.3 Parallel 收集器

4.2.4 Serial Old 收集器

4.2.5 Parallel Old 收集器

Parallel Old 收集器

4.2.6 并发标记扫描 CMS 收集器

4.2.7 G1 收集器

G1 收集器

5. GC 参数

GC 参数 说明
UseSerialGC 虚拟机运行在 Client 模式的默认值,打开此开关参数后,使用 Serial+Serial Old 收集器组合进行垃圾收集。
UseParNewGC 打开此开关参数后,使用 ParNew+Serial Old 收集器组合进行垃圾收集。
UseConcMarkSweepGC 打开此开关参数后,使用 ParNew+CMS+Serial Old 收集器组合进行垃圾收集。Serial Old 作为 CMS 收集器出现 Concurrent Mode Failure 的备用垃圾收集器。
UseParallelGC 虚拟机运行在 Server 模式的默认值,打开此开关参数后,使用 Parallel Scavenge+Serial Old 收集器组合进行垃圾收集。
UseParallelOldGC 打开此开关参数后,使用 Parallel Scavenge+Parallel Old 收集器组合进行垃圾收集。
SurvivorRatio 新生代中 Eden 区域与 Survivor 区域的容量比值,默认为 8,代表 Eden : Survivor = 8 : 1。
PretenureSizeThreshold 直接晋升到老年代的对象大小,设置这个参数后,大于这个参数的对象直接在老年代分配。
MaxTenuringThreshold 晋升到老年代的对象年龄。每个对象在坚持过一次 Minor GC 之后,年龄就增加 1,当超过这个参数值时就进入老年代。
UseAdaptiveSizePolicy 动态调整 Java 堆中各个区域的大小以及进入老年代的年龄。
HandlePromotionFailure 是否允许分配担保失败,即老年代的剩余空间不足以应付新生代的整个 Eden 和 Survivor 区的所有对象都存活的极端情况。
ParallelGCThreads 设置并行 GC 时进行内存回收的线程数。
GCTimeRatio GC 时间占总时间的比率,默认值为 99,即允许 1% 的 GC 时间。仅在使用 Parallel Scavenge 收集器时生效。
MaxGCPauseMillis 设置 GC 的最大停顿时间。仅在使用 Parallel Scavenge 收集器时生效。
CMSInitatingOccupancyFraction 设置 CMS 收集器在老年代空间被使用多少后触发垃圾收集。默认值为 68%,仅在使用 CMS 收集器时生效。
UseCMSCompactAtFullCollection 设置 CMS 收集器在完成垃圾收集后是否要进行一次内存碎片整理。仅在使用 CMS 收集器时生效。
CMSFullGCsBeforeCompaction 设置 CMS 收集器在进行若干次垃圾收集后再启动一次内存碎片整理。仅在使用 CMS 收集器时生效。
-XX:+PrintGC 输出 GC 日志。
-XX:+PrintGCDetails 输出 GC 的详细日志。
-XX:+PrintGCTimeStamps 输出 GC 的时间戳(以基准时间的形式)。
-XX:+PrintGCDateStamps 输出 GC 的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)。
-XX:+PrintHeapAtGC 在进行 GC 的前后打印出堆的信息。
-Xloggc:../logs/gc.log 日志文件的输出路径。

6. GC 日志

[GC (System.gc()) [PSYoungGen: 5243K->808K(76288K)] 70779K->66352K(251392K), 0.0009738 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (System.gc()) [PSYoungGen: 808K->0K(76288K)] [ParOldGen: 65544K->635K(175104K)] 66352K->635K(251392K), [Metaspace: 3205K->3205K(1056768K)], 0.0050875 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 PSYoungGen      total 76288K, used 655K [0x000000076af00000, 0x0000000770400000, 0x00000007c0000000)
  eden space 65536K, 1% used [0x000000076af00000,0x000000076afa3ee8,0x000000076ef00000)
  from space 10752K, 0% used [0x000000076ef00000,0x000000076ef00000,0x000000076f980000)
  to   space 10752K, 0% used [0x000000076f980000,0x000000076f980000,0x0000000770400000)
 ParOldGen       total 175104K, used 635K [0x00000006c0c00000, 0x00000006cb700000, 0x000000076af00000)
  object space 175104K, 0% used [0x00000006c0c00000,0x00000006c0c9ef58,0x00000006cb700000)
 Metaspace       used 3211K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 349K, capacity 388K, committed 512K, reserved 1048576K

参考资料

https://blog.csdn.net/sunjin9418/article/details/79603651
https://blog.csdn.net/tjiyu/article/details/53982412
https://blog.csdn.net/qq_36711757/article/details/80470820
https://blog.csdn.net/high2011/article/details/80177473
https://blog.csdn.net/heuguangxu/article/details/80542098
https://www.cnblogs.com/wrencai/p/5668621.html
https://blog.csdn.net/baiyan3212/article/details/81458697

上一篇 下一篇

猜你喜欢

热点阅读