Java虚拟机 参数
时间:2017/5/15 19:06:07
参考:
- 《深入理解JAVA虚拟机》第二版 [周志明]
虚拟机参数配置#
虚拟机垃圾回收器配置#
-XX:+UseSerialGC
新生代使用Seriol
老年代使用Serial Old
。-XX:+UseParNewGC
新生代使用ParNew
老年代使用Serial Old
。-XX:+UseConcMarkSweepGC
新生代使用ParNew
老年代使用CMS
。-XX:+UseParallelGC
新生代使用Parallel Scavenge
老年代使用Serial Old
。-XX:UseParallelOldGC
新生代使用Parallel Scavenge
老年代使用Parallel Old
。-XX:SurvivorRatio
新生代Eden
区域和Survivor
区域比率配置。-XX:PretenureSizeThreshold
直接晋升到老年代的对象大小。-XX:MaxTenuringThreshold
晋升到老年代对象的年龄。-XX:UseAdapttiveSizePolicy
动态调整Java堆中各区域大小以及进入老年代的年龄。-XX:HandlePromotionFailure
是否允许担保失败,当老年代剩余空间进行担保不足时,是否尝试进行担保,如果失败则会执行Full GC
。-XX:ParallelGCThreads
并行GC时的内存回收线程数。-XX:GCTimeRatio
GC 占总时间的比值,默认 99%,即允许 1% 的GC时间。在Parallel Scavenge
垃圾收集器有用。-XX:MaxGcPauseMillis
最大GC停顿时间,在Parallel Scavenge
垃圾收集器有用。-XX:CMSInitiatingOccupaneyFraction
CMS 在老年代占用超过多少时进行垃圾回收,默认 68%。-XX:UseCMSCompactAtFullCollection
设置 CMS 是否在垃圾回收完成时进行一次内存整理。-XX:CMSFullGcsBeforeCompaction
设置 CMS 在若干次垃圾回收后再进行内存整理。
GC 日志相关配置#
-XX:+PrintGC
输出GC日志(简要信息)。-XX:+PrintGCDetails
输出详细日志。-XX:+PrintGCTimeStamps
输出GC时间戳。-XX:+PrintGCDateStamps
输出GC时间戳,日期形式。-XX:+PrintHeapAtGC
在进行GC前后打印出堆信息。-Xloggc:./gc.log
指定GC日志文件位置。-XX:+PrintGCApplicationConcurrentTime
打印应用程序的执行时间。-XX:+PrintGCApplicationStoppedTime
打印程序由于GC而停顿的时间。-XX:+PrintReferenceGC
跟踪弱引用。
StringTable#
StringTable 用于存放类加载时的字符串字面量,String.intern()
方法可以把字符串放入 StringTable中。底层使用数组加链表实现。存在垃圾回收。
-
-XX:StringTableSize=N
控制StringTable的大小(数组大小),如果设置的太小则会导致链表长度过长,影响StringTable的性能。 -
-XX:+PrintStringTableStatistics
输出StringTable信息。
其它#
堆内存:存储对象实例。多线程共享。
- -Xms20M 初始化堆内存大小(最小)
- -Xmx20m 最大堆内存大小(最大)
-
-Xmn10m 新生代大小(剩余的为老年代)
- -XX:SurvivorRation=8 Eden:ToSurvivor:FromSurvivor空间比是
8:1:1
- -XX:SurvivorRation=8 Eden:ToSurvivor:FromSurvivor空间比是
-
-XX::+/-UseTLAB
开启TLAB之后,每个线程会在堆中拥有一块私有的区域,用于对象创建,避免不同线程之间的资源竞争问题。
方法区:俗称永久代,1.8取消了方法区改为Metaspace。存储已被虚拟机加载的类信息,常量、静态变量、即时编译后的代码数据等(方法名、类名等)。多线程共享。
- -XX:PermSize=20m 方法区大小
- -XX:MaxPermSize=20m 最大方法区大小
- -XX:MaxMetaspaceSize=128m 设置元空间大小
虚拟机栈:每个方法在创建的时候都会创建一个栈帧,用于存放局部变量表,操作数栈,动态链接,方法出口等信息。
- -Xss1m 调节线程堆栈大小
直接内存:不受Java虚拟机管理,属于操作系统内存。
- -XX:MaxDirectMemorySize=10M 设置直接内存大小,默认和Java堆大小相同。
性能调优#
-
对象优先分配在新生代的Eden区。
-XX: PretenureSizeThreshold=<byte size>
使大于这个值得对象直接进入老年区(只对Serial和ParNew两个垃圾回收器起作用)
-
长期存活的对象会进入老年区。
- -XX:MaxTenuringThreshold=15 默认值15。对象在Eden中出生,第一次Minor GC之后仍然存活,并且能被Survivor容纳,将被移动到Survivor区,并且年龄设置为1,对象在Survivor中每经历过一次Minor GC对象的年龄就增加一,当年龄达到设定值之后就会进入老年区。
-
动态年龄判断,如果Survivor空间中相同年龄的所有对象的大小大于Survivor空间的一半,年龄大于或等于该年龄的对象直接进入老年区。
-
空间分配担保,当老年代最大可用连续空间小于新生代多有对象占用空间大小,可能需要一次Full GC。
-
-XX:HandlePromotionFailure=false 空间担保不可行的情况下是否允许冒险。
-
内存限制:32位windows每个进程最大2GB内存,Linux和Unix系统,可以提升至3GB甚至4GB。32位虚拟机最大内存4GB(2^32)内存。
其他配置信息#
- -Xverify:none 是否在编译前检查类。
- -verbose:gc 显示gc信息。
- -Dsun.awt.keepWorkingSetOnMinimize=true 设置程序可以在后台运行,防止程序最小化之后,操作系统把内存数据转移到磁盘中,导致程序运行缓慢的问题
- -Dcom.sun.management.jmxremote 允许JMX远程连接
- -XX:+HeapDumpOnOutOfMemoryError 虚拟机出现内存溢出异常时Dump出当前的内存堆转储快照以便时候分析
- -XX:+UseCompressedOops:普通对象指针压缩功能(建议维持虚拟机默认的机制,不推荐使用)