1:参数类型
1:标准参数
-help
-server –client
-version –showversion
2:X参数
非标准化参数(用的不多)
-Xint:解释执行
-Xcomp:第一次使用就编译成本地代码(会导致第一次运行速度比较慢)
-Xmixed:混合模式,JVM自己来决定是否编译成本地代码
3:XX参数
非标准化参数,主要用于JVM调优和Debug
Boolean类型
格式:-XX:[+-]<name>表示启用或禁用name属性
比如:-XX:+UseConcMarkSweepGC
-XX:+UseG1GC
非Boolean类型
格式:-XX:<name>=<value>表示name属性的值是value
比如:-XX:MaxGCPauseMillis=500
注意:
-Xmx和-Xms
不是X参数,而是XX参数
-Xms等价于-XX:InitialHeapSize
-Xmx等价于-XX:MaxHeapSize
2:JVM常用内存调优命令
JVM在内存调优方面,提供了几个常用的命令,分别为jps,jinfo,jstack,jmap以及jstat命令。分别介绍如下:
jps:主要用来输出JVM中运行的进程状态信息,一般使用jps命令来查看进程的状态信息,包括JVM启动参数等。
jinfo:主要用来观察进程运行环境参数等信息。
jstat:进行实时命令行的监控,包括堆信息以及实时GC信息等。可以使用jstat -gcutil pid1000来每隔一秒来查看当前的GC信息。
jstack:主要用来查看某个Java进程内的线程堆栈信息。jstack pid 可以看到当前进程中各个线程的状态信息,包括其持有的锁和等待的锁。
jmap:用来查看堆内存使用状况。jmap -heap pid可以看到当前进程的堆信息和使用的GC收集器,包括年轻代和老年代的大小分配等
使用命令
启动tomcat,在任务管理器中查看进程PID或是用jsp -l查看
1:提供的一个查看当前java进程的小工具
jps -l
2:查看tomcat进程占用内存大小
jinfo -flag MaxHeapSize 53692
3: 查看垃圾回收器
jinfo -flag UseG1GC 53692
4:查看虚拟机统计信息
jstat -class 2099 1000 10
1000表示1000毫秒,10表示输出10次
Loaded:表示加载类的个数
Unloaded:表示卸载类的个数
Time:用在加载和卸载类所用的时间
参数的具体含义可以查看官网
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/
5:垃圾收集
jstat -gc 53692 1000 3
JVM的内存可以分为堆内存和非堆内存。堆内存分为年轻代和老年代。年轻代又可以进一步划分为一个Eden(伊甸)区和两个Survivor(幸存)区组成。如下图所示:
非堆区在JDK8中叫Metaspace,CCS是压缩类空间
输出的具体含义
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE
3:JVM优化
1:GC 调优目的
将转移到老年代的对象数量降低到最小;减少 GC 的执行时间。
2:GC 调优策略
策略 1:将新对象预留在新生代,由于 Full GC 的成本远高于 Minor GC,因此尽可能将对象分配在新生代是明智的做法,实际项目中根据 GC 日志分析新生代空间大小分配是否合理,适当通过“-Xmn”命令调节新生代大小,最大限度降低新对象直接进入老年代的情况。
策略 2:大对象进入老年代,虽然大部分情况下,将对象分配在新生代是合理的。但是对于大对象这种做法却值得商榷,大对象如果首次在新生代分配可能会出现空间不足导致很多年龄不够的小对象被分配的老年代,破坏新生代的对象结构,可能会出现频繁的 full gc。因此,对于大对象,可以设置直接进入老年代(当然短命的大对象对于垃圾回收来说简直就是噩梦)。-XX:PretenureSizeThreshold 可以设置直接进入老年代的对象大小。
策略 3:合理设置进入老年代对象的年龄,-XX:MaxTenuringThreshold 设置对象进入老年代的年龄大小,减少老年代的内存占用,降低 full gc 发生的频率。
策略 4:设置稳定的堆大小,堆大小设置有两个参数:-Xms 初始化堆大小,-Xmx 最大堆大小。
3:GC 优化的一般步骤
1. 评估现状及设定目标。评估是否需要调优及调优的目标优先级。比如说降低 Full GC 的的执行时间,降低 Young GC 的执行时间等;
2. 调优。根据 gc 日志等找到优化空间,比如说 Full GC 执行时间太长可能是因为老年代太大了,看能否调整为并行 GC 或者增加并行 GC 的线程数或者减少老年代大小等;
3. 评估效果。根据 gc 日志、jstat 等命令、Mat/Visual VM 等工具来监控调优效果;
4. 细微调整。 根据评估效果来进一步调整相关参数。