JVM参数简介

1. JVM参数分类

  • 标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
  • 非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
  • 非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用,一般JVM调优使用的即此类参数。

2. 标准参数(-)

比如-version、-help等,几乎所有的JDK版本都不会改变。下面再列举几个常见的标准参数:

  • -client
    设置JVM使用client模式,常用于客户端应用程序或者调试。其特点为启动速度快,但是运行时性能和内存效率不高。

  • -server
    设置JVM使用server模式,一般线上应用都使用此模式,在具有64位能力的jdk环境下将默认启用该模式,而忽略-client参数。其特点是启动速度慢,运行性能和内存效率高。

  • -classpath classpath / -cp classpath
    使用-classpath后jvm将不再使用CLASSPATH中的类搜索路径,如果-classpath和CLASSPATH都没有设置,则jvm使用当前路径(.)作为类搜索路径。
    jvm搜索类的方式和顺序为:Bootstrap,Extension,User。
    Bootstrap中的路径是jvm自带的jar或zip文件,jvm首先搜索这些包文件,用System.getProperty("sun.boot.class.path")可得到搜索路径。
    Extension是位于JRE_HOME/lib/ext目录下的jar文件,jvm在搜索完Bootstrap后就搜索该目录下的jar文件,用System.getProperty("java.ext.dirs")可得到搜索路径。
    User搜索顺序为当前路径.、CLASSPATH、-classpath,jvm最后搜索这些目录,用System.getProperty("java.class.path")可得到搜索路径。

  • -Dproperty=value
    设置系统属性名/值对,运行在此jvm之上的应用程序可用System.getProperty("property")得到value的值。如果value中有空格,则需要用双引号将该值括起来,如-Dname= "space string"。
    该参数通常用于设置系统级全局变量值,如配置文件路径,以便该属性在程序中任何地方都可访问。

  • -jar
    指定以jar包的形式运行应用程序。使用这种方式,jar包中的mainfest文件中必须声明初始加载的Main-class,同时Main-class必须有public static void main(String[] args)方法。

  • -verbose:class
    输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。
  • -verbose:gc
    输出每次GC的相关情况。
  • -verbose:jni
    输出native方法调用的相关情况,一般用于诊断jni调用错误信息。

3. 非标准参数(-X)

一般很少使用。

  • -Xint,解释执行模式,所有的字节码将被直接执行,而不会编译成本地码;
  • -Xcomp,编译模式;
  • -Xmixed,开启混合模式(默认),先编译成字节码,然后执行。

4. 非Stable参数(-XX)

这类参数是进行jvm参数调优可能会进行修改,不过这类参数不是稳定的,不同版本的jvm中,可能对应的参数名称不同。并且可能在未来的版本被删除或重命名。

4.1 类型分类

-XX参数按照参数类型进行分类的话,可以分成两类:布尔类型和KV键值对类型。

4.1.1 布尔类型

-XX:+某个属性 开启某个jvm属性,-XX:+PrintGCDetails,开启GC详细信息。
-XX:-某个属性 关闭某个jvm属性,不是所有的属性都如此

4.1.2 KV键值对类型

-XX:属性key=值value。比如-XX:Metaspace=128m-XX:SurvivorRatio=4

4.2. 功能分类

-XX参数按照功能进行分类的话,可以大概分为

  • 行为参数:用于改变jvm的一些基础行为;
  • 性能参数:用于jvm的性能调优;
  • 调试参数:一般用于打开跟踪、打印、输出等jvm参数,用于显示jvm更加详细的信息。

4.2.1 行为参数

  • -XX:-DisableExplicitGC 禁止调用System.gc();但jvm的gc仍然有效
  • -XX:+MaxFDLimit 最大化文件描述符的数量限制
  • -XX:+ScavengeBeforeFullGC 新生代GC优先于Full GC执行
  • -XX:+UseGCOverheadLimit 在抛出OOM之前限制jvm耗费在GC上的时间比例
  • -XX:-UseConcMarkSweepGC 对老生代采用并发标记交换算法进行GC
  • -XX:-UseParallelGC 启用并行GC
  • -XX:-UseParallelOldGC 对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用
  • -XX:-UseSerialGC 启用串行GC
  • -XX:+UseThreadPriorities 启用本地线程优先级

4.2.2 性能参数

  • -XX:LargePageSizeInBytes=4m 设置用于Java堆的大页面尺寸
  • -XX:MaxHeapFreeRatio=70 GC后java堆中空闲量占的最大比例
  • -XX:MaxNewSize=size 新生成对象能占用内存的最大值
  • -XX:MaxPermSize=64m 老生代对象能占用内存的最大值
  • -XX:MinHeapFreeRatio=40 GC后java堆中空闲量占的最小比例
  • -XX:NewRatio=2 新生代内存容量与老生代内存容量的比例
  • -XX:NewSize=2.125m 新生代对象生成时占用内存的默认值
  • -XX:ReservedCodeCacheSize=32m 保留代码占用的内存容量
  • -XX:ThreadStackSize=512 设置线程栈大小,若为0则使用系统默认值
  • -XX:+UseLargePages 使用大页面内存
  • -Xms等价于-XX:InitialHeapSize初始化堆内存大小
  • -Xmx等价于-XX:MaxHeapSize最大的堆内存大小
  • -Xmn等价于-XX:NewSize=size设置初始的年轻代的大小
  • -Xss等价于-XX:ThresholdStackSize。用于设置单个栈的大小,系统默认值是0,不代表栈大小为0。而是根据操作系统的不同,有不同的值。比如64位的Linux系统是1024K,而Windows系统依赖于虚拟内存。

4.2.3 调试参数

  • -XX:-CITime 打印消耗在JIT编译的时间
  • -XX:ErrorFile=./hs_err_pid<pid>.log 保存错误日志或者数据到文件中
  • -XX:-ExtendedDTraceProbes 开启solaris特有的dtrace探针
  • -XX:HeapDumpPath=./java_pid<pid>.hprof 指定导出堆信息时的路径或文件名
  • -XX:-HeapDumpOnOutOfMemoryError 当首次遭遇OOM时导出此时堆中相关信息
  • -XX:OnError="<cmd args>;<cmd args>" 出现致命ERROR之后运行自定义命令
  • -XX:OnOutOfMemoryError="<cmd args>;<cmd args>" 当首次遭遇OOM时执行自定义命令
  • -XX:-PrintClassHistogram 遇到Ctrl-Break后打印类实例的柱状信息,与jmap -histo功能相同
  • -XX:-PrintConcurrentLocks 遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同
  • -XX:-PrintCommandLineFlags 打印在命令行中出现过的标记
  • -XX:-PrintCompilation 当一个方法被编译时打印相关信息
  • -XX:-PrintGC 每次GC时打印相关信息
  • -XX:-PrintGC Details 每次GC时打印详细信息
  • -XX:-PrintGCTimeStamps 打印每次GC的时间戳
  • -XX:-TraceClassLoading 跟踪类的加载信息,(jre/lib/rt.jar下的类全部加载,起来类用到的时候再加载)
  • -XX:-TraceClassLoadingPreorder 跟踪被引用到的所有类的加载信息
  • -XX:-TraceClassResolution 跟踪常量池
  • -XX:-TraceClassUnloading 跟踪类的卸载信息
  • -XX:-TraceLoaderConstraints 跟踪类加载器约束的相关信息

4.3. 查看参数

  1. 查看某个参数

使用jps -l配合jinfo -flag JVM参数 pid 。先用jsp -l查看java进程,选择某个进程号。

17888 org.jetbrains.jps.cmdline.Launcher
5360 org.jetbrains.idea.maven.server.RemoteMavenServer
18052 demo3.demo3

jinfo -flag PrintGCDetails 18052可以查看18052 Java进程的PrintGCDetails参数信息。

-XX:-PrintGCDetails
  1. 查看所有参数

使用jps -l配合jinfo -flags pid可以查看所有参数。

也可以使用java -XX:+PrintFlagsInitial

[Global flags]
     intx ActiveProcessorCount                      = -1            {product}
    uintx AdaptiveSizeDecrementScaleFactor          = 4             {product}
    uintx AdaptiveSizeMajorGCDecayTimeScale         = 10            {product}
    uintx AdaptiveSizePausePolicy                   = 0             {product}
······
    uintx YoungPLABSize                             = 4096          {product}
     bool ZeroTLAB                                  = false         {product}
     intx hashCode                                  = 5             {product}

  1. 查看修改后的参数

使用java -XX:PrintFlagsFinal可以查看修改后的参数,与上面类似。只是修改过后是:=而不是=

  1. 查看常见参数

如果不想查看所有参数,可以用-XX:+PrintCommandLineFlags查看常用参数。

-XX:InitialHeapSize=132375936 -XX:MaxHeapSize=2118014976 -XX:+PrintCommandLineFlags -XX:+UseCompressedCla

扩展阅读

https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html

https://github.com/MaJesTySA/JVM-JUC-Core/blob/master/docs/JVM.md#%E6%A0%87%E9%85%8D%E5%8F%82%E6%95%B0

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

推荐阅读更多精彩内容

  • JVM参数分类 JVM参数分为标准参数和非标准参数: 标准参数: "-"开头的参数,如-client, -serv...
    齐晋阅读 3,322评论 0 4
  • 转载blog.csdn.net/ning109314/article/details/10411495/ JVM工...
    forever_smile阅读 5,291评论 1 56
  • 作者:一字马胡 转载标志 【2017-11-12】 更新日志 日期更新内容备注 2017-11-12新建文章初版 ...
    beneke阅读 2,165评论 0 7
  • 介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明 程序计数器:看做当前线程所执行的字节码行号指示器...
    jemmm阅读 2,206评论 0 9
  • 父母——说的太多做的太少 很多思想来自父母老师(天天说 ——根深蒂固) 什么是对错(看待事情的立场和角度——一万个...
    郭倍贝贝阅读 210评论 0 0