JVM虚拟机调优常用参数

常见问题:
1、空间分配担保

名次解释

  • JNDI
    (Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API

  • SPI
    全名为Service Provider Interface.这个是针对厂商或者插件的

参数分类

垃圾分代收集

https://www.cnblogs.com/zhguang/p/3257367.html

打开gc日志

https://blog.youkuaiyun.com/liuxiao723846/article/details/72701414

jinfo

https://www.cnblogs.com/NetKillWill/archive/2017/10/28/jinfo.html

标准参数

功能和输出的参数都是很稳定的 在未来的JVM版本中不会改变 可以使用java -help检索出所有的标准参数。

用法: java [-options] class [args...]
           (执行类)
   或  java [-options] -jar jarfile [args...]
           (执行 jar 文件)
其中选项包括:
    -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>
                  使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。

X 参数

非标准化参数 在未来的版本可能会改变 所有的参数都用-X开始 可以使用java -X检索 但是注意没有-Xcomp,执行命令 java -X -help可查看更多


    -Xmixed           混合模式执行 (默认)
    -Xint             仅解释模式执行
    -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:jniJNI 函数执行其他检查
    -Xshare:off       不尝试使用共享类数据
    -Xshare:auto      在可能的情况下使用共享类数据 (默认)
    -Xshare:on        要求使用共享类数据, 否则将失败。
    -XshowSettings    显示所有设置并继续
    -XshowSettings:all
                      显示所有设置并继续
    -XshowSettings:vm 显示所有与 vm 相关的设置并继续
    -XshowSettings:properties
                      显示所有属性设置并继续
    -XshowSettings:locale
                      显示所有与区域设置相关的设置并继续

-X 选项是非标准选项, 如有更改, 恕不另行通知。


以下选项为 Mac OS X 特定的选项:
    -XstartOnFirstThread
                      在第一个 (AppKit) 线程上运行 main() 方法
    -Xdock:name=<应用程序名称>"
                      覆盖停靠栏中显示的默认应用程序名称
    -Xdock:icon=<图标文件的路径>
                      覆盖停靠栏中显示的默认图标

XX参数

非标准 很长一段时间不会列出来 用于JVM开发的debug和调优

虚拟机设置参数

参数描述
-client设置JVM使用client模式,特点启动较快(神机不明显(I5/8G/SSD))
-server设置JVM使用server模式。64位JDK默认启动该模式
-agentlib:libname[=options]用于加载本地的lib
-agentlib:hprof用于获取JVM的运行情况
-agentpath:pathnamep[=options]加载制定路径的本地库
-Dproperty=value设置系统属性名/值对
-jar制定以jar包的形式执行一个应用程序
-javaagent:jarpath[=options]实现premain方法在main方法前执行可以利用该方式玩一个JVM层面的hook很有意思的东西
-verbose:jni输出native方法的调用情况玩JNI必备技能

verbose:jni, 输出native方法的调用情况玩JNI必备技能, 例如:

-agentlib:jprofilerti=port=8849 -Xbootclasspath/a:/usr/local/jprofiler5/bin/agent.jar

java堆栈大小设置相关

参数描述
-Xms设置初始 Java 堆大小
-Xmx设置最大的java堆大小
-Xmn设置Young区大小
-Xss设置java线程堆栈大小
-Xoss设置本地方法栈大小
-Dproject.name=${admin-web}指定工程名称
-XX:PermSize and MaxPermSize设置持久带的大小
-XX:NewRatio设置年轻代和老年代的比值
-XX:NewSize设置年轻代的大小
-XX:SurvivorRation=n设置年轻代中E去与俩个S去的比值
-XX:PermSize=128m设置永久代内存大小(JDK7之前有效)
-XX:MaxPermSize=128m设置永久代最大内存大小(JDK7之前有效)

其中老年代的大小是:Xms-Xmn

打印垃圾回收信息及设置垃圾回收器

参数描述
-verbose:gc记录GC运行以及运行时间,一般用来查看GC是否有瓶颈
-XX:+PrintGCDetails记录GC运行时的详细数据信息,包括新生占用的内存大小及消耗时间
-XX:-PrintGCTimeStamps打印收集的时间戳
-XX:+UseParallelGC使用并行垃圾收集器
-XX:ParallelGCThreads=N,设置并行垃圾回收的线程数,此值可以设置与机器处理机数量一致(有建议core+3/4);
-XX:-UseConcMarkSweepGC使用并发标志扫描收集器
-XX:-UseSerialGC使用串行垃圾收集器
-Xloggc:filename设置GC记录的文件
-XX:+UseGCLogFileRotation启用GC日志文件的自动转储
-XX:GCLogFileSize=1M控制GC日志文件的大小
-XX:+UseAdaptiveSizePolicy设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
-XX:GCTimeRatio=n设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
-XX:+UseCMSCompactAtFullCollectio使用并发收集器时,开启对年老代的压缩。
-XX:CMSFullGCsBeforeCompaction=0上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩
-XX:+PrintGCApplicationConcurrentTime打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用输出形式:Application time: 0.5291524 seconds
-XX:+PrintGCApplicationStoppedTim打印垃圾回收期间程序暂停的时间。可与上面混合使用,输出形式:Total time for which application threads were stopped: 0.0468229 seconds
-XX:PrintHeapAtGC打印GC前后的详细堆栈信息

调试参数

-Xdebug
-Xnoagent
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
-XX:HeapDumpPath=./java_pid.hprof :Path to directory or file name for heap dump.
-XX:-PrintConcurrentLocks :Print java.util.concurrent locks in Ctrl-Break thread dump.
-XX:-PrintCommandLineFlags :Print flags that appeared on the command line.

关于性能

-Xprof
-Xrunhprof

类加载和跟踪类加载和卸载的信息

Xbootclasspath :指定需要加载,但不想通过校验类路径。
JVM会对所有的类在加载前进行校验并为每个类通过一个int数值来应用
-XX:+TraceClassLoading :跟踪类加载的信息(诊断内存泄露很有用)
-XX:+TraceClassUnloading :跟踪类卸载的信息(诊断内存泄露很有用)

JVM调优工具Jconsole,jProfile,VisualVM

Jconsole :JDK自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。
JProfiler:商业软件,需要付费。功能强大。
VisualVM:JDK自带,功能强大,与JProfiler类似。推荐 

实战OOM异常

1、堆溢出

指定虚拟机参数,-XX:+HeapDumpOnOutOfMemoryError可以dump出当前的内存堆转储快找

-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
public class ThreadState {
    public static void main(String[] args){
        List<ThreadState> list = new ArrayList<>();
        while (true) {
            list.add(new ThreadState());
        }
    }
}

参考文档

https://blog.youkuaiyun.com/Thousa_Ho/article/details/77278656

https://docs.oracle.com/javacomponents/jrockit-hotspot/migration-guide/cloptions.htm#JRHMG129

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值