1 JVM参数简介

首先想说的是其实这些参数我们并不是陌生的,在平时的开发和使用中经常都会遇到,只是在平时缺少一个比较系统的总结,所以,对这些参数感觉是很陌生的,所以,通过这篇文章的总结,我相信你一定都会对这些参数熟稔于心,做做心中有数。

在Java虚拟机的参数中,其实可以把这些参数分为三类,当然,这是针对JDK1.6来说的,如果对于JDK1.8,那么就不是这么分类的了,但是,由于这两个版本很多常用的参数的差别是不大的,所以这篇文章就先介绍JDK1.6的VM参数。

主要可以分为以下三类:

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

虽然是这么分类的,实际上呢,非标准参数和非稳定的参数实际的使用中还是用的非常的多的,在后面的文章的介绍中你就会发现。

2 标准参数

这一类参数可以说是我们刚刚开始Java是就用的非常多的参数了,比如java -version、java -jar等等,我们在CMD中输入java -help就可以获得Java当前版本的所有标准参数了。

如上图就是JDK1.8的所有标准参数了,下面我们将介绍一些我们会用的比较多的参数。

  • -client
    以client模式启动JVM,这种方式启动速度快,但运行时性能和内存管理效率不高,适合客户端程序或者开发调试。

  • -server
    以server模式启动JVM,与client情况恰好相反。适合生产环境,适用于服务器。64位的JVM自动以server模式启动。

  • -classpath或者-cp
    通知JVM类搜索路径。如果指定了-classpath,则JVM就忽略CLASSPATH中指定的路径。各路径之间以分号隔开。如果-classpath和CLASSPATH都没有指定,则JVM从当前路径寻找class。

JVM搜索路径的顺序:

  1. 先搜索JVM自带的jar或zip包
    Bootstrap,搜索路径可以用System.getProperty(“sun.boot.class.path”)获得;

  2. 搜索JRE_HOME/lib/ext下的jar包
    Extension,搜索路径可以用System.getProperty(“java.ext.dirs”)获得;

  3. 搜索用户自定义目录,顺序为:当前目录(.),CLASSPATH,-cp
    搜索路径用System.getProperty(“java.class.path”)获得

  • -DpropertyName=value
    定义系统的全局属性值,如配置文件地址等,如果value有空格,则需要使用双引号。

另外用System.getProperty(“hello”)可以获得这些定义的属性值,在代码中也可以用System.setProperty(“hello”,“world”)的形式来定义属性。

  • -verbose
    查询GC问题最常用的命令之一,参数如下:
    -verbose:class
    输出JVM载入类的相关信息,当JVM报告说找不到类或者类冲突时可此进行诊断。
    -verbose:gc
    输出每次GC的相关情况。
    -verbose:jni
    输出native方法调用的相关情况,一般用于诊断jni调用错误信息。

另外,控制台输出GC信息还可以使用如下命令:

在JVM的启动参数中加入-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime,按照参数的顺序分别输出GC的简要信息,GC的详细信息、GC的时间信息及GC造成的应用暂停的时间。

3 非标准参数

非标注的参数主要是关于Java内存区域的设置参数,所以在看这些参数之前,应该先查看Java内存区域的基础知识,可以查看这篇文章:深入理解Java虚拟机-Java内存区域透彻分析。

非标准参数实在标准参数的基础上的一些扩充参数,可以输入java -X,获得当前JVM支持的非标准参数。

  • -Xmn
    新生代内存大小的最大值,包括E区和两个S区的总和。设置方法:-Xmn512m、-Xmn2g。

  • -Xms
    初始堆的大小,也是堆大小的最小值,默认值是总共的物理内存/64(且小于1G)。默认情况下,当堆中可用内存小于40%,堆内存会开始增加,一直增加到-Xmx的大小。

  • -Xmx
    堆的最大值,默认值是总共的物理内存/64(且小于1G),默认情况下,当堆中可用内存大于70%,堆内存会开始减少,一直减小到-Xms的大小。

因此,为了避免这种浮动,所以在设置-Xms和-Xmx参数时,一般会设置成一样的,能够提高性能。

另外,官方默认的配置为年老代大小:年轻代大小=2:1左右,使用-XX:NewRatio可以设置年老代和年轻代之比,例如,-XX:NewRatio=4,表示年老代:年轻代=4:1

参数实例

设置-Xms、-Xmn和-Xmx参数分别为-Xms512m -Xmx512m -Xmn128m。同时设置新生代和老生代之比为1:4,E:S0:S1=8:1:1。

当我们没有设置-XX:NewRatio=4 -XX:SurvivorRatio=8时,使用官方默认的情况如下:

上图可以看出,新生代(Eden Space + Survivor 0 + Survivor 1):老年代(Old Gen)≈ 1:2。

当我们设置了-XX:NewRatio=4 -XX:SurvivorRatio=8时,情况如下:

变成了新生代(Eden Space + Survivor 0 + Survivor 1):老年代(Old Gen)≈ 1:4,Eden Space:Survivor 0: Survivor 1 = 8:1:1。

从上图可知,堆的信息是正确的。

  • -Xss
    设置每个线程的栈内存,默认1M,一般来说是不需要改的。

  • -Xprof
    跟踪正运行的程序,并将跟踪数据在标准输出输出;适合于开发环境调试。

  • -Xnoclassgc
    禁用类垃圾收集,关闭针对class的gc功能;因为其阻止内存回收,所以可能会导致OutOfMemoryError错误,慎用。

  • -Xincgc
    开启增量gc(默认为关闭);这有助于减少长时间GC时应用程序出现的停顿;但由于可能和应用程序并发执行,所以会降低CPU对应用的处理能力。

  • -Xloggc:file
    与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。
    若与verbose命令同时出现在命令行中,则以-Xloggc为准。

  • -Xint
    在解释模式(interpreted mode)下,-Xint标记会强制JVM执行所有的字节码,这会降低运行速度,通常低10倍或更多。

  • -Xcomp
    -Xcomp参数与它(-Xint)正好相反,JVM在第一次使用时会把所有的字节码编译成本地代码,从而带来最大程度的优化。

然而,很多应用在使用-Xcomp也会有一些性能损失,当然这比使用-Xint损失的少,原因是-xcomp没有让JVM启用JIT编译器的全部功能。JIT编译器可以对是否需要编译做判断,如果所有代码都进行编译的话,对于一些只执行一次的代码就没有意义了。

  • -Xmixed
    -Xmixed是混合模式,这是JVM默认的模式,也是推荐使用的模式。将解释模式与编译模式进行混合使用,由JVM自己决定。

4 非Stable参数

这类参数你一看官网以为不能使用呢,官网给你的建议就是这些参数不稳定,慎用,其实这主要的原因还是因为每个公司的实现都是不一样的,所以就是导致不稳定。但是呢,在实际的使用中却是非常的多的,而且这部分的参数很重要。

这些参数大致可以分为三类:

  • 性能参数(Performance Options):用于JVM的性能调优和内存分配控制,如初始化内存大小的设置;
  • 行为参数(Behavioral Options):用于改变JVM的基础行为,如GC的方式和算法的选择;
  • 调试参数(Debugging Options):用于监控、打印、输出等jvm参数,用于显示jvm更加详细的信息;

注意:以下参数都是JDK1.7及以下可以使用。

  • 性能参数
    |参数及其默认值| 描述 |
    |–|--|
    | -XX:LargePageSizeInBytes=4m | 设置用于Java堆的大页面尺寸 |
    | -XX:MaxHeapFreeRatio=70 | GC后java堆中空闲量占的最大比例 |
    | -XX:MinHeapFreeRatio=40 | GC后java堆中空闲量占的最小比例 |
    | -XX:MaxNewSize=size | 新生成对象能占用内存的最大值 |
    | -XX:MaxPermSize=64m | 老生代对象能占用内存的最大值 |
    | -XX:NewRatio=2 | 新生代内存容量与老生代内存容量的比例 |
    | -XX:NewSize=2.125m | 新生代对象生成时占用内存的默认值 |
    | -XX:ReservedCodeCacheSize=32m| 保留代码占用的内存容量 |
    | -XX:ThreadStackSize=512 | 设置线程栈大小,若为0则使用系统默认值 |
    | -XX:+UseLargePages | 使用大页面内存 |

  • 行为参数
    |参数及其默认值| 描述 |
    |–|--|
    |-XX:+ScavengeBeforeFullGC|新生代GC优先于Full GC执行|
    |-XX:+UseGCOverheadLimit|在抛出OOM之前限制jvm耗费在GC上的时间比例|
    |-XX:-UseParNewGC|打开此开关,使用ParNew+Serial Old收集器|
    |-XX:-UseConcMarkSweepGC|使用ParNew+CMS+Serial Old收集器对老生代采用并发标记交换算法进行GC|
    |-XX:-UseParallelGC|启用并行GC,使用ParallelScavenge+Serial Old收集器|
    |-XX:-UseParallelOldGC|对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用,ParallelScavenge+Parallel Old收集器|
    |-XX:-UseSerialGC|启用串行GC|
    |-XX:+UseG1GC|使用垃圾优先(G1)收集器|
    |-XX:SurvivorRatio=n|Eden区域与Survivor区域大小之比。预设值为8|
    |-XX:PretenureSizeThreshold=n|直接晋升到老年代的对象大小,设置这个参数之后,大于这个参数的对象直接进入到老年代分配|
    |-XX:MaxTenuringThreshold=n|晋升到老年代的对象年龄,每个对象在坚持过一次Minor GC之后,年龄加1,当超过这个值之后就进入老年代。预设值为15|
    |-XX:+UseAdaptiveSizePolicy|动态调整Java堆中各个区域的大小以及进入老年代的年龄|
    |-XX:ParallelGCThreads=n|设置并行收集器收集时使用的CPU数。并行收集线程数|
    |-XX:MaxGCPauseMillis=n|设置并行收集最大暂停时间|
    |-XX:GCTimeRatio=n|设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+N)|
    |-XX:+UseThreadPriorities|启用本地线程优先级|
    |-XX:-DisableExplicitGC|禁止调用System.gc();但jvm的gc仍然有效|
    |-XX:+MaxFDLimit|最大化文件描述符的数量限制|

  • 调试参数
    |参数及其默认值| 描述 |
    |–|--|
    |-XX:-CITime|打印消耗在JIT编译的时间|
    |-XX:ErrorFile=./hs_err_pid<pid>.log|保存错误日志或者数据到文件中|
    |-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:-PrintGCDetails|每次GC时打印详细信息|
    |-XX:-PrintGCTimeStamps|打印每次GC的时间戳|
    |-XX:-TraceClassLoading|跟踪类的加载信息|
    |-XX:-TraceClassLoadingPreorder|跟踪被引用到的所有类的加载信息|
    |-XX:-TraceClassResolution|跟踪常量池|
    |-XX:-TraceClassUnloading|跟踪类的卸载信息|
    |-XX:-TraceLoaderConstraints|跟踪类加载器约束的相关信息|

JDK8的VM参数

常用 vm 参数分析相关推荐

  1. 深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中- 深入理解Java虚拟机-Java内存区域透彻分析 深入理解Java虚拟机-常用vm参数分析 深入理解Java虚拟机-JVM内存分配与回收策略原理,从此告别J ...

  2. 深入java虚拟机 第四版_深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中... https://blog.ouyangsihai.cn/shen-ru-li-jie-java-xu-ni-ji-java-nei-cun-qu-yu- ...

  3. 深入理解 Java 虚拟机(第二弹) - 常用 vm 参数分析

    来自:好好学java 话不多说,今天就分析一下一些常用的Java虚拟机的参数设置,以及如何更好的使用! 1 JVM参数简介 首先想说的是其实这些参数我们并不是陌生的,在平时的开发和使用中经常都会遇到, ...

  4. java gc时自动收dump_Full GC分析:设置Java VM参数实现在Full GC前后自动生成Dump

    本文讲解了如何设置JavaVM参数实现在Full GC前后自动生成Dump.共有三个VM参数需要设置: HeapDumpBeforeFullGC 实现在Full GC前dump. HeapDumpBe ...

  5. JVM调优系列:(五)JVM常用调试参数和工具

    转自:http://blog.csdn.net/opensure/article/details/46715769 JVM常用调试参数: –verbose:gc在虚拟机发生内存回收时在输出设备显示信息 ...

  6. Redis常用配置参数详解及查看修改命令

    目录 Redis常用配置参数 Redis配置参数查看命令 语法 举例 说明: Redis配置参数修改命令 语法 举例 说明: Redis常用配置参数 序号 配置项 说明 1 daemonize no ...

  7. JVM 常用配置参数(Java 8)

    日志 -XX:+PrintFlagsFinal,打印JVM所有参数的值 -XX:+PrintGC,打印GC信息 -XX:+PrintGCDetails,打印GC详细信息 -XX:+PrintGCTim ...

  8. 运维工作常用的性能分析工具介绍

    在运维工作中常用到的性能分析工具包括:vmstat.sar.iostat.netstat.free.ps.top.mpstat以及第三方开发工具,如:dstat.collectl及淘宝的开源监控项目t ...

  9. ADC的参数分析以及采样分析

    A/D变换器的性能参数 2.1 采样速率与分辨率 采样速率指模数变换的速率,而分辨率表示变换输出数字数据的比特数.这2个参数很重要,因为较高的采样速率与分辨率对应了高信噪比和较宽的信号输入带宽.近几年 ...

  10. 室外建筑表现3Dmax和vray常用材质参数设置

    一. 木纹材质调整方法: 1. 木纹材质的肌理调整: A.使用过度色通道贴图后加入凹凸通道贴图,使木纹有凹凸感,肌理更明显凹凸通道强度通常为30% B.材质球的高光强度(specular level: ...

最新文章

  1. mysql 怎么格式化输出_怎么格式化MySQL输出代码
  2. 如何理解LSTM后接CRF?
  3. ajax跨域请求(cors实现),ajax跨域请求(CORS实现)
  4. ADO.NET+Access: 3,参数 @departmentName 没有默认值
  5. 亿嘉和机器人上市了吗_亿嘉和上半年收入持续增长,拟7亿元定增加码主业研发...
  6. [C++]踩坑日记:内存别名
  7. 这本Python入门畅销书《“笨办法”学python 3》,不仅仅是一本书
  8. 李秋豪计算机系统,CS:APP3e 深入理解计算机系统_3e Y86-64模拟器指南
  9. Twincat下载,下载老版本的twincat软件
  10. 效果图软件选择手册 | Lumion、VRay、Conora、Enscape...你适合用什么软件做效果图?
  11. 人脸识别实名制管理,推动智慧工地建设发展
  12. 奇迹服务器gs无响应,奇迹gs远程连接服务器
  13. 《阿里云周刊》第4期:开放共享,网商银行的运营探索及技术支撑
  14. 64位Windows 8 运行Trial-Reset,但是提示缺少“MSCOMCTL.OCX”的解决方法
  15. 考研英语近义词与反义词·八
  16. PyMySQL安装问题解决办法-UnicodeDecodeError:gbk codec cannot decode byte 0xaf
  17. 显卡知识扫盲 为你讲述流水线的发展与未来
  18. SAP ABAP(增强技术) BADI自己的一些了解,以及用法
  19. Dog Whisper--报告狗班长——狗的心理专家
  20. kafka-整理-重试机制

热门文章

  1. Python获取字符串中特定的内容
  2. 高精度整数算法总结,尤其是乘法,面向小白版
  3. ios html5键盘弹出视图上移,ios 软键盘弹出, 页面整体上移问题
  4. openssl的部分使用例子
  5. drop python_用Python做自己的AirDrop 1 - 环境搭建
  6. Linux【网络库】| 【02 <netdb.h>】以及网络常用结构体
  7. 光线CMS系统,如何显示幻灯片
  8. 未知病毒篡改火狐浏览器主页修复方法
  9. 某医院门诊预约系统/医院预约挂号系统
  10. 苹果战世界:苹果史上27大口水战