1 栈:
-Xss : -Xss1m, 每个线程的栈大小,jdk5之后,默认1m。相同物理内存下,减小Xss可生成更多线程, 操作系统对一个进程内的线程数是有限制的,不能无限生成,经验值在3000~5000左右。
-XX:ThreadStackSize=size : 功能等同于-Xss,默认=0,表示使用默认的stack size[Sparc: 512, Solaris Intel: 256, Sparc 64bit: 1024 all others 0]
一般只使用Xss即可。
2 堆:
-Xms : -Xms4096m, JVM堆初始内存,默认是物理内存的1/64。空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。
-Xmx : -Xmx4096m,JVM堆最大内存,默认是物理内存的1/4。 空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。
服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小,JVM重新分配内存。
-XX:MaxHeapSize : 等同于-Xms
JVM堆(Heap)= 年轻代(Young) + 老年代(Tenured)+ 方法区(永生代/持久代)
持久代一般固定大小为64m,增大年轻代后,将会减小年老代大小。此值对系统性能影响较大。
2.1 年轻代:
-Xmn:-Xmn2g,年轻代大小, = eden + 2 survivor space, Sun官方推荐配置为整个堆的1/4-1/2之间,比如3/8。
可以用 -XX:NewSize和 -XX:MaxNewSize精确设置代替-Xmn. 所以 一般不设置此项。
-XX:NewSize : 年轻代初始内存,等效于-Xmn,需要小于Xms。
-XX:MaxNewSize : 年轻代最大内存,应该小于Xmx。
-XX:NewRatio :年轻代(Eden + 2 Survivor)与年老代的比值, 默认=2。
如:-XX:NewRatio=2: 则年轻代与年老代所占比值为1:2,年轻代占整个堆栈的1/3
-XX:SurvivorRatio :年轻代中Eden区与Survivor区的大小比值,默认=8。
如:-XX:SurvivorRatio=8:两个Survivor各=1,Eden=8,则单个Survivor占1/10,Eden占8/10。
-XX:MaxTenuringThreshold:垃圾最大年龄。最大值=15,默认值:parallel (throughput) collector=15, CMS=6。
如:-XX:MaxTenuringThreshold=0:年轻代不经过Suvivor区,直接进入老年代。 值越大,在年轻代存活时间越长。 如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。
-XX:PretenureSizeThreshold=size : 大小超过size值的对象,直接在老年区分配。默认=0,表示任何对象都需要在年轻代分配。只对串行回收器和ParNew有效,对ParallelGC无效。
3 方法区:
类信息,常量,静态变量即时编译后的代码等。
-XX:PermSize=64m :方法区初始内存 默认是物理内存的1/64,已过时。JDK8中用 -XX:MetaspaceSize代替。 -XX:MaxPermSize=64m 默认是物理内存的1/4。已过时,JDK8中用-XX:MaxMetaspaceSize代替。
-XX:MetaspaceSize=size:为类的元数据分配的内存,默认20.8M。 -XX:MaxMetaspaceSize=size:为类的元数据分配的最大本地内存,默认无无穷大。
4 直接内存:
-XX:MaxDirectMemorySize NIO中的direct-buffer使用的最大对外内存,默认=0,表示自动使用。如-XX:MaxDirectMemorySize=128M
5 GC日志:
5.1 基本信息
-XX:+PrintGC : GC时打印信息,默认不启用。
-verbose:gc : 等效于-XX:+PrintGC。
-XX:+PrintGCDetails GC时打印详细信息,默认不启用。
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:/path/to/log/gc.log-date +%Y-%m-%d-%H-%M
日志文件的输出路径
5.2 附加信息
-XX:+PrintTenuringDistribution : 年代分布
-XX:+PrintGCApplicationStoppedTime :打印程序暂停的时间,如GC。
-XX:+PrintGCApplicationConcurrentTime : 打印每次垃圾回收前,程序未中断的执行时间.
-XX:+PrintHeapAtGC :打印堆详细信息。
-XX:+PrintCommandLineFlags : 打印用户设置过的参数
6 HeapDump:
-XX:+HeapDumpOnOutOfMemoryError : 发生java.lang.OutOfMemoryError异常时,dump heap文件。默认dump到当前目录。
-XX:HeapDumpPath=/opt/logs/xxx.heap.bin : HeapDumpOnOutOfMemoryError的文件目录。
7 优化:
7.1 常规:
-XX:+AlwaysPreTouch : 预加载内存。启动时,JVM先访问分配给它的内存,让操作系统把内存真正的分配给JVM。但JVM进程的启动时间会加长。
-XX:MinHeapDeltaBytes=size : 每次扩展堆的时候最小增长。如-XX:MinHeapDeltaBytes=2097152
-XX:AutoBoxCacheMax=number : 设置IntegerCache的最大值,如: -XX:AutoBoxCacheMax=1000,则调用Integer.valueOf的时候,在1000及以内的都会从缓存取。
7.2 64位系统下优化:
仅64位JVM上有效。当Java heap小于32G时应启用,否则应关闭。
-XX:+UseCompressedOops:oop(ordinary object pointer),普通对象指针压缩,用32bit位移表示64bit的普通对象指针。默认开启。
-XX:+UseCompressedClassPointers:类压缩。用32bit位移表示64bit的类指针。默认开启。
-XX:CompressedClassSpaceSize=n : 默认1G。+UseCompressedClassPointers后,Compressed Class Space分配在MaxMetaspace里,即MaxMetaspaceSize=Compressed Class Space Size + Metaspace area (excluding the Compressed Class Space) Size。
8 CMS:
-XX:+UseConcMarkSweepGC : 使用CMS收集器。
JVM参数中,“FullCollection”标识 FULL GC, "FullGC"表示一次完整的gc。
8.1 压缩
-XX:+UseCMSCompactAtFullCollection : 在FULL GC的时候, 对年老代的压缩。
-XX:+CMSFullGCsBeforeCompaction=n : +UseCMSCompactAtFullCollection下有效,表示第n次标记-清除后,做一次压缩。默认0,即每次标记-清除后都做一次压缩。
8.2 老年代回收
-XX:UseCMSInitiatingOccupancyOnly : 始终基于设定的阈值,不根据运行情况进行调整。
-XX:CMSInitiatingOccupancyFraction=percent : 老年代开始GC的内存占用比例(+UseCMSInitiatingOccupancyOnly下有效)。 默认92。 如:-XX:CMSInitiatingOccupancyFraction=75,则老年代内存空间使用了75%时开始回收。
9 其他:
-XX:+DisableExplicitGC : System.gc()。