JVM调优的目的:
- 一防止出现OOM
- 较少 Full GC出现的频率
生产环境发生OOM,该如何处理,如何判断是否内存泄露导致:
- 首先查看服务器负载情况 CUP load gc是否频繁
- 使用命令工具进行分析:jstack,jmap等,也可以使用 arthas查看jvm状态信息
- 优化代码:针对出现问题的代码进行优化
- 优化jvm参数:包含堆栈大小,gc垃圾回收算法等 常用的cms:并发标记清除 算法:该算法不会进行内存整理,很容易造成内存碎片。
但是该算法主要是为了减少STW
垃圾回收算法:
1、标记清除:分为两个阶段:标记、清除, 首先,gc会从根root开始标记对象,如果没有引用的对象,会在清除阶段进行回收,这种算法适合于内存对象比较多的情况,适合于老年代 缺点:因为仅仅是标志,没有对内存进行整理,造成内存碎片,针对内存空间,扫描了两次,第一次是对对象进行标记,第二次是对为标志的对象进行回收
2、复制算法:从根节点标记存活的对象,把存活的对象复制到另外一块内存,然后再回收之前的内存。 这种算法,适合内存对象较少的情况,内存扫描了一次(既标志,马上复制),适合于年轻代 缺点:需要额外的一块内存
3、标记-压缩算法:从根节点标记存活对象,然后把这些对象压缩到内存的另外一侧,然后清除边界外的内存,这种回收算法一般是出于老年代,避免了内存碎片
4、分代收集算法:在不同年代,使用不同的垃圾回收算法,新生代存活率低,可以使用复制算法。而老年代对象存活率搞,没有额外空间对它进行分配担保,所以只能使用标记清除或者标记整理算法
调优参数如下:
JVM参数设置为:
-Xms4096m //最大堆设置
-Xmx4096m //最小堆设置
-XX:+UseG1GC //使用G1垃圾收集器
-XX:MaxGCPauseMillis=20 //最大GC停顿时间,默认是200ms,这里设置20ms
-XX:+PrintGCDetails //打印GC详情日志
-XX:+PrintStringTableStatistics //打印字符串常量、引用常量统计
-XX:+PrintSafepointStatistics //打印停顿原因
-XX:+PrintGCApplicationStoppedTime //停顿时间输出到GC日志中