目录

JVM调优-Java命令选项参数-大全详解

JVM调优–Java命令选项(参数)–大全/详解

原文网址:

简介

说明

本文介绍Java的java命令用法,包括:常用用法、选项大全。

Java选项

Java是通过java虚拟机来装载和执行编译文件(class文件)的,java虚拟机通过命令java -option 来启动,-option为虚拟机参数,通过这些参数可对虚拟机的运行状态进行调整。

官网

官网文档:

格式

java [-options] classname [args…]          (执行类)

java [-options] -jar filename [args…]       (执行 jar 文件)

java -XX:+PrintFlagsFinal -version       (查看默认配置)

  • options 是可选项,选项之间使用空格分割
  • classname 是要加载的类的名字
  • filename 是要执行的 java 压缩文件(JAR)的名字,需要和 -jar 搭配使用
  • args 是传递给 main() 方法的参数,使用空格分割

该选项的书写形式分为两大类:

  1. Boolean类型
    1. 格式:-XX:[+-] 表示启用或者禁用name属性。
    2. 例子:-XX:+UseG1GC(表示启用G1垃圾收集器)
  2. Key-Value类型
    1. 格式:-XX:= 表示name的属性值为value。
    2. 例子:-XX:MaxGCPauseMillis=500(表示设置GC的最大停顿时间是500ms)

示例

java -X

选项

java的命令行选项分为三类:

  1. 标准选项(-)。jvm必须实现的选项,实现通用的功能,如检查运行环境,检查JRE的版本,设置类路径等。此类选项前缀为:-
  2. 扩展选项(-X)。HotSpot虚拟机实现常用功能的选项,其他jvm不一定实现。此类选项前缀为:-X
  3. 高级选项(-XX)。高级选项是开发者选项,不保证在所有的jvm上实现,并可能会改变。此类选项前缀为:-XX
    1. 高级选项分为如下四种类型:
      1. 高级运行时选项:控制jvm运行时的行为
      2. 高级维护性选项:支持收集系统信息和调试
      3. 高级GC选项:控制jvm的垃圾收集行为
      4. 高级JIT选项:控制jvm的及时编译行为

常用操作

作用命令说明
查看所有参数java -XX:+PrintFlagsFinal -version会输出所有配置,超级详细
查看已经设置过的参数java -XX:+PrintCommandLineFlags只会输出设置过的,默认的并不会输出。
内存溢出时打印到文件java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./-XX:+HeapDumpOnOutOfMemoryError:JVM遇到OOM时能输出堆内信息 -XX:+HeapDumpPath:设置堆内存溢出快照输出的文件地址。
OOM后,执行一个脚本java -XX:OnOutOfMemoryError=“C:\Program Files\Java\jdk1.8.0_152\bin\jconsole.exe”发生OOM后,运行jconsole.exe程序。这里可以不用加“”,因为jconsole.exe路径Program Files含有空格。 利用这个参数,我们可以在系统OOM后,自定义一个脚本,可以用来发送邮件告警信息,可以用来重启系统等等。
FullGC之前打印java -XX:+HeapDumpBeforeFullGC
打印GC简单信息java -verbose:gc 或:java -XX:+PrintGC结果示例: ​ 第一行,表示GC回收之前有12195K的内存,回收之后剩余1088K,总共内存为125951K
打印详细GC信息java -XX:+PrintGCDetails 或java -XX:+PrintGCTimeStamps结果示例:
指定GC日志以文件输出java -Xloggc:./gc.log将gc日志以文件的形式输出,更方便我们去查看日志,定位问题。

一、标准选项

标准选项含义
-d32使用 32 位数据模型 (如果可用)
-d64使用 64 位数据模型 (如果可用)
-server选择 “server” VM
-hotspot是 “server” VM 的同义词 [已过时]。默认 VM 是 server.
-cp <目录和 zip/jar 文件的类搜索路径> 或:-classpath <目录和 zip/jar 文件的类搜索路径>用 ; 分隔的目录, JAR 档案和 ZIP 档案列表, 用于搜索类文件。
-D=设置系统属性
-verbose[:classgc
-version输出产品版本并退出
-version:需要指定的版本才能运行
-showversion输出产品版本并继续
-jre-restrict-search-no-jre-restrict-search
-? -help输出此帮助消息
-X输出非标准选项的帮助
-ea[::] -enableassertions[:
-da[::] -disableassertions[:
-esa-enablesystemassertions
-dsa-disablesystemassertions
-agentlib:[=]加载本机代理库 , 例如 -agentlib:hprof
-agentpath:[=]按完整路径名加载本机代理库
-javaagent:[=]加载 Java 代理。-javaagent 这个参数的个数是不限的,如果指定了多个,则会按指定的先后执行,执行完各个 agent 后,才会执行主程序的 main 方法。
-splash:使用指定的图像显示启动屏幕

1. -classpath,-cp

虚拟机在运行一个类时,需要将其装入内存,虚拟机搜索类的方式和顺序如下:

Bootstrap classes,Extension classes,User classes。

Bootstrap 中的路径是虚拟机自带的jar或zip文件,虚拟机首先搜索这些包文件,用System.getProperty(“sun.boot.class.path”)可得到虚拟机搜索的包名。

Extension是位于jre"lib"ext目录下的jar文件,虚拟机在搜索完Bootstrap后就搜索该目录下的jar文件。用System. getProperty(“java.ext.dirs”)可得到虚拟机使用Extension搜索路径。

User classes搜索顺序为当前目录、环境变量 CLASSPATH、-classpath。

-cp 和 -classpath 是同义词,参数意义是一样的。classpath参数太长了,所以提供cp作为缩写形式,它们用于告知虚拟机搜索目录名、jar文档名、zip文档名,之间用分号;分隔。

例如当你自己开发了公共类并包装成一个common.jar包,在使用 common.jar中的类时,就需要用-classpath common.jar 告诉虚拟机从common.jar中查找该类,否则虚拟机就会抛出java.lang.NoClassDefFoundError异常,表明未找到类定义。

在运行时可用System.getProperty(“java.class.path”)得到虚拟机查找类的路径。

使用-classpath后虚拟机将不再使用CLASSPATH中的类搜索路径,如果-classpath和CLASSPATH都没有设置,则虚拟机使用当前路径(.)作为类搜索路径。

推荐使用-classpath来定义虚拟机要搜索的类路径,而不要使用环境变量 CLASSPATH的搜索路径,以减少多个项目同时使用CLASSPATH时存在的潜在冲突。

例如应用1要使用a1.0.jar中的类G,应用2要使用 a2.0.jar中的类G,a2.0.jar是a1.0.jar的升级包,当a1.0.jar,a2.0.jar都在CLASSPATH中,虚拟机搜索到第一个包中的类G时就停止搜索,

如果应用1应用2的虚拟机都从CLASSPATH中搜索,就会有一个应用得不到正确版本的类G。

实例1 :java -classpath lib\Launcher.jar com.teleca.robin.Launcher getProcessState.bat 5000

实例2 :java -classpath classes com.teleca.robin.Launcher getProcessState.bat 5000

如果需要指定各个JAR文件具体的存放路径,相同路径有多个可使用通配符。

示例1 :java -cp .;c:\classes\myClass.jar;d:\classes*.jar packname.mainclassname

实例3 :java -cp lib*.jar com.teleca.robin.Launcher getProcessState.bat 5000

实例3-1: java -cp Util.jar ; lib\sqljdbc.jar com.harry.j2se.AppEntrance

2.-D=value

在虚拟机的系统属性中设置属性名/值对,运行在此虚拟机之上的应用程序可用System.getProperty(“propertyName”)得到value的值。

如果value中有空格,则需要用双引号将该值括起来,如-Dname=”space string”。

该参数通常用于设置系统级全局变量值,如配置文件路径,应为该属性在程序中任何地方都可访问。

示例1 :设置虚拟机使用的Extension搜索路径:java -Djava.ext.dirs=lib MyClass

3. -client,-server

这两个参数用于设置虚拟机使用何种运行模式,client模式启动比较快,但运行时性能和内存管理效率不如server模式,通常用于客户端应用程序。相反,server模式启动比client慢,但可获得更高的运行性能。

在windows上,缺省的虚拟机类型为client模式,如果要使用 server模式,就需要在启动虚拟机时加-server参数,以获得更高性能,对服务器端应用,推荐采用server模式,尤其是多个CPU的系统。在 Linux,Solaris上缺省采用server模式。

4. -hotspot

含义与client相同,jdk1.4以前使用的参数,jdk1.4开始不再使用,代之以client。

5. -verbose[:class|gc|jni]

在输出设备上显示虚拟机运行信息。

verbose和verbose:class含义相同,输出虚拟机装入的类的信息,显示的信息格式如下:

[Loaded java.io.FilePermission$1 from shared objects file]

当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。

6. -verbose:gc

在虚拟机发生内存回收时在输出设备显示信息,格式如下:

[Full GC 268K->168K(1984K), 0.0187390 secs]

该参数用来监视虚拟机内存回收的情况。

7.-verbose:jni

在虚拟机调用native方法时输出设备显示信息,格式如下:

[Dynamic-linking native method HelloNative.sum … JNI]

该参数用来监视虚拟机调用本地方法的情况,在发生jni错误时可为诊断提供便利。

9.-version

显示可运行的虚拟机版本信息然后退出。一台机器上装有不同版本的JDK时

10.-showversion

显示版本信息以及帮助信息。

11.-ea[:…|:]-enableassertions[:…|:]

从JDK1.4开始,java可支持断言机制,用于诊断运行时问题。通常在测试阶段使断言有效,在正式运行时不需要运行断言。断言后的表达式的值是一个逻辑值,为true时断言不运行,为false时断言运行,抛出java.lang.AssertionError错误。

上述参数就用来设置虚拟机是否启动断言机制,缺省时虚拟机关闭断言机制,用-ea 可打开断言机制,不加和classname时运行所有包和类中的断言,如果希望只运行某些包或类中的断言,可将包名或类名加到-ea之后。例如要启动包com.foo.util中的断言,可用命令 ea:com.foo.util 。

:ea是enableassertions的缩写

12 . -da[:…|:] 和- disableassertions[:…|:]

用来设置虚拟机关闭断言处理,packagename和classname的使用方法和-ea相同。

:da应该是disableassertions的缩写

13 . -esa-enablesystemassertions

设置虚拟机显示系统类的断言。

:esa是enablesystemassertions的缩写

14.-dsa-disablesystemassertions

设置虚拟机关闭系统类的断言。

:dsa是disablesystemassertions的缩写

15.-agentlib:[=]

该参数是JDK5新引入的,用于虚拟机装载本地代理库。

Libname为本地代理库文件名,虚拟机的搜索路径为环境变量PATH中的路径,options为传给本地库启动时的参数,多个参数之间用逗号分隔。在Windows平台上虚拟机搜索本地库名为libname.dll的文件,在Unix上虚拟机搜索本地库名为libname.so的文件,搜索路径环境变量在不同系统上有所不同,Linux、SunOS、IRIX上为LD_LIBRARY_PATH,AIX上为LIBPATH,HP-UX上为SHLIB_PATH。

例如可使用-agentlib:hprof来获取虚拟机的运行情况,包括CPU、内存、线程等的运行数据,并可输出到指定文件中,可用-agentlib:hprof=help来得到使用帮助列表。在jre"bin目录下可发现hprof.dll文件。

17. -agentpath:[=]

设置虚拟机按全路径装载本地库,不再搜索PATH中的路径。其他功能和agentlib相同。

18.-javaagent:[=]

虚拟机启动时装入java语言设备代理。Jarpath文件中的mainfest 文件必须有Agent-Class属性。代理类要实现public static void premain(String agentArgs, Instrumentation inst)方法。当虚拟机初始化时,将按代理类的说明顺序调用premain方法。

二、扩展选项

上边是文章的部分内容,为便于维护,全文已转移到此网址: