谈谈JVM调优与GC

论坛 期权论坛 脚本     
匿名技术用户   2021-1-14 11:22   613   0

JVM调优总是和内存模型、GC息息相关的

传统堆内存模型分成三个部分:

Young(年轻代):分成以下三个部分

Eden 存放新创建的对象

Survivor0 存放经过YGC还存活的对象

Survivor1 和S0一样

Old(年老代):年轻代经过N轮的YGC后还存活,转入年老代

Perm(永久代):存放class

G1内存模型分成三个部分:

Eden Space:新生代

Survivor Space:存活代

Old Generation:老年代


JVM参数调优:

1、堆设置:整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小

-Xmx1g 设置JVM最大可用内存1g

-Xms1g 设置初始内存1g,一般初始内存设置成与-Xmx相同可用防止GC后JVM重新分配内存

-Xmn64m 设置年轻代大小,默认64m,推荐为整个JVM大小的3/8

-Xss128k 每个线程堆栈大小,jdk5.0后默认1m,一个进程内,线程数一般为3000-5000,可调整该数值进行设定

-XX:NewRatio=4 设置Young与Old之间的比值,该设置Young的大小为整个堆栈的1/5

-XX:SurvivorRatio=4 设置Young中Eden与Survivor之间的比值,该设置Survivor占整个Young的1/6(有两个Survivor)

-XX:MaxPermSize=16m 设置永久代大小

-XX:MaxTenuringThreshold=0 设置垃圾最大年龄,该设置Eden将不会进入Survivor,直接进入Old

2、回收器设置:串行(小数据量)、并行(吞吐量优先)、并发(响应时间优先)

-XX:+UseSerialGC 使用串行回收器

-XX:+UseParallelGC 使用并行回收器(只对Young有效,Old使用的是串行)

-XX:ParallelGCThreads=8 设置并行回收器线程数8,该设置最好设置与处理器数量一致

-XX:+UseParallelOldGC 老年代使用并行回收器(jdk6.0以上支持)

-XX:GCTimeRatio=n 设置垃圾回收时间占程序运行时间百分比(1/(1+n))

-XX:MaxGCPauseMillis=100 设置年轻代垃圾回收的最长时间

-XX:+UseAdaptiveSizePolicy 自动调整年轻代大小与Survivor的比例,使用并行回收器时,推荐开启

-XX:+UseConcMarkSweepGC 设置老年代并发回收,该设置会导致新生代比值-XX:NewRatio的设置失效

-XX:UseParNewGC 设置新生代为并发回收,可与CMS回收同时设置,jdk5.0以上JVM根据系统自动设置

-XX:CMSFullGCBeforeCompaction=5 运行5次GC后,对内存进行压缩、整理,减少碎片化

-XX:+UseCMSCompactAtFullCollection 该设置会对老年代进行压缩、整理,弊端是影响性能

应用:

吞吐量优先的应用,一般设置一个很大的Young和一个较小的Old,可以尽可能回收短期的对象,减少中期对象,年老代尽量只存放长期存活的对象

响应优先的应用,年老代使用并发收集器,年轻代尽量设置得较大

碎片处理:

-XX:+UseCMSCompactAtFullCollection 启用设置对老年代进行压缩整理

-XX:CMSFullGCBeforeCompaction=n 设置内存压缩整理的频率,每n次GC整理一次


GC算法

标记清除(Mark-Sweep):最基本的GC算法,先标记,后清除,算法简单,效率低,且会产生大量的碎片

标记复制(HotSpot新生代采用的算法):Double内存,复制的时候进行清理,算法简单高效,但是需要额外一倍内存,且在对象存活率低的时候高效,在对象存活率高的时候就变得低效

标记整理(老年代采用的算法)

新生代GC

Serail GC
ParNew GC

Parallel Scanvenge GC

年老代GC

Serail Old GC
Parallel Old GC
Concurrent Mark Sweep

串行: 单线程,只有一个GC线程执行任务
并行: 多线程,多个GC线程执行任务,不能与用户线程同时进行

并发: 能与用户线程同时进行的GC


例子:

-Xms6g -Xmx6g -Xmn4g -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=3 -XX:SurvivorRatio=6 -XX:MaxTenuringThreshold=15 -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:CMSInitiatingOccupancyFraction=80 

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP