7.说一 GC 调优的思路
a.首先是配置 GC 日志的输出,借助 一些工具来分析 如 gcviwer 在线的 easyGC.com
b.查看一下总的参数情况:Throughput[吞吐量] Avg Pause[平均暂停时间] GC Count [发生的
GC 次数]
c.动态分配堆内存的大小,以及分配情况,来查看 GC 情况。
f.各种垃圾收集器的回收方法不一样,所以具体的调优思路还得官网给出的不同收集器的
分析思路,并结合自己的业务来分析
如在 G1 收集器使用时,可以设置停顿时间。
G1 还可以尝试设置停顿时间值 predictable 来分析吞吐量变化 Throughput 和 Avg Pause[平
均暂停时间]的变化
8.jdk8 默认的垃圾收集机
Java 8 默认使用 ParallelGC 收集器,也就是在新生代使用 Parallel Scavenge 收集器,老年代
使用 ParallelOld 收集器
用 java -XX:+PrintCommandLineFlags -version 看使用的垃圾收集器
9.应用启用时发生了 FullGC,而查看老年代的空间还是充足的。为什么?请分析
一下原因
此题考查的是 FullGc 的触发时机,我们知道 Full GC 一般是 = MinorGc + OldGC,但这个"一
般" 指的是运行时
此处特别强调了“应用启动时”,程序开发执行的时候会加载类信息,而类型信息是存放在
元空间的,所以
元空间 MetaspaceSize 设置过小导致,默认是 20M 左右。可能类信息太多导致元空间不够,
进而导致扩容,进而导致堆内存变化,进而导致了 fullGC
所以应该要强调一点:程序启动时 Full GC 是 = MinorGc + OldGC + MetaspaceGC
10.说一下 GC 算法,回收原理
引用计数法:每次对象赋值时维护引用计数器,引用计数器=0 时则回收;由于循环引
用问题的存在,目前很少用改回收算法。
复制:如 Minor GC 的过程用的就是复制算法 复制-->清空-->互换 from 区,to 区
标记清除:mark-sweep ,先统一标记出需要回收的对象,再统一回收这些对象。解决了
复制算法大面积内存拷贝导致的回收性能差的问题,但是会产生内存不连续的状况即
—内存碎片。导致空间浪费。
标记整理:在标记-清除之后,再次扫描内存空间,将不连的对象挪到一起,形成连续