读Java性能权威指南(第2版)笔记17_垃圾回收D

Posted lying7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读Java性能权威指南(第2版)笔记17_垃圾回收D相关的知识,希望对你有一定的参考价值。

1. 元空间(metaspace)

1.1. 当JVM加载类时,它必须记录这些类的某些元数据,这些数据占据的一个单独的堆空间,即元空间

1.2. 元空间里的信息只在编译器和JVM运行时使用,它所保存的数据被称为类元数据(class metadata)

1.2.1. 对于终端用户,元空间是不透明的

1.2.2. 元空间并不保存类的实例或者反射对象

1.3. 通过永久代(permgen)的实现来处理的

1.4. 元空间的大小与它所使用的类的数量成正比

1.5. -XX:MetaspaceSize=N

1.5.1. 初始大小

1.6. -XX:MaxMetaspaceSize=N

1.6.1. 最大值

1.7. 元空间大小的默认值

1.7.2. 优化永久代在过去相当普遍,而现在优化元空间相当罕见,因为空间丰富

1.8. 调整元空间的大小会导致Full GC,这是代价高昂的操作

1.9. 如果在应用程序的启动过程中(它在加载类)有大量的Full GC,往往是因为永久代或元空间正在调整大小

1.10. 定义并丢弃大量类的应用程序,在元空间被填满且旧的类被删除时,偶尔会发生Full GC。这在开发环境中很常见

1.11. 服务器通常将元空间的初始大小设定为128 MB、192 MB或更大

1.12. 增加元空间的初始值是改善启动过程的好主意

1.13. 元空间的初始大小可以基于所有类都加载之后的使用量来设置,这会稍微加快启动速度

1.14. 限制元空间大小的一个原因是防止类加载器泄漏

1.15. jmap可以和-clstats一起使用,以输出有关类加载器的信息

2. 控制并行

2.1. 除了Serial垃圾回收器,所有的GC算法都使用了多线程

2.2. -XX:ParallelGCThreads=N

2.2.1. 设置线程的数量

2.2.2. 使用-XX:+UseParallelGC时新生代的回收

2.2.3. 使用-XX:+UseParallelGC时老年代的回收

2.2.4. 使用-XX:+UseG1GC时新生代的回收

2.2.5. G1 GC的STW停顿阶段(不包括Full GC)

2.3. 默认情况下,JVM将在机器的每个CPU上都运行一个线程,最多同时运行8个,达到这个阈值后,JVM每1.6个CPU会再增加一个新线程

2.4. 超过8个CPU的机器上,线程总数计算

2.4.1. ParallelGCThreads = 8 + ((N - 8) * 5 / 8)

2.4.2. N表示CPU的数量

2.5. 如果机器上运行的JVM不止一个,那么最好限制所有JVM的GC线程总数

2.6. 当多个JVM运行在同一台机器上时,基于公式计算出的线程数量会过高,实际情况中必须减少使用的线程数量

3. GC工具

3.1. GC日志是诊断GC问题所需的关键数据,应该定期收集它们(即使是在生产服务器上)

3.2. 在JDK 8中开启GC日志

3.2.1. 设定-verbose:gc和-XX:+PrintGC中的任意一个,都会创建简单的GC 日志

3.2.1.1. 这两个标志是彼此的别名

3.2.1.2. 日志默认情况下是关闭的

3.2.2. -XX:+PrintGCDetails

3.2.2.1. 推荐使用

3.2.2.2. 将创建包含更多信息的详细日志

3.2.2.3. 默认情况下是false

3.2.3. -XX:+PrintGCTimeStamps

3.2.3.1. 确定GC操作之间的时间

3.2.3.2. 时间戳(time stamp)是相对于0的(基于JVM启动的时间)值

3.2.4. -XX:+PrintGCDateStamps

3.2.4.1. 确定GC操作之间的时间

3.2.4.2. 日期戳(date stamp)是实际的日期字符串

3.2.4.3. 日期戳需要格式化,这使得日期戳的效率略低

3.2.5. -Xloggc:filename

3.2.5.1. 默认被写入标准输出

3.2.5.2. 改变被写入的位置

3.2.5.3. 可以自动开启简单GC日志

3.2.6. 日志文件的滚动

3.2.6.1. 可以限制GC日志中保存的数据量

3.2.6.2. -XX:+UseGCLogFileRotation

3.2.6.2.1. 默认关闭的
3.2.6.2.2. 开启时
3.2.6.2.2.1. -XX:NumberOfGCLogFiles=N
3.2.6.2.2.2. 默认的文件数量是0(意味着无限多)
3.2.6.2.2.3. -XX:GCLogFileSize=N
3.2.6.2.2.4. 默认的日志文件大小是0(意味着无限大)

3.2.6.3. 示例

3.2.6.3.1. ***-Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation

-XX:NumberOfGCLogFile=8 -XX:GCLogFileSize=8m***

3.3. 在JDK 11中开启GC日志

3.3.1. JDK 11和之后的版本统一使用了Java的新日志功能

3.3.2. -Xlog标志开启

3.3.3. -Xlog:gc*:file=gc.log:time:filecount=7,filesize=8M

3.3.3.1. 示例

3.3.3.2. (gc*)设定了应该开启哪些模块的日志

3.3.3.3. (file=gc.log)设置了日志文件的位置

3.3.3.4. (time)是一个修饰符。这个修饰符表示记录信息时要带上时间戳

3.3.3.5. (filecount=7,filesize=8M)设定了输出选项

3.3.3.5.1. 当大小达到8 MB时会滚动日志,共保留8个日志文件

3.3.4. GCeasy

3.3.4.1. 免费的基本日志解析服务

以上是关于读Java性能权威指南(第2版)笔记17_垃圾回收D的主要内容,如果未能解决你的问题,请参考以下文章

读Java性能权威指南(第2版)笔记14_垃圾回收A

读Java性能权威指南(第2版)笔记20_垃圾回收G

读Java性能权威指南(第2版)笔记15_垃圾回收B

读Java性能权威指南(第2版)笔记21_垃圾回收H

读Java性能权威指南(第2版)笔记16_垃圾回收C

读Java性能权威指南(第2版)笔记11_堆内存上