JVM 参数分析
JVM参数分类
JVM参数分为标准参数和非标准参数:
标准参数:"-"开头的参数,如-client等;
非标准参数:"-X"和"-XX"开头的参数,如-Xmx等;
或者简单分为三类:"-"开头的参数、"-X"开头的参数、"-XX"开头的参数;
"-X"开头的参数是非标准参数,只能被部分VM识别,而不能被全部VM识别的参数;
"-XX"开头的参数是非稳定参数,随时可能被修改或者移除;
-XX参数的常见语法有:
-XX:+[PARAM], 开启该参数的功能,如-XX:+DisableExplicitGC,开启禁止显式GC
-XX:-[PARAM], 关闭该参数的功能,如-XX:-DisableExplicitGC,关闭禁止显示GC
-XX:PARAM=VALUE, 设置参数的值,如-XX:SurvivorRatio=80,设置eden/survivor的比值
常用标准参数
-agentlib:[=<选项>]:加载本地代理库,如-agentlib:hprof将加载hprof.dll或者hprof.so文件;
-agentpath:[=<选项>]:按完整路径名加载本机代理库;
-javaagent:[=<选项>]:加载 Java 编程语言代理,同agentlib和agentpath,只是前者是C/C++代理,而javaagent使用java语言编写的jar;
-classpath classpath:同-cp classpath,指定查找class的路径,多个路径window环境以分号分割,Linux以冒号分割;
-Dxx=value:设置系统参数,在代码中可以通过System.getProperty(xx)获取,如java -Denv=test Main.class;
-verbose:[class|gc|jni] <pid>:打印虚拟机运行信息,可以在程序启动时,做为参数传入,也可做为命令行使用;
常用内存参数
-Xmx[value] :设置堆内存最大值,如-Xmx1g或者-Xmx1024m;默认为物理内存的“1/4”;
-Xms[value] :设置堆内存最小值,一般和Xmx设置成一样;默认为物理内存的“1/64”;
-Xmn[value] :设置新生代大小;
-Xss[value]:设置栈空间大小;
-XX:SurvivorRatio=[value]:设置新生代Eden和Survivor划分比例;
-XX:PermSize=[value] :设置永久带初始大小,JDK8中已移除;
-XX:MaxPermSize=[value] :设置永久代最大值。JDK8中已移除;
-XX:MetaspaceSize=[value] :设置meta区大小。JDK8增加;
-XX:NewRatio=2:新生代内存容量与老生代内存容量的比例;
常用调试参数
-XX:+PrintFlagsInitial:显示JVM所有可设置的参数及它们的初始值;
-XX:+PrintFlagsFinal:显示JVM所有可设置的参数及它们修改后的值,=表示未修改,:=表示修改;
-XX:ErrorFile=[path] :生成error 文件的路径,当JVM发生致命错误导致崩溃时,会生成包含了导致 JVM crash 的重要信息的文件用于定位;
-XX:+HeapDumpOnOutOfMemoryError :OOM的时候dump出内存;
-XX:HeapDumpPath:dump文件位置;
-XX:+PrintGC :打印GC详情;
-XX:+PrintGCDetails :打印GC更详细的信息;
-Xloggc:[path] :设置gc日志位置;
-XX:+PrintHeapAtGC 每次一次GC前后,都打印堆信息;
查看运行时参数
通过jps 命令查看 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息;
jps:查看所有Java进程,显示进程id和启动类名称;
jps –l:显示进程id和启动类的全路径;
jps –m:显示进程id和传递给 Java 进程(main 方法)的参数;
jps –v:显示进程id和传递给 Java 虚拟机的参数;
通过jinfo命令查看JVM配置信息,包括命令行参数、系统变量,也可以用其来修改命令行参数;
Jinfo <pid>:查看进程所有虚拟机参数和系统参数;
Jinfo –flag <name> <pid>:查看进程指定参数,name指参数名称;
Jinfo -flag +<name><pid>:开启指定参数; (可使用jinfo动态设置GC参数无需重启)
Jinfo -flag -<name><pid>:关闭指定参数;
Jinfo -flag <name>=<value> <pid>:设置虚拟机参数(并不是每个参数都可以被动态修改的,不支持会抛异常);