先来看看大厂的一个java服务器程序配置的java启动参数:
-Xms8g -Xmx8g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:+UnlockExperimentalVMOptions
-XX:G1MaxNewSizePercent=65 -XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=55 -XX:G1HeapRegionSize=16m
-XX:G1NewSizePercent=25 -XX:MaxGCPauseMillis=120 -XX:+ParallelRefProcEnabled -XX:MaxDirectMemorySize=1g
-XX:+TraceG1HObjAllocation -XX:ReservedCodeCacheSize=512m -XX:+UseCodeCacheFlushing
堆大小
-Xms8g -Xmx8g
Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。
在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为:Eden(伊甸园)、Survivor(幸存者)。
元空间
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m
它是一个特殊的堆空间,它与主Java堆分开,JVM在主堆中跟踪已加载类的元数据
在Java8及以后的版本中,它取代了旧的PermGen内存空间,我们可以使用以下命令设置元空间的初始大小和最大大小
解锁实验参数
-XX:+UnlockExperimentalVMOptions
解锁实验参数,允许使用实验性参数,JVM中有些参数不能通过-XX
直接复制需要先解锁,
比如要使用某些参数的时候,可能不会生效,需要设置这个参数来解锁;
一般使用在一些低版本jdk想使用高级参数或者可能高版本有的参数情况;
垃圾回收器
-XX:+UseG1GC
回收器有串行收集器、并行收集器、并发收集器,G1收集器…, G1 GC是面向服务端应用程序的垃圾回收器
新生代
-XX:G1MaxNewSizePercent=65
新生代占堆内存的大小,初始为-XX:G1NewSizePercent
设置的值,默认为:5%
,G1会根据满足暂停时间的值而对占比进行调整,
但最大不会超过-XX:G1MaxNewSizePercent
设置的值,默认为:60%
。
并发标记触发阈值
-XX:InitiatingHeapOccupancyPercent=55
在标记阶段是并发执行, 可以同时回收年轻代和老年代。
当整个堆占用超过某个百分比时,就会触发并发GC周期,这个百分比默认是45%
如果你的项目没有大的cpu负载压力,可以适当降低这个值,带来的好处就是提前开始Concurrent Marking Cycle Phases ,
进一步来说,回收 年轻代 and 老年代 也会提前开始,这样有利于防止年轻代晋升老年代失败(老年代容量不足)而触发Full GC
Region
-XX:G1HeapRegionSize=16m
G1垃圾收集器与之前垃圾收集器最大的不同就是化整为零,将内存区域分成多个Region. Region size必须是2的指数,取值范围从1M到32M
例如一个12G的堆内存,Region Size是缺省4M.如果内部有很多对象的大小为几兆到十几兆,大于了G1HeapRegionSize
,那么这些对象会被分配到H(巨大对象)区,H对象被直接分配到老年代,防止被反复拷贝移动.这会造成老年代的使用不断增加引起Full GC.
新生代占堆内存的大小
-XX:G1NewSizePercent=25
新生代占堆内存的大小,默认为:5%
,G1会根据满足暂停时间的值而对占比进行调整,但最大不会超过-XX:G1MaxNewSizePercent
设置的值,默认为:60%
。
GC最大停顿时间
-XX:MaxGCPauseMillis=120
如果更关注吞吐量可以设置GCTimeRatio
参数
-XX:GCTimeRatio=nnn
表示希望在GC花费不超过应用程序执行时间的1/(1+nnn)
,nnn为大于0小于100的整数。换句话说,此参数的值表示运行用户代码时间是GC运行时间的nnn倍。
举个官方的例子,参数设置为19,那么GC最大花费时间的比率=1/(1+19)=5%,程序每运行100分钟,允许GC停顿共5分钟,其吞吐量=1-GC最大花费时间比率=95%
默认情况下,VM设置此值为99,运行用户代码时间是GC停顿时间的99倍,即GC最大花费时间比率为1%
启用并行引用处理
-XX:+ParallelRefProcEnabled
可以用来并行处理 Reference,以加快处理速度,缩短耗时
堆外直接内存
-XX:MaxDirectMemorySize=1g
JVM堆内存大小可以通过-Xmx
来设置,同样的Direct ByteBuffer可以通过-XX:MaxDirectMemorySize
来设置,此参数的含义是当Direct ByteBuffer分配的堆外内存到达指定大小后,即触发Full GC。默认是64M
Trace
-XX:+TraceG1HObjAllocation
在使用G1 GC策略时,Humongous对象的分配会极大伤害G1的性能,使用命令行选项 -XX:+TraceG1HObjAllocation
,在标准输出打印大对象时,用户可以根据这些Trace信息,在应用层面减少大对象的分配,提升G1使用的性能。
代码缓存
-XX:ReservedCodeCacheSize=512m
Java代码在执行时一旦被编译器编译为机器码.编译后的机器码的内存区域就是CodeCache。
这是一块独立于Java堆之外的内存区域。除了JIT编译的代码之外,Java所使用的本地方法代码(JNI)也会存在CodeCache中。
-XX:+UseCodeCacheFlushing
打开这个选项,在JIT被关闭之前,也就是CodeCache装满之前,会在JIT关闭前做一次清理,删除一些CodeCache的代码;
<<<<<<<<<<<< ⌛ >>>>>>>>>>>>