一、JVM运行时参数
1. JVM参数选项参数
A. 标准参数选项:比较稳定,后续版本基本不会变化,以"-"开头,如"-server";
B. -X参数选项:非标准化参数,比较稳定,但后续版本可能变更,以"-X"开头,如"-Xmx";
C. -XX参数选项:非标准化参数,是使用最多的参数类型,不稳定,以"-XX"开头,主要用于开发和调试JVM,如"-XX:PrintGCDetails";
Boolean类型:-XX:+<option>表示启用option属性,-XX:-<option>表示禁用option属性;
key-value类型:又分-XX:<option>=<number>类型和-XX:<name>=<string>类型;
2. 堆内存常见JVM参数
A. -Xms<size>:表示Java堆区的起始内存大小,与"-XX:InitialHeapSize"等价,默认值为物理内存的1/64,通常将"-Xms"和"-Xmx"设置为相同的值,避免动态扩容带来的震荡问题;
B. -Xmx<size>:表示Java堆区的最大内存大小,与"-XX:MaxHeapSize"等价,默认值为物理内存的1/4;
C. -Xmn<size>:表示新生代空间的大小,这个与"-XX:NewRatio"有相同作用,官方推荐配置为整个堆大小的1/3,相当于同时配置-XX:NewSize和 -XX:MaxNewSize参数值;
D. -XX:NewSize=size:表示新生代初始值大小;
E. -XX:MaxNewSize=size:表示新生代最大值大小;
F. -XX:SurvivorRatio=size:表示新生代中Eden区和Survivor区的比例,默认值为8,实际值为6,关闭自适应机制后还是6,如果要为8,必须显示设置;
G. -XX:-UserAdaptiveSizePolicy:表示关闭自适应的各区域大小比例;
H. -XX:NewRatio=size:表示老年代和新生代的空间比值,默认值为2,即新生代占整个堆的1/3;
I. -XX:PretenureSizeThreadshold=size:表示让大于此值的对象直接分配在老年代,单位为字节,只对Serial、ParNew收集器有效;
J. -XX:MaxTenuringThreadshold=size:表示年轻代每次Minor GC后,还存活的对象年龄+1,当对象的年龄大于设置的值时就进入老年代,默认值15;
K. -XX:+PrintTenuringDistribution:表示让JVM在每次MinorGC后打印出当前使用的Survivor中对象的年龄分布;
L. -XX:TargetSurvivorRatio=size:表示MinorGC结束后Survivor区域中占用空间的期望比例;
M. -XX:+HeapDumpOnOutMemoryError:表示在内存出现OOM的时候,把Heap转存Dump到文件以便后续分析;
N. -XX:+HeapDumpBeforeFullError:表示在出现FullGC之前,生成Heap转储文件;
O. -XX:HeapDumpPath=path:指定Heap转存文件的存储路径;
P. -XX:OnOutOfMemoryError=sh:指定一个可行性程序或者脚本的路径,当发生OOM的时候,去执行这个脚本;
3. GC垃圾常见JVM参数
A. -XX:+UseSerialGC:表示新生代使用Serial串行收集器和老年代使用Serial Old串行收集器;
B. -XX:+UseParNewGC:仅表示年轻代使用ParNew并行收集器;
C. -XX:ParallelGCThreads=N:限制年轻代回收线程数量,默认开启和CPU数据相同的线程数;
D. -XX:+UseParallelGC:新生代使用Parallel并行收集器,JDK8默认开启;
E. -XX:+UseParallelOldGC:老年代使用Parallel Old并行收集器,JDK8默认开启;
F. -XX:GCTimeRatio=N:垃圾收集时间占总时间的比例,用来衡量吞吐量的大小;
G. -XX:+UseConcMarkSweepGC:使用CMS收集器执行内存回收任务;
H. -XX:ParallelCMSThreads=N:设置CMS的线程数量;
I. -XX:+UserG1GC:使用G1收集器执行内存回收任务;
J.-XX:MaxGCPauseMills=time:设置垃圾回收器期望达到的最大停顿时间(STW),但不能保证达到,默认为200ms,不要轻易改;
K. -XX:+PrintGCDetails:在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况;
L. -XX:+PrintHeapAtGC:梅一次GC前和GC后,都打印堆信息;
M. -Xloggc:file:把GC日志写入到每一个文件中去,而不是打印到标准输出中;
N. -XX:CMSlnitiatingOccupanyFration=n:设置堆内存使用率阈值;
O. -XX:+UseCMSComapctAtFullCollection:用于指定在执行完FullGC后对内存空间进行压缩整理;
P. -XX:CMSFullGCsBeforeCompaction=N:设置在执行多少次Full GC后对内存空间进行压缩整理;
二、查看命令
1. jps(ava Process Status):查看正在运行的java进程;
A. 语法:jps [options] [hostid],如jps -v代表显示JVM启动时参数;
2. jstat:查看堆内存各部分的使用量,以及加载类的梳理;
A. 语法:jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数];
B. 示例: jstat -gc pid:查看pid进程的GC情况;
3. jinfo:实时查看和修改JVM配置参数;
A. jinfo -flag NewRation pid:查看pid进程的新生代的比例;
4. jmap:生成Java虚拟机的堆转储快照dump文件,可以查看finalize执行队列、Java堆和方法去的详细信息;
A. 语法:jmap [option] pid,option选项如下
-dump:<dump-options>:以hprof二进制格式转储java堆;
-heap:打印java堆摘要;
B. 示例:jmap -dump:live,format=b,file=/rhxy/heap.hprof 1,生成java虚拟机的堆转储快照dump文件;
C. 使用场景:定位内存溢出原因;
D. 在线分析内存工具:HeapHero;
5. jhat:JDK自带堆分析工具;
6. jstack:主要用来查看某个Java进程内的线程堆栈信息,根据堆栈信息可以定位到具体代码;
A. 语法:jstack [option] pid,option选项如下
-l:长清单,打印关于锁的额外信息;
B. 示例:jstack -l 1,用来查看进程1的堆栈信息;
C. 使用场景:JVM中定位最耗费CPU的线程。
三、GUC界面
1. Jvivusal VM:
A.
2.
3.