最近接触生产环境的spark任务,有很多GC问题,需要调优,平时没用过,抽空系统的学习下,特此记录,忘指教
触发GC的代码
public class HelloGC {
public static void main(String[] args) {
System.out.println("HelloGC!");
List list = new LinkedList();
try{
for(;;) {
byte[] b = new byte[1024*1024];// 1024 *1024 Byte =>> 1 MB
list.add(b);
System.out.println(list.size());
}
}catch (Exception e){
System.out.println("hello end");
}
}
}
控制台
jvm 的一些参数
输出时间
-XX:+PrintGCDateStamps -XX:+PrintGCDetails
参数总结
-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 日志文件的输出路径
-Xmn10M 新生代
-XX:MaxNewSize=10M
-XX:+PrintCommandLineFlags 打印HotSpotVM 采用的自动优化参数
-Xms70M -Xmx70M -XX:NewSize=30M -XX:SurvivorRatio=4 -XX:+PrintCommandLineFlags -XX:+PrintGC -Xloggc:E:/it/java/jvm/output/MainDate.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails
GC日志
SurvivorRatio
设置年轻代中Eden区与Survivor区的比值
SurvivorRatio=8
-Xms20M -Xmx20M -Xmn10M -verbose:gc -XX:+PrintGCDetails -XX:SurvivorRatio=8
SurvivorRatio=4
-Xms70M -Xmx70M -XX:NewSize=30M -XX:SurvivorRatio=4
-XX:NewSize=31457280
-XX:SurvivorRatio=4
堆空间总共70MB=71680KB=73400320B
年轻代 -XX:NewSize=30M=30720K=
老年代=70-30=40M=40960K
如何分析GC日志
规律
[名称:gc前内存占用-> gc后内存占用(该区内存总大小)]
GC日志中的PSYoungGen(PS是指Parallel Scavenge)为Eden+FromSpace,而整个YoungGeneration为Eden+FromSpace+ToSpace。
其他分析工具(未完待续)
参考
https://blog.csdn.net/xiaocai9999/article/details/88368395?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control