美文网首页
JVM参数简介

JVM参数简介

作者: Coding小聪 | 来源:发表于2019-09-23 23:43 被阅读0次

    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

    相关文章

      网友评论

          本文标题:JVM参数简介

          本文链接:https://www.haomeiwen.com/subject/vxrogqtx.html