JVM启动参数
JVM启动参数详解
JVM是虚拟机标准,不同的厂商会根据JVM标准来生产自己的JVM虚拟机(又称Hotspot虚拟机),称之为JVM实现,目前主流的是Oracle JVM,本文参考了Orcale Java8官方文档。
参数类别
- 标准参数 所有JVM实现都必须支持这些启动参数,且向下兼容,参数前缀为-
- 非标准参数:大多数JVM实现都支持这些参数,但不保证向下兼容,参数前缀为-X或-XX
常用标准参数
-cp classpath:指定程序依赖的class文件或jar包所在路径,未指定则默认为当前目录
**-jar: **运行一个jar包
-verbose:class :显示JVM已加载的类,当jvm报告说找不到类或者类冲突时可此进行诊断
-verbose:gc:显示每次GC的相关情况
-verbose:jni: 输出native方法调用的相关情况,一般用于诊断jni调用错误信息
常用非标准参数
与内存相关的参数
-Xms512m:指定堆初始大小为512MB。
-Xmx512m:设置堆最大为512MB,oracle官方建议初始堆和最大堆值应一致
-Xss1m:设置线程栈大小为1MB。JDK5.0以后每个线程栈大小为1MB,之前每个线程栈大小为256K。应当根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。需要注意的是:当这个值被设置的较大(例如>2MB)时将会在很大程度上降低系统的性能。
-Xmn300m:设置年轻代的初始值以及最大值为300MB。在整个堆内存大小确定的情况下,增大年轻代将会减小年老代,反之亦然。此值关系到JVM垃圾回收,对系统性能影响较大,官方推荐配置为整个堆大小的一半或四分之一。
-XX:NewSize=300MB:设置年轻代初始值为300MB,当-XX:MaxNewSize参数未被设置时,该参数相当于-Xmn。
-XX:MaxNewSize=1024m:设置年轻代最大值为300MB。
-XX:MetaspaceSize=256m:设置永久代默认值为256MB,当该空间第一次被填满时会触犯垃圾回收,随后系统会根据MaxMetaspaceSize的值来考虑是否为永久代扩容。
-XX:MaxMetaspaceSize=256m:设置持久代最大值为256MB,持久代用于存放class元数据,默认情况下是没有限制的,所以最好别设置改值。
-XX:NewRatio=2:设置年轻代(包括1个Eden和2个Survivor区)与老年代的比值为1:2,默认值为2,即新生代占老年代的1/2,占整个堆的1/3,Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。
-XX:SurvivorRatio=8:设置年轻代中Survivor区与Eden的比值为1:8,默认值为8。JVM堆内存年轻代中默认有2个大小相等的Survivor区,所以1个Survivor区占整个年轻代大小的1/18。
-XX:MaxTenuringThreshold=7:表示一个对象如果在Survivor区移动了7次还没有被垃圾回收就进入年老代。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代,对于需要大量常驻内存的应用,这样做可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代存活时间,增加对象在年轻代被垃圾回收的概率,减少Full GC的频率,这样做可以在某种程度上提高服务稳定性。并行回收器该值默认值15,CMS回收器,该值默认时6。
-XX:TargetSurvivorRatio=90:允许90%的Survivor区被占用(JVM默认为50%)。提高对于Survivor区的使用率
与垃圾回收器相关的参数
串行垃圾回收器
任何时刻都是使用一个线程执行GC操作,这种GC在线程间通信没有大的开销的应用会有相对不错的运行效率。最适合单处理器的系统;多处理器系统对这种GC而言并不能提升收集的效率。
-XX:+UseSerialGC:采用串行回收器,作用于年轻代以及老年代,该回收器适用于小的简单的应用程序。
并行垃圾回收器
以并行的方式运GC, 能较大的减少GC的开销,其诞生的初衷就是专门给运行在多处理器,提高系统吞吐量。
-XX:+UseParallelGC:采用并行回收器,仅作用于年轻代,具有高吞吐量的特性。
-XX:+UseParallelOldGC:对老年代采用并行回收器。当采用该GC时,年轻代将自动采用ParallelGC。
-XX:+UseParNewGC:采用并行垃圾回收器,仅作用于年轻代,SerialGC的多线程版。
-XX:ParallelGCThreads=threads:设置并行垃圾回收器使用的线程数量。
并发垃圾回收器(提高响应时间)
-XX:+UseConcMarkSweepGC:使用CMS回收器用于回收老年代。Oracle建议在吞吐量垃圾收集器(ParallelGC)无法满足应用程序延迟要求时使用CMS垃圾收集器器,或使用G1回收器。采用该GC后,年轻代将自动使用ParNewGC。
-XX:ConcGCThreads=*threads:指定并发线程数量。CMS工作分好几个阶段,在初始标记的时候,需要中断所有用户线程,在并发标记阶段,用户线程和标记线程并发执行。
下一代垃圾回收器
-XX:+UseG1GC:用于服务器端的垃圾回收器,既能满足应用程序的低时延要求(垃圾回收器启动时会暂定应用程序),既能提高吞吐量。
-XX:+ScavengeBeforeFullGC:设置年轻代GC优于Full GC执行,默认是开启的。
-XX:SoftRefLRUPolicyMSPerMB=0:软引用对象在最后一次被访问后能存活0毫秒(JVM默认为1000毫秒)
-XX:TargetSurvivorRatio=90:允许90%的Survivor区被占用(JVM默认为50%)。提高对于Survivor区的使用率
与调试相关的参数
-Xloggc:file:与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。 若与verbose命令同时出现在命令行中,则以-Xloggc为准
-Xprof: 跟踪正运行的程序,并将跟踪数据在标准输出输出;适合于开发环境调试
-XX:HeapDumpPath=./java_pid.hprof:指定Dump堆内存时的路径
-XX:+HeapDumpOnOutOfMemoryError: 当首次遭遇OOM时导出此时堆中相关信息
-XX:+PrintClassHistogram:按下 Ctrl+Break 后打印堆内存中类实例的柱状信息,同JDK的 jmap -histo 命令
-XX:-PrintConcurrentLocks:按下 Ctrl+Break 后打印线程栈中并发锁的相关信息,同JDK的 jstack -l 命令
-XX:+PrintGC:每次GC时打印相关信息
-XX:+PrintGCApplicationStoppedTime:打印应用程序暂停时间,即GC时间
-XX:+PrintGCApplicationConcurrentTime:打印自上一次GC后(GC会使应用程序暂停),应用程序运行时间
-XX:+PrintGCDetails:每次GC时打印详细信息
-XX:+PrintGCTimeStamps:打印每次GC的时间戳
-XX:+TraceClassLoading:跟踪类的加载信息
-XX:+TraceClassLoadingPreorder:跟踪被引用到的所有类的加载信息
-XX:+TraceClassResolution:跟踪常量池
-XX:+TraceClassUnloading:跟踪类的卸载信息
参考
java8启动参数
full GC触犯条件
垃圾回收
JVM启动参数1
JVM启动参数2
JVM启动参数3
oracle java7 HOtspot选项