JVM - 参数简介

JVM参数分类

JVM参数分为标准参数和非标准参数:

  • 标准参数: "-"开头的参数,如-client, -server
  • 非标准参数: "-X""-XX"开头的参数,如-Xmx, -XX:+DisableExplicitGC

或者简单分为三类:

  • "-"开头的参数
  • "-X"开头的参数
  • "-XX"开头的参数

标准参数("-"开头的参数)

-client

选择client模式的VM。客户端常使用

-server ※

选择server模式的VM。服务端常使用

-agentlib:libname[=options]

Loads native agent library libname, for example:

-agentlib:hprof
-agentlib:jdwp=help
-agentlib:hprof=help

See JVMTI Agent Command-Line Options at
http://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html#starting

-agentpath:pathname[=options]

Loads a native agent library by full pathname.

-classpath classpath

指定查找class的路径。
可以是文件夹(directories)、jar文件(jar files)或者zip文档(zip archives)。
Linux平台用冒号分隔

如:

java -classpath lib/*:test.jar:test2.jar Main.class

-cp classpath

-classpath,是其简写模式

-Dproperty=value

设置系统参数。在代码中可以通过System.getProperty(property)获取
如:

java -Denv=test Main.class

程序中可以通过System.getProperty("env")获得其值为"test"

-d32

在32位环境中运行程序。如果不支持32位环境,则报错。
如果使用的不是64位系统,则-d32是默认添加的

-d64

在64位环境中运行程序。如果不支持32位环境,则报错。

注:存在-server参数时,-d64是默认添加的

-jar

执行可执行jar包。
第一个参数是jar包名字,而非Main Class名字。

要使这个参数生效,要有一个前提,即manifest文件中需要有下面一行:

Main-Class: classname

一个manifest文件示例:

Manifest-Version: 1.0                                                                                                                                         
Implementation-Title: spring-boot-web-base
Implementation-Version: 1.0-SNAPSHOT
Built-By: michealyang
Implementation-Vendor-Id: com.michealyang
Spring-Boot-Version: 2.0.1.RELEASE
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.michealyang.webbase.Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_162-ea
Implementation-URL: http://maven.apache.org

-javaagent:jarpath[=options]

Loads a Java programming language agent. For more information about instrumenting Java applications, see the java.lang.instrument package description in the Java API documentation at http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html

-verbose

打印虚拟机运行信息

可以在程序启动时,做为参数传入。也可做为命令行使用

做为命令行使用的语法是:

java -verbose:[class|gc|jni] {pid}

verbose的冒号后面支持三个参数,即class, gc, jni

-verbose:class

打印加载的class信息

如:

java -verbose:class 12093

数据结果大致为:

[Opened /usr/local/jdk1.8.0_45/jre/lib/rt.jar]
[Loaded java.lang.Object from /usr/local/jdk1.8.0_45/jre/lib/rt.jar]
[Loaded java.io.Serializable from /usr/local/jdk1.8.0_45/jre/lib/rt.jar]
[Loaded java.lang.Comparable from /usr/local/jdk1.8.0_45/jre/lib/rt.jar]
[Loaded java.lang.CharSequence from /usr/local/jdk1.8.0_45/jre/lib/rt.jar]
[Loaded java.lang.String from /usr/local/jdk1.8.0_45/jre/lib/rt.jar]

-verbose:gc

在启动参数中加上-verbose:gc当发生gc时,可以打印出gc相关的信息;该信息不够高全面,等同于-XX:+PrintGC。其实只要设置-XX:+PrintGCDetails就会自动带上-verbose:gc-XX:+PrintGC

-verbose:jni

打印native方法或者其他native interface的调用信息

-version

打印java版本

java -version

结果为:
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)


"-X"开头的参数

"-X"开头的参数是非标准参数,也就是只能被部分VM识别,而不能被全部VM识别的参数。

官网解释:

Options that begin with -X are non-standard (not guaranteed to be supported on all VM implementations), and are subject to change without notice in subsequent releases of the JDK

关于"-X"的常见参数,见下面的按功能分类


"-XX"开头的参数

"-XX"开头的参数是非稳定参数,随时可能被修改或者移除。

官网解释:

Options that are specified with -XX are not stable and are subject to change without notice.

-XX参数的常见语法有:

  • -XX:+[PARAM], 开启该参数的功能,如-XX:+DisableExplicitGC,开启禁止显式GC
  • -XX:-[PARAM], 关闭该参数的功能,如-XX:-DisableExplicitGC,关闭禁止显示GC
  • -XX:PARAM=VALUE, 设置参数的值,如-XX:SurvivorRatio=80,设置eden/survivor的比值

关于"-XX"的常见参数,见下面的按功能分类


按功能分类

标记了的表示常用参数


内存参数

-Xmx[value] ※

设置堆内存最大值

-Xmx1g
或者
-Xmx1024m

-Xms[value] ※

设置堆内存最小值。一般与-Xmx设置一样大

-Xmx1g

-Xmn[value] ※

设置新生代大小

-Xmn256m

-Xss[value] ※

设置栈空间大小

-Xss128k

-XX:SurvivorRatio=[value] ※

新生代Eden和Survivor划分比例

-XX:SurvivorRatio=8

-XX:PermSize=[value] ※

设置永久代初始大小。JDK8中已移除

-XX:PermSize=128m

-XX:MaxPermSize=[value] ※

设置永久代最大值。JDK8中已移除

-XX:MaxPermSize=128m

-XX:MetaspaceSize=[value] ※

设置meta区大小。JDK8增加

-XX:MetaspaceSize=128m

-XX:MaxMetaspaceSize=[value] ※

设置永久代最大值。JDK8中已移除

-XX:MaxMetaspaceSize=128m

-XX:ReservedCodeCacheSize

用于设置Code Cache大小,JIT编译的代码都放在Code Cache中,若Code Cache空间不足则JIT无法继续编译,并且会去优化,比如编译执行改为解释执行,由此,性能会降低

-XX:ReservedCodeCacheSize=128m


行为相关参数

Behavioral Options,即影响VM基本行为的参数

-XX:-DisableExplicitGC ※


GC参数

-XX:-UseSerialGC

使用串行垃圾回收器回收新生代

-XX:+UseParNewGC ※

使用并行垃圾回收器回收新生代

-XX:ParallerGCThreads

当使用-XX:+UseParNewGC时,该参数设定GC的线程数,默认与CPU核数相同

-XX:-UseParallelGC

使用Parallel Scavenge垃圾回收器

-XX:UseParallelGC = “Parallel Scavenge” + “Serial Old”

-XX:-UseParallelOldGC

用并行垃圾回收器进行full gc

-XX:UseParallelOldGC = “Parallel Scavenge” + “Parallel Old”

-XX:-UseConcMarkSweepGC ※

使用CMS做为垃圾回收器

注:当前常见的垃圾回收器组合是下面这种:

-XX:+UseConcMarkSweepGC -XX:+UseParNewGC

-Xloggc:[path] ※

设置gc日志位置

-Xloggc:/opt/logs/mobile/admin.gc.log

-XX:+PrintGC ※

打印GC详情

输出形式:

[GC 118250K->113543K(130112K), 0.0094143 secs]
[Full GC 121376K->10414K(130112K), 0.0650971 secs]

-XX:+PrintGCDetails ※

打印GC更详细的信息

输出形式:

[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]


G1参数

Garbage First Garbage Collection Options

-XX:+UseG1GC

使用G1做为垃圾回收器

-XX:MaxGCPauseMillis=n

Sets a target for the maximum GC pause time. This is a soft goal, and the JVM will make its best effort to achieve it.

-XX:InitiatingHeapOccupancyPercent=n

Percentage of the (entire) heap occupancy to start a concurrent GC cycle. It is used by GCs that trigger a concurrent GC cycle based on the occupancy of the entire heap, not just one of the generations (e.g., G1). A value of 0 denotes 'do constant GC cycles'. The default value is 45.

-XX:NewRatio=n

old区/new区的比例,默认为2

-XX:SurvivorRatio=n

eden/survivor的比值,默认为8.

-XX:MaxTenuringThreshold=n

Maximum value for tenuring threshold. The default value is 15.

-XX:ParallelGCThreads=n

Sets the number of threads used during parallel phases of the garbage collectors. The default value varies with the platform on which the JVM is running.

-XX:ConcGCThreads=n

Number of threads concurrent garbage collectors will use. The default value varies with the platform on which the JVM is running.

-XX:G1ReservePercent=n

Sets the amount of heap that is reserved as a false ceiling to reduce the possibility of promotion failure. The default value is 10.

-XX:G1HeapRegionSize=n

With G1 the Java heap is subdivided into uniformly sized regions. This sets the size of the individual sub-divisions. The default value of this parameter is determined ergonomically based upon heap size. The minimum value is 1Mb and the maximum value is 32Mb.


CMS参数

-XX:-UseConcMarkSweepGC ※

使用CMS做为垃圾回收器

性能相关参数

Performance Options

-XX:+AggressiveOpts

Turn on point performance compiler optimizations that are expected to be default in upcoming releases. (Introduced in 5.0 update 6.)

-XX:+UseLargePages

Use large page memory. (Introduced in 5.0 update 5.) For details, see Java Support for Large Memory Pages.

-XX:+OptimizeStringConcat

Optimize String concatenation operations where possible. (Introduced in Java 6 Update 20)


debug相关参数

Debugging Options

-XX:+PrintFlagsInitial

显示JVM所有可设置的参数及它们的值

-XX:+PrintFlagsFinal

显示所有可设置的参数及它们的值

可以设置的参数默认是不包括diagnostic或experimental系的。要在-XX:+PrintFlagsFinal的输出里看到这两种参数的信息,分别需要显式指定-XX:+UnlockDiagnosticVMOptions-XX:+UnlockExperimentalVMOptions

语法:

java -PrintFlagsFinal -version {id}

添加-version是防止被理解成启动java程序

输出示例:


image.png

-XX:ErrorFile=[path] ※

生成error 文件的路径

-XX:ErrorFile=/opt/logs/mobile/admin.error

-XX:+ShowMessageBoxOnError

当jvm crash的时候在linux里会启动gdb 去分析和调式,适合在测试环境中使用

-XX:+HeapDumpOnOutOfMemoryError ※

OOM的时候dump出内存。

-XX:HeapDumpPath

dump文件位置

Q & A

Q: -Xss和-XX:ThreadStackSize有啥区别?
A: 本质上是没有区别的。-Xss是在HotSpot出现之前就存在的,而-XX:ThreadStackSize是HotSpot的内置参数。也就是说-Xss适用于很多VM,包括HotSpot,而-XX:ThreadStackSize只适用于HotSpot。
另外,使用jinfo的时候,应该使用ThreadStackSize:

jinfo -float ThreadStackSize [pid]

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350