文章目录

  • **前言**
  • **叙述**
  • 操作配置
  • Trace跟踪参数
  • 堆的分配参数
  • 栈的分配参数
  • **小结**


前言

阅读GC日志是处理Java虚拟机内存问题的基础技能


叙述

操作配置

Eclipse

(1)如果你用的是Eclipse,打印GC日志的操作如下

Java log打印日志 打印jvm日志_参数

Java log打印日志 打印jvm日志_局部变量_02


在上图的箭头处加上-XX:+PrintGCDetails这句话。于是,运行程序后,GC日志就可以打印出来了:

Java log打印日志 打印jvm日志_局部变量_03


(2)如果你用的是IntelliJ IDEA,打印GC日志的操作如下:

Java log打印日志 打印jvm日志_Java log打印日志_04


Java log打印日志 打印jvm日志_局部变量_05


在上图的箭头处加上-XX:+PrintGCDetails这句话。于是,运行程序后,GC日志就可以打印出来了:

Java log打印日志 打印jvm日志_jvm_06


更多参数介绍如下:

Trace跟踪参数

1. XX:+PrintGCDetails
–打印GC详细信息

理解GC日志的含义:

例如下面这段日志:

Java log打印日志 打印jvm日志_Java log打印日志_07


[GC[DefNew: 4416K->0K(4928K), 0.0001897 secs] 4790K->374K(15872K), 0.0002232 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

上方日志的意思是说:这是一个新生代的GC。方括号内部的“4416K->0K(4928K)”含义是:“GC前该内存区域已使用容量->GC后该内存区域已使用容量(该内存区域总容量)”。而在方括号之外的“4790K->374K(15872K)”表示“GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆总容量)”。

再往后看,“0.0001897 secs”表示该内存区域GC所占用的时间,单位是秒。

2. XX:+PrintGCTimeStamps
–打印CG发生的时间戳
3.-Xloggc:log/gc.log
–指定GC log的位置,以文件输出
–帮助开发人员分析问题

4.-XX:+TraceClassLoading
–监控类的加载
5.-XX:+PrintClassHistogram
–按下Ctrl+Break后,打印类的信息:分别显示:序号、实例数量、总大小、类型

堆的分配参数

通过一张图来了解如何通过参数来控制各区域的内存大小

Java log打印日志 打印jvm日志_Java log打印日志_08

1.-Xmx –Xms
–指定最大堆和最小堆
2.-Xmn
–设置新生代大小
3.-XX:NewRatio
–新生代(eden+2s)和老年代(不包含永久区)的比值
–表示 新生代:老年代=1:4,即年轻代占堆的1/5
4.-XX:SurvivorRatio
–设置两个Survivor区和eden的比
–表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10
5.-XX:+HeapDumpOnOutOfMemoryError
–OOM时导出堆到文件
6.-XX:+HeapDumpPath
–导出OOM的路径
7.-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
– Vector v=new Vector();
– for(int i=0;i<25;i++)
– v.add(new byte[1
1024*1024]);

8.-XX:OnOutOfMemoryError
–在OOM时,执行一个脚本

总结:
1.根据实际事情调整新生代和幸存代的大小
2.官方推荐新生代占堆的3/8
3.幸存代占新生代的1/10
4.在OOM时,记得Dump出堆,确保可以排查现场问题

栈的分配参数

1.-Xss
–通常只有几百K
–决定了函数调用的深度
–每个线程都有独立的栈空间
–局部变量、参数 分配在栈上
注:栈空间是每个线程私有的区域。栈里面的主要内容是栈帧,而栈帧存放的是局部变量表,局部变量表的内容是:局部变量、参数。


小结

jvm的基本参数介绍到此,更多的参数学习更新中.

感谢您的阅读~~