JVM常规参数

一、概述

二、参数解释

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 : -Xms4096mJVM堆初始内存,默认是物理内存的1/64。空余堆内存大于**70%**时,JVM会减少堆直到-Xms的最小限制。

-Xmx : -Xmx4096mJVM堆最大内存,默认是物理内存的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=15CMS=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.binHeapDumpOnOutOfMemoryError的文件目录。

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位系统下优化

64JVM上有效。当Java heap小于32G时应启用,否则应关闭。

-XX:+UseCompressedOopsoop(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:+DisableExplicitGCSystem.gc()

三、参考

https://juejin.cn/post/6844903990082142215

你可能感兴趣的:(jvm,java,开发语言)