本文共 15200 字,大约阅读时间需要 50 分钟。
JVM 启动时会带有很多的启动参数,Java命令本身就是一个多参数的启动命令
java [options] classname [args] java [options] -jar filename [args] 1> 标准参数 (Standard Option)
指定 JVM 的启动模式是client模式还是server模式,具体就是 Java HotSpot Client(Server) VM 版本。目前64位的JDK启动,一定是server模式,会忽略这个参数
设置系统属性,设置后的属性可以在代码中 System.getProperty 方法获取到
# java -Dconf.location=d:\temp Properties p = System.getProperties(); System.out.println(">>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<"); System.out.println(System.getProperty("conf.location")); System.out.println(System.getenv("path")); java.runtime.name=Java(TM) SE Runtime Environment sun.boot.library.path=/Library/Java/JavaVirtualMachines/jdk... java.vm.version=25.131-b11 java.vm.vendor=Oracle Corporation java.vendor.url=http://java.oracle.com/ java.vm.name=Java HotSpot(TM) 64-Bit Server VM sun.java.launcher=SUN_STANDARD sun.os.patch.level=unknown java.vm.specification.name=Java Virtual Machine Specification user.dir=/Users/mew/Desktop/AllMyFile/CompanyR... java.runtime.version=1.8.0_131-b11 java.awt.graphicsenv=sun.awt.CGraphicsEnvironment java.endorsed.dirs=/Library/Java/JavaVirtualMachines/jdk... java.io.tmpdir=/var/folders/sv/47lnvzj56nqf5njhw4ldn... java.vm.specification.vendor=Oracle Corporation java.library.path=/Users/mew/Library/Java/Extensions:/L... java.specification.name=Java Platform API Specification sun.management.compiler=HotSpot 64-Bit Tiered Compilers http.nonProxyHosts=local|*.local|169.254/16|*.169.254/16 java.awt.printerjob=sun.lwawt.macosx.CPrinterJob java.specification.version=1.8 java.class.path=/Library/Java/JavaVirtualMachines/jdk... java.vm.specification.version=1.8 java.home=/Library/Java/JavaVirtualMachines/jdk... sun.java.command=com.chenshun.test.jvm.t3.T3 java.specification.vendor=Oracle Corporation awt.toolkit=sun.lwawt.macosx.LWCToolkit java.ext.dirs=/Users/mew/Library/Java/Extensions:/L... sun.boot.class.path=/Library/Java/JavaVirtualMachines/jdk... java.vendor=Oracle Corporation java.vendor.url.bug=http://bugreport.sun.com/bugreport/ sun.io.unicode.encoding=UnicodeBig socksNonProxyHosts=local|*.local|169.254/16|*.169.254/16 ftp.nonProxyHosts=local|*.local|169.254/16|*.169.254/16 >>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<< 这个参数指定JVM启动的环境模式,默认是32位启动,如果系统不支持,那么会报错,-d64模式 和 -server模式 是绑定的,也就是说 -d64 声明就默认是 server模式
disableassertions[:[packagename]...|:classname]
-da[:[packagename]...|:classname]
关闭指定包或类下的assertion,默认是关闭的
关闭系统包类下的 assertion,默认是关闭的
-enableassertions[:[packagename]...|:classname]
-ea[:[packagename]...|:classname]
System.out.println("断言1没有问题,Go!"); System.out.println("\n-----------------\n"); assert false : "断言失败,此表达式的信息将会在抛出异常的时候输出!"; System.out.println("断言2没有问题,Go!"); // Exception in thread "main" java.lang.AssertionError: 断言失败,此表达式的信息将会在抛出异常的时候输出! // at com.chenshun.test.jvm.t3.T4.main(T4.java:19) 注 : 在 Test 环境下,Intellij 默认会添加 -ea 1> assert关键字 需要在运行时候显式开启才能生效,否则你的断言就没有任何意义,而现在主流的 Java IDE工具默认都没有开启 -ea 断言检查功能。这就意味着如果使用 IDE工具编码,调试运行时候会有一定的麻烦。并且,对于 Java Web应用,程序代码都是部署在容器里面,没法直接去控制程序的运行,如果一定要开启 -ea 的开关,则需要更改 Web容器的运行配置参数,这对程序的移植和部署都带来很大的不便
2> 用 assert 代替 if 是陷阱之二。assert 的判断和 if语句差不多,但两者的作用有着本质的区别 : assert关键字本意上是为测试调试程序时使用的,但如果不小心用 assert 来控制了程序的业务流程,那在测试调试结束后去掉 assert关键字就意味着修改了程序的正常的逻辑
3> assert断言失败将面临程序的退出,这在一个生产环境下的应用是绝不能容忍的,一般都是通过异常处理来解决程序中潜在的错误,但是使用断言就很危险,一旦失败系统就挂
4> assert 既然是为了调试测试程序用,不在正式生产环境下用,那应该考虑更好的测试 JUint 来代替其做用,JUint 相对 assert关键的所提供的功能是有过之而无不及,当然完全可以通过IDE debug来进行调试测试,因此更不需要使用 assert关键字
这些组合都是用来展示信息的,class展示的每个class的信息,gc展示每个GC事件的信息,jni开启展示JNI调用信息
`
-verbose:gc : 输出虚拟机中GC的详细情况 [GC (Allocation Failure) 50207K->47754K(196608K), 0.0390103 secs] [GC (Allocation Failure) 97920K->96907K(196608K), 0.0366426 secs] [Full GC (Ergonomics) 96907K->96793K(196608K), 0.0256122 secs] [Full GC (Ergonomics) 147980K->145945K(196608K), 0.0270386 secs] [Full GC (Ergonomics) 185841K->184845K(196608K), 0.0126320 secs] [Full GC (Ergonomics) Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at com.chenshun.test.jvm.t3.T1.main(T1.java:20) 186893K->186893K(196608K), 0.0024038 secs] [Full GC (Allocation Failure) 186893K->186893K(196608K), 0.0022883 secs] Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode) 2> 非标准参数 (Non-Standard Options) : 非标准参数主要是针对官方 JVM 也就是 HotSpot,当然各家自研的 JVM 也有特定的非标准参数
著名的-X参数,就是一个help,展示所有-X开头的参数说明
禁止后台编译,将编译过程放到前台任务执行,JVM 默认会将编译任务当做后台任务执行,这个参数等价于 -XX:-BackgroundCompilation
在 interpreted-only模式运行程序,编译为 native的模式不再生效,所有的字节码都在解释器环境下解释执行
打印一个更详细的java版本信息,执行后退出,将不会调用任何代码
Java HotSpot(TM) 64-Bit Server VM (25.131-b11) for bsd-amd64 JRE (1.8.0_131-b11), built on Mar 15 2017 01:32:22 by "java_re" with gcc 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00) 设置 gc日志文件,gc相关信息会重定向到该文件 (就是将 gc 信息写入到文件中),这个配置如果和 -verbose:gc 同时出现,会覆盖 -verbose:gc参数
-Xloggc:/Users/mew/Desktop/gc.log 为JIT编译的代码设置最大的code cache。默认的设置是240m,如果关闭了tiered compilation,那么默认大小是48m。这个参数和-XX:ReservedCodeCacheSize是等价的
用解释器执行所有的字节码,除了被编译为 native code 的 hot method
设置初始最大的年轻代堆大小,比如 -Xmn256m
设置最大的内存分配大小。一般的服务端部署,-Xms和-Xmx设置为同样大小。与-XX:MaxHeapSize具有同样的作用
关闭对class的GC。这样设置可以节约一点GC的时间,不过带来的影响就是class永驻内存,不当的使用会导致OOM风险
查看 settings 信息,category 可以是 all、locale、properties 和 vm几部分
设置 thread stack大小,一般默认的几个系统参数如下 :
Linux/ARM (32-bit): 320 KB
Linux/i386 (32-bit): 320 KB
Linux/x64 (64-bit): 1024 KB
Oracle Solaris/i386 (32-bit): 320 KB
Oracle Solaris/x64 (64-bit): 1024 KB
设置字节码校验器的模式,默认是remote,即只校验那些不是通过bootstrap类加载器加载的字节码。而还有一个模式还all,即全部都校验。虽然还有一个模式是none,但是本质上jvm不生效这个参数。因为字节码校验是非常重要的,如果关闭,将可能导致class文件格式就是错的,这对于系统稳定和安全来说有重大风险
<1> -Xms20M : 设置堆容量的最小值为20M,必须以M为单位
<2> -Xmx20M : 设置堆容量的最大值为20M,必须以M为单位。将 -Xmx 和 -Xms 设置为一样可以避免堆自动扩展,大的项目 -Xmx 和 -Xms 一般都要设置到 10G、20G 甚至还要高
<4> -Xss200k : 设置虚拟机栈的大小为 200k
Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. The stack size specified is too small, Specify at least 160k 如果引用数量超过栈可承受的最大值将会出现 java.lang.StackOverflowError 异常
Exception in thread "main" java.lang.StackOverflowError <5> -Xoss128k : 设置本地方法栈的大小为 128k。不过 HotSpot 并不区分虚拟机栈和本地方法栈,因此对于 HotSpot 来说这个参数是无效的
3> 高级运行时参数 (Advanced Runtime Options)
这类参数控制 Java HotSpot VM 在运行时的行为
-XX:+DisableAttachMechanism
设置JVM的attach模式,如果启动了这个参数,jvm将不允许attach,这样类似jmap、JProfiles 等程序就无法使用
当不可恢复的错误发生时,错误信息记录到哪个文件,默认是在当前目录的一个叫做 hs_err_pid pid.log的文件。如果指定的目录没有写权限,这时候文件会创建到 /tmp 目录下。使用如下:
-XX:ErrorFile=/Users/mew/Desktop/java_error.log -XX:MaxDirectMemorySize=size
为 NIO 的 direct-buffer 分配时指定最大的内存大小,默认是0,意思是 JVM自 动选择 direct-buffer的大小,使用如下 :
-XX:MaxDirectMemorySize=1m -XX:ObjectAlignmentInBytes=alignment
java对象的内存对齐大小,默认是8字节,JVM 实际计算堆内存上限的方法是 4GB * ObjectAlignmentInBytes
在 jvm 出现错误(不可恢复)的时候,执行哪些命令
-XX:OnError="gcore %p;dbx - %p" -XX:OnOutOfMemoryError=string
在 jvm 出现 OOM 错误的时候,执行哪些命令
禁止使用压缩命令来压缩指针引用。压缩指针是默认开启的,如果使用压缩命令压缩指针,可以在 JVM 内存小于 32G 时做到内存压缩,即在64位机器上做到内存指针对齐只占用32位而不是64位。这样对于小于32G的JVM有非常高的性能提升,该参数只在64位JVM有效
4> 高级 JIT 编译器参数 (Advanced JIT Compiler Options)
这部分的参数主要在动态 just in time编译 时用到
-XX:+BackgroundCompilation
后台编译,默认是开启的,如果要关闭,使用 -XX:-BackgroundCompilation 或者 -Xbatch
-XX:CICompilerCount=threads
编译时的编译器线程数。server版的JVM默认设置为2,client版本默认设置为1。如果tiered编译开启,则会伸缩到核数个线程
XX:CodeCacheMinimumFreeSpace=size
编译使用的最小空闲空间。默认是500KB,如果最小空闲空间不足,则编译会停止
-XX:CompileThreshold=invocations
编译前解释型方法调用次数。设置这个值,在编译前,会用解释器执行方法若干次用于收集信息,从而可以更高效率的进行编译。默认这个值在JIT中是10000次。可以通过使用 -Xcomp参数来禁止编译时的解释执行
-XX:InitialCodeCacheSize=size
初始化的code cache的大小,默认500KB。这个值应该不小于系统最小内存页的大小
设置最大内联方法的代码长度,默认是1000字节,只有小于这个设置的方法才会被编译内联
编译时日志输出,在编译时会有一个 hotspot.log 的日志输出到当前工作目录下。可以用 -XX:LogFile 指定不同的目录。默认这个参数是关闭的,即编译日志不输出,这个参数需要和 -XX:UnlockDiagnosticVMOptions 一起使用,也可以使用 -XX:+PrintCompilation 选项在控制台打印编译过程信息
编译内联的方法的最大byte code大小。默认是35,高于35个字节的字节码不会被内联
-XX:+OptimizeStringConcat
通过使用外部的 disassembler.so库打印汇编的字节码和 native方法来辅助分析。默认是不开启的,需要和 -XX:UnlockDiagnosticVMOptions 一起使用
-XX:ReservedCodeCacheSize=size
设置为 JIT编译代码的最大代码cache大小。这个设置默认是240MB,如果关掉了tiered编译,则大小是48MB。这个设置必须比初始化的 -XX:InitialCodeCacheSize=size 设置值大
关闭 tiered编译,默认是开启的,只有 Hotspot支持这个参数
-XX:+UseCodeCacheFlushing
支持在关闭编译器之前清除code cache,默认是开启的,要关闭就把+换成-
5> 高级服务能力参数 (Advanced Serviceability Options)
-XX:+ExtendedDTraceProbes
-XX:+HeapDumpOnOutOfMemory
设置当 java.lang.OutOfMemoryError 发生时,将 heap 内存 dump 到当前目录的一个文件,默认是不开启的
设置在 dump heap 时将文件dump到哪里,默认是当前目录下 java_pidpid.hprof这样形式的文件
-XX:HeapDumpPath=/var/log/java/java_heapdump.hprof 指定日志数据被记录在哪里,默认是在当前目录的 hotspot.log 下
-XX:LogFile=/var/log/java/hotspot.log 支持打印类实例的直方图,在按下 ctrl+c 时 (SIGTERM) 触发,默认是关闭的,等价于运行 jmap -histo 命令或者 jcmd pid GC.class_histogram命令
-XX:+PrintConcurrentLocks
支持打印 java.util.concurrent 的锁信息,在 SIGTERM 时触发,默认关闭,等价于运行 jstack -l 或者 jcmd pid Thread.print -l命令
-XX:+UnlockDiagnosticVMOptions
解锁对 JVM 进行诊断的选项参数,默认是关闭的,开启后支持一些特定参数对 JVM 进行诊断
6> 高级垃圾回收参数 (Advanced Garbage Collection Options)
java堆内存优化,默认是关闭的,如果开启后,针对一些长时间运行的且有密集的内存分配操作,JVM根据系统cpu和内存的配置参数来进行优化
支持在 JVM 启动时 touch 每一页,这样做会导致每页都会进入内存,可以用来模拟测试长时间运行的任务,将虚拟内存全部映射到物理内存,默认是关闭的
-XX:+CMSClassUnloadingEnabled
-XX:CMSExpAvgFactor=percent
设置一个时间百分比,用来加权并发回收统计的指数平均的样本,默认是25%
-XX:CMSInitiatingOccupancyFraction=percent
设置一个年老代的占比,达到多少会触发CMS回收。默认是-1,任何一个负值的设定都表示了用 -XX:CMSTriggerRatio 来做真实的初始化值
-XX:CMSInitiatingOccupancyFraction=20 -XX:+CMSScavengeBeforeRemark
开启功能在 CMSremark 前进行 Scavenge,默认是关闭的
-XX:CMSTriggerRatio=percent
设置一个在 CMS 开始前的内存的触发百分比,针对的是由 -XX:MinHeapFreeRatio 分配的内存,默认是 80
-XX:ConcGCThreads=threads
设置支持并发 GC 的线程数,默认值依赖于给 JVM 的 CPU数目
关闭显式 GC 调用,即关闭 System.gc(),默认是可以调用的
-XX:+ExplicitGCInvokesConcurrent
支持通过 System.gc() 来做并发的 GC,默认是不支持的,该参数一定要和 -XX:+UseConcMarkSweepGC 一起使用
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
支持通过 System.gc() 来做并发的GC并且卸载类,默认是不支持的,该参数一定要和 -XX:+UseConcMarkSweepGC 一起使用
-XX:G1HeapRegionSize=size
设置在使用G1收集器时Java堆被划分为子区域的大小,在 1MB 到 32MB 之间,默认会根据Java堆的大小自动检测
打印出哪些 region 是被分配的,哪些是被G1取回的,默认是关闭打印的
-XX:G1ReservePercent=percent
设置一个堆内存的百分比用来作为false ceiling,从而降低使用G1时晋升失败的可能性,默认是10%
设置初始堆内存大小,需要设置为0或者1024的倍数,设置为0说明初始堆大小等于年轻代加年老代的大小
-XX:InitialSurvivorRatio=ratio
设置初始的 survivor 空间占比,当使用 throughput型的 GC 时有效 (即 -XX:+UseParallelGC 或 -XX:+UseParallelOldGC)。运行过程中 survivor 空间占比会自动根据应用运行调整,如果关闭自适应调整策略(-XX:-UseAdaptiveSizePolicy),则XX:SurvivorRatio参数会成为 survivor空间占比。计算 survivor 空间大小,依赖 young 的空间大小,计算公式如下
其中Y是young空间大小,R是survivor空间占比。一个例子就是如果young空间大小是2MB,而survivor默认占比是8,那么survivor的空间就是0.2MB
-XX:InitiatingHeapOccupancyPercent=percent
设置一个触发并发GC的堆占用百分比,这个值对于基于整体内存的垃圾回收器有效,比如G1,默认是45%,如果设置为0表示无停顿GC
-XX:MaxGCPauseMillis=time
设置一个最大的GC停顿时间 (毫秒),这是个软目标,JVM会尽最大努力去实现它,默认没有最大值设置
设置最大堆大小,这个值需要大于2MB,且是1024的整数倍。等价于-Xmx
-XX:MaxHeapFreeRatio=percent
设置在一次 GC 后最大的堆空闲空间占比,如果空闲堆空间超过这个值,堆空间会被收缩,默认是70%
-XX:MaxMetaspaceSize=size
为类的元数据进行分配的 metaspace 最大 native 内存大小,默认情况这个值无限制,该值依赖于当前的 JVM 其他在运行的JVM和系统可用内存
-XX:MaxTenuringThreshold=threshold
设置在自适应GC大小的使用占有最大阈值,默认对于 parallel(throughput)的是15,对于 CMS 的是6
设置一个 metaspace 的大小,第一次超出该分配后会触发GC,默认值依赖于平台,该值会在运行时增加或减少
-XX:MinHeapFreeRatio=percent
设置在一次 GC 后最小的空闲堆内存占比,如果空闲堆内存小于该值,则堆内存扩展,默认是40%
设置初始的年轻代的大小。年轻代是分配新对象的地方,是 GC经常发生的地方。设置太低,会频繁 minor GC,设置太高的话就只会发生Full GC,Oracle推荐设置为整体内存的一半或者1/4,该参数等价于-Xmn
-XX:ParallelGCThreads=threads
-XX:+ParallelRefProcEnabled
-XX:+PrintAdaptiveSizePolicy
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCTaskTimeStamps
打印每个独立的 GC 线程任务的时间戳,默认不打印
-XX:+PrintStringDeduplicationStatistics
打印细节的deduplication信息,默认不打印
-XX:+PrintTenuringDistribution
Desired survivor size 48286924 bytes, new threshold 10 (max 10) age 1: 28992024 bytes, 28992024 total age 2: 1366864 bytes, 30358888 total age 3: 1425912 bytes, 31784800 total 其中 age1 是最年轻的 survivor,age2存活了2代,以此类推,默认该项关闭
-XX:+ScavengeBeforeFullGC
在每次 Full GC 前做一次年轻代的 GC,该项默认是开启的
-XX:SoftRefLRUPolicyMSPerMB=time
设置一个软引用对象在上次被引用后在堆内存中保存的时间。默认是每1MB保存1秒钟。该参数对于client模式和server模式有不同的动作,因为client模式JVM在回收时会强制flush掉软引用,然而server模式会尝试先扩容堆空间
-XX:StringDeduplicationAgeThreshold=threshold
string对象到达特定的age后会去除重复数据。默认是3,jvm中每次gc后存活的对象,age会加一。string对象在晋升为年老代之前都是去除重复数据的候选对象
-XX:TargetSurvivorRatio=percent
设置在YGC后的期望的survivor空间占比。默认是50%
设置thread-local allocation buffer (TLAB)的初始化大小
-XX:+UseAdaptiveSizePolicy
-XX:+UseCMSInitiatingOccupancyOnly
设置使用占用值作为初始化CMS收集器的唯一条件。默认是不开启
设置让CMS也支持老年代的回收。默认是不开启的,如果开启,那么-XX:+UseParNewGC也会自动被设置。Java 8 不支持 -XX:+UseConcMarkSweepGC -XX:-UseParNewGC 这种组合
设置使用G1作为GC收集器。G1比较推荐在大堆应用场景下使用 (大于6GB)
设置一种策略用来设置一个时间比率来限制在OOM之前的GC时间。默认是开启的,并行GC时如果有多于98%以上的时间用来gc就会抛出OOM。当堆空间较小时这个参数有助于保护应用程序不至于长时间的停顿没有进展
使用 NUMA 开启性能优化。默认不开启,该项只有在开启 -XX:+UseParallelGC 后才有效
支持并行的垃圾收集器,即 throughput 垃圾收集。这可以在多核处理器下提升垃圾收集性能。默认不开启,收集器由系统根据 JVM 和机器配置自动选择。开启后 -XX:+UseParallelOldGC 选项也自动开启
支持在年轻代用多线程进行垃圾收集。默认不开启,使用 -XX:+UseConcMarkSweepGC 时会自动被开启
在 Linux环境下支持 JVM 使用共享内存来设置大页
-XX:+UseStringDeduplication
支持string的去重存储。默认关闭,要使用该选项,必须使用G1垃圾回收器 -XX:+UseG1GC
在年轻代支持 thread-local 分配 block,默认开启
转载地址:http://ragab.baihongyu.com/