1.部分常用调优参数
-Xms8m 堆内存最小值
-Xmx8m 堆内存最大值
-XX:+PrintGCDetails 控制台打印GC信息
-XX:+HeapDumpOnOutOfMemoryError 出现内存溢出时生成dump文件
-Xmn20M 表示设置年轻代的大小为20M
-XX:MaxTenuringThreshold=15 表示对象年龄大于15,自动进入老年代
-XX:+PrintGC 表示在控制台上打印出GC信息
-XX:SurvivorRatio=8 表示设置2个Survivor区:1个Eden区的大小比值为2:8,这意味着Survivor区占整个年轻代的1/5,这个参数默认为8
-XX:NewRatio=4 表示设置年轻代:老年代的大小比值为1:4,这意味着年轻代占整个堆的1/5
-Xnoclassgc 表示关闭JVM对类的垃圾回收
-XX:MaxPermSize=10M 表示JVM允许分配的永久代的最大容量,必须以M为单位,大部分情况下这个参数默认为64M
-XX:PermSize=10M 表示JVM初始分配的永久代的容量,必须以M为单位
-Xss128k 表示可以设置虚拟机栈的大小为128k
-verbose:gc 表示输出虚拟机中GC的详细情况
2.设置jvm参数
配置项目的启动参数
-Xms8m 设置堆内存最小值,
-Xmx8m 设置堆内存最大值,
-XX:+PrintGCDetails 控制台打印GC详细信息
-XX:+HeapDumpOnOutOfMemoryError 如果发生oom输出dump文件
这里将堆内存设置小一些,以便更快的发生OOM,生成dump文件进行定位分析
内存溢出代码:
public static void main(String[] args) {
String s = "21412512321312371783";
for(;;){
s+=s;
}
}
控制台输出堆信息以及GC信息
发生了OOM,jvm会将在项目的src同级目录下生成dump文件
使用Jprofiles分析dump文件,前提是自己安装了jprofiles工具
安装之后,可以双击此dump文件打开分析界面,打开界面如下
选中线程dump可以定位到具体发生OOM的代码
选中main是因为我们使用的是一个main方法进行测试的,main方法开启了一个线程,而这个线程发生了OOM.
3.JVM调优的原则
1、性能定义
要查找和评估器性能瓶颈,首先要知道性能定义,对于jvm调优来说,我们需要知道以下三个定义属性,依作为评估基础:
- 吞吐量:重要指标之一,是指不考虑垃圾收集引起的停顿时间或内存消耗,垃圾收集器能支撑应用达到的最高性能指标。
- 延迟:其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集所引起的停顿,避免应用运行时发生抖动。
- 内存占用:垃圾收集器流畅运行所需要 的内存数量。
这三个属性中,其中一个任何一个属性性能的提高,几乎都是以另外一个或者两个属性性能的损失作代价,不可兼得,具体某一个属性或者两个属性的性能对应用来说比较重要,要基于应用的业务需求来确定。
2、性能调优原则
在调优过程中,我们应该谨记以下3个原则,以便帮助我们更轻松的完成垃圾收集的调优,从而达到应用程序的性能要求。
1. MinorGC回收原则: 每次minor GC 都要尽可能多的收集垃圾对象。以减少应用程序发生Full GC的频率。
2. GC内存最大化原则:处理吞吐量和延迟问题时候,垃圾处理器能使用的内存越大,垃圾收集的效果越好,应用程序也会越来越流畅。
3. GC调优3选2原则: 在性能属性里面,吞吐量、延迟、内存占用,我们只能选择其中两个进行调优,不可三者兼得。