1、根据需求进行JVM的规划和预调优。
吞吐量、及时响应的需求不同使用不同的垃圾回收器。
2、优化正在运行中的jvm(慢,卡顿)
3、解决jvm运行中的各种问题,oom等。
调优JVM其实就是在理解JVM内存结构以及各种垃圾收集器前提下,结合自己的现有的业务来调整参数,使自己的应用能够正常稳定运行。
一般调优JVM我们认为会有几种指标可以参考:『吞吐量』、『停顿时间』和『垃圾回收频率』。
基于这些指标,我们就有可能需要调整:
- 内存区域大小以及相关策略
比如:整块堆内存占多少、新生代占多少、老年代占多少、Survivor占多少、晋升老年代的条件等等
比如:-Xmx:设置堆的最大值、-Xms:设置堆的初始值、-Xmn:表示年轻代的大小、-XX:SurvivorRatio:伊甸区和幸存区的比例等等
按经验来说:IO密集型的可以稍微把「年轻代」空间加大些,因为大多数对象都是在年轻代就会灭亡。内存计算密集型的可以稍微把「老年代」空间加大些,对象存活时间会更长些 - 垃圾回收器
选择合适的垃圾回收器,以及各个垃圾回收器的各种调优参数
比如:-XX:+UseG1GC:指定 JVM 使用的垃圾回收器为 G1、-XX:MaxGCPauseMillis:设置目标停顿时间、-XX:InitiatingHeapOccupancyPercent:当整个堆内存使用达到一定比例,全局并发标记阶段 就会被启动等等
没错,这些都是因地制宜,具体问题具体分析(前提是得懂JVM的各种基础知识,基础知识都不懂,谈何调优),没错,这些都是因地制宜,具体问题具体分析(前提是得懂JVM的各种基础知识,基础知识都不懂,谈何调优)
一般我们是「遇到问题」之后才进行调优的,而遇到问题后需要利用各种的「工具」进行排查
- 通过jps命令查看Java进程「基础」信息(进程号、主类)。这个命令很常用的就是用来看当前服务器有多少Java进程在运行,它们的进程号和加载主类是啥
- 通过jstat命令查看Java进程「统计类」相关的信息(类加载、编译相关信息统计,各个内存区域GC概况和统计)。这个命令很常用于看GC的情况