JVM(二十三) -- 性能监控与调优(四) -- JVM运行时参数

1. JVM参数选项类型

1.1 类型一:标准参数选项

1.1.1 特点:
  • 比较稳定,后续版本基本不会变化
  • 以 -开头
1.1.2 各种选项:

直接在DOS窗口中运行java或者java -help可以看到所有的标准选项

-d32          使用 32 位数据模型 (如果可用)
-d64          使用 64 位数据模型 (如果可用)
-server       选择 "server" VM
               默认 VM 是 server.
 
-cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>; 分隔的目录, JAR 档案
               和 ZIP 档案列表, 用于搜索类文件。
-D<名称>=<>
               设置系统属性
-verbose:[class|gc|jni]
               启用详细输出
-version      输出产品版本并退出
-version:<>
               警告: 此功能已过时, 将在
               未来发行版中删除。
               需要指定的版本才能运行
-showversion  输出产品版本并继续
-jre-restrict-search | -no-jre-restrict-search
               警告: 此功能已过时, 将在
               未来发行版中删除。
               在版本搜索中包括/排除用户专用 JRE
-? -help      输出此帮助消息
-X            输出非标准选项的帮助
-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
               按指定的粒度启用断言
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
               禁用具有指定粒度的断言
-esa | -enablesystemassertions
               启用系统断言
-dsa | -disablesystemassertions
               禁用系统断言
-agentlib:<libname>[=<选项>]
               加载本机代理库 <libname>, 例如 -agentlib:hprof
               另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
-agentpath:<pathname>[=<选项>]
               按完整路径名加载本机代理库
-javaagent:<jarpath>[=<选项>]
               加载 Java 编程语言代理, 请参阅 java.lang.instrument
-splash:<imagepath>
               使用指定的图像显示启动屏幕

1.1.3 补充内容:-server与-client

在这里插入图片描述

1.2 类型二: -X参数选项

1.2.1 特点:
  • 非标准化参数
  • 功能还是比较稳定的。但官方说后续版本可能会变更
  • 以-X开头
1.2.2 各种选项:

直接在DOS窗口中运行java -X命令可以看到所有的X选项

-Xmixed        混合模式执行 (默认)
-Xint             仅解释模式执行
-Xcomp        仅采用即时编译器模式
-Xbootclasspath:<; 分隔的目录和 zip/jar 文件>
                   设置搜索路径以引导类和资源
-Xbootclasspath/a:<; 分隔的目录和 zip/jar 文件>
                   附加在引导类路径末尾
-Xbootclasspath/p:<; 分隔的目录和 zip/jar 文件>
                   置于引导类路径之前
-Xdiag            显示附加诊断消息
-Xnoclassgc       禁用类垃圾收集
-Xincgc           启用增量垃圾收集
-Xloggc:<file>    将 GC 状态记录在文件中 (带时间戳)
-Xbatch           禁用后台编译
-Xms<size>        设置初始 Java 堆大小
-Xmx<size>        设置最大 Java 堆大小
-Xss<size>        设置 Java 线程堆栈大小
-Xprof            输出 cpu 配置文件数据
-Xfuture          启用最严格的检查, 预期将来的默认值
-Xrs              减少 Java/VM 对操作系统信号的使用 (请参阅文档)
-Xcheck:jni       对 JNI 函数执行其他检查
-Xshare:off       不尝试使用共享类数据
-Xshare:auto      在可能的情况下使用共享类数据 (默认)
-Xshare:on        要求使用共享类数据, 否则将失败。
-XshowSettings    显示所有设置并继续
-XshowSettings:all
                   显示所有设置并继续
-XshowSettings:vm 显示所有与 vm 相关的设置并继续
-XshowSettings:properties
                   显示所有属性设置并继续
-XshowSettings:locale
                   显示所有与区域设置相关的设置并继续
 
-X 选项是非标准选项,如有更改,恕不另行通知
1.2.3 JVM的JIT编译模式相关的选项
  • -Xint:只使用解释器:所有字节码都被解释执行,这个模式的速度是很慢的
  • -Xcomp:只使用编译器:所有字节码第一次使用就被编译成本地代码,然后在执行
  • -Xmixed:混合模式:这是默认模式,刚开始的时候使用解释器慢慢解释执行,后来让JIT即时编译器根据程序运行的情况,有选择地将某些热点代码提前编译并缓存在本地,在执行的时候效率就非常高了
1.2.4 特别地:-Xmx -Xms -Xss属于XX参数?
  • -Xms 设置初始Java堆大小,等价于-XX:InitialHeapSize
  • -Xmx 设置最大Java堆大小,等价于-XX:MaxHeapSize
  • -Xss 设置Java线程堆栈大小,等价于-XX:ThreadStackSize

1.3 类型三:-XX参数选项

1.3.1 特点
  • 非标准化参数
  • 使用的最多的参数类型
  • 这类选项属于实验性,不稳定
  • 以-XX开头
  • 用于开发和调试JVM
1.3.2 分类:
  • Boolean类型格式
    • -XX:+<option> 表示启用option属性
    • -XX:-<option> 表示禁用option属性

在这里插入图片描述

  • 非Boolean类型格式(key-value类型)
    • 子类型1:数值型格式-XX:<option>=<number>
      在这里插入图片描述

    • 子类型2:非数值型格式-XX:<name>=<string>
      在这里插入图片描述

1.3.3 特别地:-XX:+PrintFlagsFinal
  • 输出所有参数的名称和默认值
  • 默认不包括Diagnostic和Experimental的参数
  • 可以配合-XX:+UnlockDiagnosticVMOptions和-XX:UnlockExperimentalVMOptions使用

2. 添加JVM参数选项

在这里插入图片描述

3. 常用的JVM参数选项

3.1 打印设置的XX选项及值

  • -XX:+PrintCommandLineFlags:可以让程序运行前打印出用户手动设置或者JVM自动设置的XX选项

  • -XX:+PrintFlagsInitial:表示打印出所有XX选项的默认值

  • -XX:+PrintFlagsFinal:表示打印出XX选项在运行程序时生效的值。如果值的前面加上了:=,说明该值不是初始值,该值可能被jvm自动改变了,也可能被我们设置的参数改变了,如下所示:
    在这里插入图片描述

  • -XX:+PrintVMOptions:打印JVM的参数

3.2 堆、栈、方法区等内存大小设置

3.2.1 栈
  • -Xss128k:等价于-XX:ThreadStackSize=128k,设置每个线程的栈大小为128k
3.2.2 堆内存
  • -Xms3550m:等价于-XX:InitialHeapSize,设置JVM初始堆内存为3550M

  • -Xmx3550m:等价于-XX:MaxHeapSize,设置JVM最大堆内存为3550M

  • -Xmn2g:设置年轻代大小为2G,即等价于-XX:NewSize=2g 和-XX:MaxNewSize=2g,也就是设置年轻代初始值和年轻代最大值都是2G。官方推荐配置为整个堆大小的3/8

  • -XX:NewSize=1024m:设置年轻代初始值为1024M

  • -XX:MaxNewSize=1024m:设置年轻代最大值为1024M

  • -XX:SurvivorRatio=8:设置年轻代中Eden区与一个Survivor区的比值,默认为8。只有显示使用Eden区和Survivor区的比例,才会让比例生效,否则比例都会自动设置,至于其中的原因,请看下面的-XX:+UseAdaptiveSizePolicy中的解释,最后推荐使用默认打开的-XX:+UseAdaptiveSizePolicy:设置,并且不显示设置-XX:SurvivorRatio

  • -XX:+UseAdaptiveSizePolicy: 自动选择各区大小比例,默认开启

    • 分析:默认开启,将会导致Eden区和Survivor区的比例自动分配,因此也会引起我们默认值-XX:SurvivorRatio=8失效,所以真实比例可能不是8,比如可能是6等
    • 如何设置Eden区和Survivor区的比例:-XX:SurvivorRatio=8显示使用Eden区和Survivor区的比例,同时关闭-XX:+UseAdaptiveSizePolicy
    • 结论:只有显示使用Eden区和Survivor区的比例,同时关闭默认设置,才会让比例生效,否则比例都会自动设置。最后推荐使用默认打开的-XX:+UseAdaptiveSizePolicy设置,并且不显示设置-XX:SurvivorRatio
  • -XX:NewRatio=2:设置老年代与年轻代(包括1个Eden区和2个Survivor区)的比值,默认为2。根据实际情况进行设置,主要根据对象生命周期来进行分配,如果对象生命周期很长,那么让老年代大一点,否则让新生代大一点

  • -XX:PretenureSizeThreadshold=1024:设置让大于此阈值的对象直接分配在老年代,单位为字节。只对Serial、ParNew收集器有效

  • -XX:MaxTenuringThreshold=15:默认值为15。新生代每次MinorGC后,还存活的对象年龄+1,当对象的年龄大于设置的这个值时就进入老年代。使用比较少,一般用默认值

  • -XX:+PrintTenuringDistribution:让JVM在每次MinorGC后打印出当前使用的Survivor中对象的年龄分布

  • -XX:TargetSurvivorRatio:表示MinorGC结束后Survivor区域中占用空间的期望比例

3.2.3 方法区
  • 永久代:
    • -XX:PermSize=256m:设置永久代初始值为256M
    • -XX:MaxPermSize=256m:设置永久代最大值为256M
  • 元空间:
    • -XX:MetaspaceSize:初始空间大小
    • -XX:MaxMetaspaceSize:最大空间,默认没有限制
    • -XX:+UseCompressedOops:使用压缩对象指针
    • -XX:+UseCompressedClassPointers:使用压缩类指针
    • -XX:CompressedClassSpaceSize:设置Klass Metaspace的大小,默认1G
3.2.4 直接内存
  • -XX:MaxDirectMemorySize:指定DirectMemory容量,若未指定,则默认与Java堆最大值一样

3.3 OutOfMemory相关的选项

  • -XX:+HeapDumpOnOutMemoryError:表示在内存出现OOM的时候,生成Heap转储文件,以便后续分析,-XX:+HeapDumpBeforeFullGC-XX:+HeapDumpOnOutMemoryError只能设置1个
  • -XX:+HeapDumpBeforeFullGC: 表示在出现FullGC之前,生成Heap转储文件,以便后续分析,-XX:+HeapDumpBeforeFullGC-XX:+HeapDumpOnOutMemoryError 只能设置1个,请注意FullGC可能出现多次,那么dump文件也会生成多个
  • -XX:HeapDumpPath=<path>:指定heap转存文件的存储路径,如果不指定,就会将dump文件放在当前目录中
  • -XX:OnOutOfMemoryError:指定一个可行性程序或者脚本的路径,当发生OOM的时候,去执行这个脚本
    在这里插入图片描述

3.4 垃圾回收期相关选项

3.4.1 查看默认垃圾回收器

在这里插入图片描述

3.4.2 Serial回收器

在这里插入图片描述

3.4.3 ParNew回收器

在这里插入图片描述

3.4.4 Parallel回收器

在这里插入图片描述
在这里插入图片描述
注意:
Parallel回收器主打吞吐量,而CMS和G1主打低延迟,如果主打吞吐量,那么就不应该限制最大停顿时间,所以-XX:MaxGCPauseMills不应该设置
-XX:MaxGCPauseMills中的调整堆大小通过默认开启的
-XX:+UseAdaptiveSizePolicy来实现
-XX:GCTimeRatio用来衡量吞吐量,并且和-XX:MaxGCPauseMills矛盾,因此不会同时使用

3.4.5 CMS回收器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4.6 G1回收器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4.7 怎样选择垃圾回收器

在这里插入图片描述

3.5 GC日志相关选项

  • -verbose:gc:输出日志信息,默认输出的标准输出。可以独立使用
    在这里插入图片描述

  • -XX:+PrintGC:等同于-verbose:gc表示打开简化的日志。可以独立使用

  • -XX:+PrintGCDetails:在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域的分配情况。可以独立使用
    在这里插入图片描述

  • -XX:+PrintGCTimeStamps:程序启动到GC发生的时间秒数。不可以独立使用,需要配合-XX:+PrintGCDetails使用
    在这里插入图片描述

  • -XX:+PrintGCDateStamps:输出GC发生时的时间戳(以日期的形式,例如:2013-05-04T21:53:59.234+0800)。不可以独立使用,可以配合-XX:+PrintGCDetails使用
    在这里插入图片描述

  • -XX:+PrintHeapAtGC:每一次GC前和GC后,都打印堆信息。可以独立使用
    在这里插入图片描述

  • -Xloggc:<file>:把GC日志写入到一个文件中去,而不是打印到标准输出中

3.6 其他参数

  • -XX:+DisableExplicitGC:禁用hotspot执行System.gc(),默认禁用
  • -XX:ReservedCodeCacheSize=<n>[g|m|k]、-XX:InitialCodeCacheSize=<n>[g|m|k]:指定代码缓存的大小
  • -XX:+UseCodeCacheFlushing:使用该参数让jvm放弃一些被编译的代码,避免代码缓存被占满时JVM切换到interpreted-only的情况
  • -XX:+DoEscapeAnalysis:开启逃逸分析
  • -XX:+UseBiasedLocking:开启偏向锁
  • -XX:+UseLargePages:开启使用大页面
  • -XX:+PrintTLAB:打印TLAB的使用情况
  • -XX:TLABSize:设置TLAB大小

4. 通过java代码获取JVM参数

在这里插入图片描述

/**
 *
 * 监控我们的应用服务器的堆内存使用情况,设置一些阈值进行报警等处理
 *

 * @create 15:23
 */
public class MemoryMonitor {
    public static void main(String[] args) {
        MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean();
        MemoryUsage usage = memorymbean.getHeapMemoryUsage();
        System.out.println("INIT HEAP: " + usage.getInit() / 1024 / 1024 + "m");
        System.out.println("MAX HEAP: " + usage.getMax() / 1024 / 1024 + "m");
        System.out.println("USE HEAP: " + usage.getUsed() / 1024 / 1024 + "m");
        System.out.println("\nFull Information:");
        System.out.println("Heap Memory Usage: " + memorymbean.getHeapMemoryUsage());
        System.out.println("Non-Heap Memory Usage: " + memorymbean.getNonHeapMemoryUsage());

        System.out.println("=======================通过java来获取相关系统状态============================ ");
        System.out.println("当前堆内存大小totalMemory " + (int) Runtime.getRuntime().totalMemory() / 1024 / 1024 + "m");// 当前堆内存大小
        System.out.println("空闲堆内存大小freeMemory " + (int) Runtime.getRuntime().freeMemory() / 1024 / 1024 + "m");// 空闲堆内存大小
        System.out.println("最大可用总堆内存maxMemory " + Runtime.getRuntime().maxMemory() / 1024 / 1024 + "m");// 最大可用总堆内存大小

    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值