Day360.JVM运行时参数项 -JVM

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day360.JVM运行时参数项 -JVM相关的知识,希望对你有一定的参考价值。

JVM运行时参数项

一、JVM参数选项

参数来源:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

1、类型一:标准参数选项

  • 特点


  • 各种选项

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

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

补充内容-server-client

对于以上第2点,我们可以打开DOS窗口,输入java -version就可以看到64位机器上用的server模式,如下所示:


2、类型二:-X参数选项

  • 特点


  • 各种选项

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

-Xmixed 混合模式执行 (默认)
-Xint 仅解释模式执行
-Xcomp仅采用即时编译器模式
-Xbootclasspath:
                   设置搜索路径以引导类和资源
-Xbootclasspath/a:
                   附加在引导类路径末尾
-Xbootclasspath/p:
                   置于引导类路径之前
-Xdiag            显示附加诊断消息
-Xnoclassgc       禁用类垃圾收集
-Xincgc           启用增量垃圾收集
-Xloggc:    将 GC 状态记录在文件中 (时间戳)
-Xbatch           禁用后台编译

-Xms        设置初始 Java 堆大小
-Xmx        设置最大 Java 堆大小
-Xss        设置 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 选项是非标准选项,如有更改,恕不另行通知


  • JVM的JIT编译模式相关的选项


  • -Xmx -Xms -Xss属于XX参数?

单位:k/K、m/M、g/G

设置:-Xmx、-Xms最好设置成一样的值,避免扩容带来的损耗


3、类型三:-XX参数选项

  • 特点


  • 作用

用于开发和调试JVM


  • 分类

    • Boolean类型格式

      说明:因为有的指令默认是开启的,所以可以使用-关闭

    • 非Boolean类型格式(key-value类型)

      子类型1:数值型格式-XX:< option >=< number >

      子类型2:非数值型格式-XX:< name >=< string >


  • -XX:+PrintFlagsFinal


二、添加JVM参数选项

1、Eclipse

①在空白处单击右键,选择Run As,在选择Run Configurations……

②设置虚拟机参数


2、IDEA

①Edit Configurations…

②设置虚拟机参数


3、运行jar包

这是在java -jar demo.jar中的java -jar之间添加了虚拟机配置信息


4、通过Tomcat运行war包


5、程序运行过程中


三、常用的JVM参数选项

1、打印设置的XX选项及值

通过jinfo,查看单个参数的值:↓


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

注意

  • -XX:SurvivorRatio=8

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

  • -XX:+UseAdaptiveSizePolicy

    • 分析

      默认开启,将会导致Eden区和Survivor区的比例自动分配,因此也会引起我们默认值-XX:SurvivorRatio=8失效,所以真实比例可能不是8,比如可能是6等

    • 如何设置Eden区和Survivor区的比例

      -XX:SurvivorRatio=8

    1. 显示使用Eden区和Survivor区的比例,那就使用我自己的

    2. 没有显示使用Eden区和Survivor区的比例,无论打开或者关闭-XX:+UseAdaptiveSizePolicy都会自动设置Eden区和Survivor区的比例

    3. 如果需要关闭需要显式的在在代码启动中配置关闭,且显式的设置你设置新生代养老带的比例-XX:SurvivorRatio=8

    • 结论

      只有显示使用Eden区和Survivor区的比例,才会让比例生效,否则比例都会自动设置,最后推荐使用默认打开的-XX:+UseAdaptiveSizePolicy设置,并且不显示设置-XX:SurvivorRatio

  • -XX:NewRatio=2

    • 根据实际情况进行设置,主要根据对象生命周期来进行分配,如果对象生命周期很长,那么让老年代大一点,否则让新生代大一点
  • -XX:PretenureSizeThreadshold=1024

    • 不好控制
  • -XX:MaxTenuringThreshold=15

    • 使用比较少,一般用默认值

3、OutOfMemory相关的选项

-XX:+HeapDumpOnOutMemoryError(在出现OOM的时候生成dump文件)和-XX:+HeapDumpBeforeFullGC(在出现Full GC的时候生成dump文件)只能设置1个,如果不设置-XX:HeapDumpPath=,那么将会在当前目录下生成dump文件,如果设置的话,将会在指定位置生成dump文件

注意

  • -XX:OnOutOfMemoryError

    • 当发生OOM之后,你需要做什么事(指定一个脚本的路径)


4、垃圾收集器相关选项


  • 查看默认的垃圾回收器

    以上两种方式都可以查看默认使用的垃圾回收器,第一种方式更加准备,但是需要程序的支持;

    第二种方式需要去尝试,如果使用了,返回的值中有+号,否则就是-号


  • Serial回收器

针对硬件条件比较低的情况下使用;或单核CPU的情况下


  • Parnew回收器

根据下图可知,该回收器最终将会没有搭档,那就相当于被遗弃了


  • Parallel回收器

Parallel回收器主打吞吐量,而CMS和G1主打低延迟,如果主打吞吐量,那么就不应该限制最大停顿时间,所以-XX:MaxGCPauseMills不应该设置

-XX:MaxGCPauseMills中的调整堆大小通过默认开启的-XX:+UseAdaptiveSizePolicy来实现
-XX:GCTimeRatio用来衡量吞吐量,并且和-XX:MaxGCPauseMills矛盾,因此不会同时使用


  • CMS回收器

-XX:ParallelCMSThreads和ParallelGCThreads有关系,ParallelGCThreads在上面Parnew回收器中有提到


  • G1回收器

如果使用G1垃圾收集器,不建议设置-Xmn和-XX:NewRatio,毕竟可能影响G1的自动调节

Mixed GC调优参数:


  • 怎么选择垃圾收集器


5、GC日志相关选项

①常用参数

  • -verbose:gc、-XX:PrintGC

    打印出GC的简化情况

  • -XX:PrintGCDeatils

    会打印出堆空间的情况,和GC细节情况

  • -XX:PrintGCTimeStamps

    左侧时间多出了时间戳

  • -XX:PrintGCDayTmeStamps

    左侧时间多出时间戳,年月日时分秒

  • -XX:PrintGCHeapAtGC

    打印GC前和GC后的堆内存信息

  • -Xloggc:<filePath>

    将GC日志输出到指定位置


②其他参数


6、其他参数


四、通过Java代码获取JVM参数

/**
 *
 * 监控我们的应用服务器的堆内存使用情况,设置一些阈值进行报警等处理
*
 * @author shkstart
 * @create 15:23
 */
public class MemoryMonitor {
    public static void main(String[] args) {
    	//通过ManagementFactory来获取内存实例
        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");// 最大可用总堆内存大小

    }
}

上篇通过Runtime获取


以上是关于Day360.JVM运行时参数项 -JVM的主要内容,如果未能解决你的问题,请参考以下文章

day 2 给程序传递参数

day03 java内存结构以及重载

Java中不定项参数(可变参数)的使用

Java Day 18

day2

DAY12