0
点赞
收藏
分享

微信扫一扫

jvm实用调优参数(G1)

猎书客er 2022-04-04 阅读 64
java后端

性能参数:

参数名称

含义

默认值

描述

性能参数

-Xms

初始堆大小

物理内存的1/64(<1GB)

默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制.

-Xmx

最大堆大小

物理内存的1/4(<1GB)

默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制,
一般这两个值会设置成一致的,避免在GC完之后动态的调整堆大小,调整内存会消耗系统资源,对应用会有影响

-Xss

每个线程的堆栈大小

1024K(1.8+)

线程栈大小意味着一个线程最多能压入多少栈帧,也就是不返回得执行多少方法,
一般不需要特殊调整,除非你的程序有部分类似递归调用这种很吃栈深度的逻辑,那么可以适当调整此参数的默认值

-XX:NewRatio

年轻代(包括Eden和两个Survivor区)与
年老代的比值(除去持久代)

2

Old/New的比值,默认值为2,表示Old代与Young代的比值为2比1,
使用G1时一般此参数不设置,由G1来动态的调整,逐渐调整至最优值

-XX:SurvivorRatio

Eden区与Survivor区的大小比值

8

Eden/Survivor的比例,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10

-XX:MaxDirectMemorySize

直接内存大小

-Xmx

直接内存非常重要,很多IO处理都需要直接内存参与,直接内存不被jvm管理,所以就不存在GC时内存地址的移动问题,直接内存会作为堆内存和内核之间的中转站

-XX:PretenureSizeThreshold

大对象晋升老年代阈值

Region的一半

大于此值的对象直接在老年代分配,这么做是为了预防新生代存在大量大对象,很容易被撑满

-XX:MaxTenuringThreshold

新生代晋升老年代阈值

15

晋升到老年代对象的年龄,每个对象在坚持过一次MinorGC后,年龄就增加1,当超过这个参数值时,就进入老年代

-XX:MaxGCPauseMillis

垃圾回收的最长时间(最大暂停时间)

200ms

设置GC最大的停顿时间,G1会尽量达到此期望值,如果GC时间超长,那么会逐渐减少GC时回收的区域,以此来靠近此阈值

-XX:PreBlockSpin

初始自旋次数

10

使用自旋锁时初始自旋次数,在此基础上上下浮动,生效前提开UseSpinning

-XX:RelaxAccessControlCheck

放开通过放射获取方法和属性时的许可校验

默认关闭

在Class校验器中,放松对访问控制的检查,作用与reflection里的setAccessible类似

-XX:CompileThreshold

JIT预编译阈值

1000

通过JIT编译器,将方法编译成机器码的触发阀值,可以理解为调用方法的次数,例如调1000次,将方法编译为机器码

-XX:G1ReservePercent

G1为分配担保预留的空间比例

10

预留10%的内存空间,应对新生代的分配担保情形

-XX:InitiatingHeap
OccupancyPercent

启动并发GC时的堆内存占用百分比(InitiatingHeapOccupancyPercent)

45

G1用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比例。值为 0 则表示“一直执行GC循环)’. 默认值为 45 (例如, 全部的 45% 或者使用了45%).

-XX:G1HeapRegionSize

G1内堆内存区块大小

(Xms + Xmx ) /2 / 2048 , 不大于32M,不小于1M,且为2的指数

G1将堆内存默认均分为2048块,1M<region<32 M,当应用频繁分配大对象时,可以考虑调整这个阈值,因为G1的Humongous区域只能存放一个大对象,适当调整Region大小,尽量让其刚好超过大对象的两倍大小,这样就能充分利用Region的空间

-XX:GCTimeRatio

GC时间占运行时间的比例

G1为9,CMS为99

GC时间占总时间的比例,默认值为99,即允许1%的GC时间。仅仅在Parallel Scavenge收集时有效,公式为1/(1+n)

-XX:G1HeapWastePercent

触发Mixed GC的可回收空间百分比

5%

在global concurrent marking结束之后,我们可以知道old gen regions中有多少空间要被回收,在每次YGC之后和再次发生Mixed GC之前,会检查垃圾占比是否达到此参数,只有达到了,下次才会发生Mixed GC

-XX:G1MixedGCLive
ThresholdPercent

会被MixGC的Region中存活对象占比

85%

old generation region中的存活对象的占比,只有小于此参数,才会被选入CSet

-XX:G1MixedGCCountTarget

8

一次global concurrent marking之后,最多执行Mixed GC的次数

-XX:G1NewSizePercent

5%

新生代占堆的最小比例

-XX:G1MaxNewSizePercent

60%

新生代占堆的最大比例

-XX:GCPauseIntervalMillis

指定最短多长可以进行一次gc

-XX:G1OldCSetRegion
ThresholdPercent

Mixed GC每次回收Region的数量

10%

一次Mixed GC中能被选入CSet的最多old generation region数量比列

-XX:ParallelGCThreads

STW期间,并行GC线程数

-XX:ConcGCThreads

-XX:ParallelGCThreads/4

并发标记阶段,并行执行的线程数

功能开关:

参数名称

含义

默认值

描述

-XX:+UseSpinning

是否使用适应自旋锁

1.6+默认开启

这是对synchronized的优化,当运行到synchronized的代码块时,会尝试自旋,如果在自旋期间获取到了锁,那么下次会逐渐的增加自旋时间,反之则减少自旋时间,当自旋时间减少到一定程度后,会关闭自旋机制一段时间,使用重量级锁

-XX:+DisableExplicitGC

禁止System.gc()

默认启用(DisableExplicitGC)

禁止在运行期显式地调用System.gc()

-XX:+UseG1GC

使用G1做为GC收集器

1.8+

在1.8+后默认使用,其在大内存情形下能够发挥更加卓越的性能,相较于其他GC最大的差异是其每次回收老年代时只会回收最值得回收的部分内存空间,而不是整个老年代

-XX:+UseThreadPriorities

是否开启线程优先级

默认开启

java 中的线程优先级的范围是1~10,默认的优先级是5。“高优先级线程”会优先于“低优先级线程”执行,也就是竞争CPU时间片时,高优先级线程会被优待

-XX:+UseBiasedLocking

是否开启偏向锁

默认开启

和自旋锁一样,也是synchronized的优化措施之一,当synchronized代码块只被一个线程使过时,将偏向锁的ThreadID设置为自身线程ID,这样每次运行时只要比对ThreadID和自身一致就直接运行

-XX:+HandlePromotionFailure

老年代是否允许分配担保失败

DK1.6之后,默认开启

是否允许分配担保失败,即老年代的剩余最大连续空间不足以引用新生代的整个Eden和Survivor区的所有存活对象的极端情况(以此判断是否需要对老年代进行以此FullGC)

-XX:+UseTLAB

使用线程本地分配缓冲区

Server模式默认开启

Thread Local Allocation Buffer,此区域位于Eden区。当多线程分配内存区块时,因为内存分配和初始化数据是不同的步骤,所以在分配时需要对内存区块上锁,由此会引发区块锁竞争问题。此参数会让线程预先分配一块属于自己的空间(64K-1M),分配时先在自己的空间上分配,不足时再申请,这样能就不存在内存区块锁的竞争,提高分配效率

-XX:+UseCompressedOops

是否开启指针压缩

32G内存下默认开启

开启指针压缩,则Object Head 里的Klass Pointer为4字节,复杂属性的引用指针为4字节,数组的长度用4字节表示,这样能够节省部分内存空间

-XX:+PrintAdaptiveSizePolicy

自适应策略,调节Young Old Size,一般G1不会设置新生代和老年代大小,而有G1根据停顿时间逐渐调整新生代和老年代的空间比例

调试参数:

参数名称

含义

默认值

描述

-XX:HeapDumpPath

堆内存快照到处路径

指定HeapDump的文件路径或目录,使用前需开启HeapDumpOnOutOfMemoryError

-XX:+HeapDumpOnOutOfMemoryError

在OOM后导出堆内存快照

默认关闭

-XX:OnError

在Error时执行操作

可配置相应命令,在Error时执行此命令,比如发送邮件

-XX:OnOutOfMemoryError

在发生OOM时执行操作

-XX:+PrintCommandLineFlags

打印jvm参数

在程序运行前打印出用户手动设置或者JVM自动设置的XX选项

-XX:+PrintGC

GC时打印概览信息

关闭

-XX:+PrintGCDetails

GC时打印详细信息

关闭

-XX:+PrintGCTimeStamps

打印GC用时

关闭

-XX:+PrintGCApplicationStoppedTime

打印GC时应用暂停时间

关闭

-Xloggc:< filename>

将GC相关日志记录到文件以便分析

-XX:GCLogFileSize

8K

使用前需开启-Xloggc,GC日志文件默认大小,当日志超过8K时需要被滚动存储

-XX:+UseGCLogFileRotation

关闭

开启GC日志文件的滚动存储功能

-XX:NumberOfGCLogFiles

GC文件数量

1

GC日志滚动文件数量,超过时会删除最先创建的

-XX:+CITime

关闭

打印启动时花费在JIT Compiler 时间

举报

相关推荐

0 条评论