要可以分为以下三类:
标准参数(-)
,所有的JVM实现都必须实现这些参数的功能,而且向后兼容。非标准参数(-X)
,默认JVM实现这些参数的功能,但是并不保证所有JVM实现都满足,且不保证向后兼容。非Stable参数(-XX)
,此类参数各个JVM实现会有所不同,将来这一类参数可以说是我们刚刚开始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。
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")
获得。
3 非标准参数
非标注的参数主要是关于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
当我们没有设置-XX:NewRatio=4 -XX:SurvivorRatio=8
时,使用官方默认的情况如下:
上图可以看出,新生代(Eden Space + Survivor 0 + Survivor 1):老年代(Old Gen)≈ 1:2。
当我
从上图可知,堆的信息是正确的。
- -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自己决定。
: