在实际生产环境当中,服务器资源有限,有时多个应用会存放到一台服务器资源上,务必会造成资源紧张,每一个应用都必须合理使用资源,防止某一个应用的异常导致其他相关应用的不可用造成生产故障。那么JAVA程序首当其冲,需要调整JVM参数使其达到相对合理的配比。
一、JVM基础知识简单回顾
1、程序的运行需要把.java文件编译成虚拟机可识别的.class。
2、jvm加载器加载class文件进行解析(类加载子系统经过加载-链接-初始化),变成运行时数据区.此处不在展开具体class文件内容和具体的解析过程。
3、在Java虚拟机规范中,定义了五种运行时数据区,分别是Java 堆、方法区、虚拟机栈、本地方法区、程序计数器。特别注意的是堆和方法区是线程共享的,其他都是线程私有的。
4、当所有Java类加载使用过程中,所有的数据都会在堆栈中创建和使用,当对象过多,就要合理的使用垃圾回收算法,合理的设置堆栈的大小,以达到应用的正常运行。
二、实战调优案例
在生产环境中应用服务器内存近满,需要排查哪个服务的内存占用最多。并做合理调优。
1、使用top命令,查看MEM占用率
2、使用JPS -lm 查看对应的进程,找到对应占用最高的java应用。
3、观察其JVM内存回收情况
发现JVM minorGC回收频繁,年轻代只使用了 EDON区,S1、S0 区未被启用。大多数对象无法存活到第二次垃圾回收,更加有一部分进入到老年代无法撑过一次FULL GC。
4、查看reception 的option 配置,发现使用的GC 为UseParallelOldGC 并行回收,标记整理算法。并且堆内存设置为固定4G,这就导致垃圾回收无法归还物理内存。
5、观察后提出修改建议,
1)、 固定堆内存设置变小。
2)、启用年轻代 S1 S0,并且设置进入老年代次数为默认,适量调整EDON区大小