JVM通用配置 以及GC日志说明

堆空间的常用配置

-Xms  -Xmx 设置堆空间的大小  推荐设置成相同 -Xmx8G -Xms8G 可以防止JVM动态调整而消耗性能
-Xss512: 设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所
需内存大小进行调整。在相同物理内 存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的
不能无限生成,经验值在3000~5000左右。
---------------堆空间相关配置------------------
-XX:NewSize:   -XX:MaxNewSize:  新生代 最大新生代   这个优先级优于下面
-Xmn             相当于 NewSize = MaxNewSize       这个优先级优于下面
-XX:NewRatio=3  意味着年轻代和老年代之间的比率为1:3。也就是说伊甸园和幸存者空间的总大小将是堆总大小的四分之一   这个优先级最低   默认值是2
-XX:SurvivorRatio=8  默认是8 eden:Form:To = 8:1:1 比如:SurvivorRatio=6。那么幸存者空间将是年轻一代的八分之一(而不是七分之一,因为有两个幸存者空间)。
-XX:MetaspaceSize:  -XX:MaxMetaspaceSize  元空间大小  JDK8以后使用的本地内存 要控制好范围
-XX:MaxDirectMemorySize=2G  直接内存 默认和堆内存最大值一样 不受java堆大小限制 NIO零拷贝会用到 最好设置约束下
-XX:MaxTenuringThreshold=threshold 设置自适应GC分代中使用的最大使用阈值。最大的值是15。对于并行(吞吐量)收集器,默认值是15,对于CMS收集器,默认值是6。

-XX:-UseTLAB 关闭 TLAB:ThreadLocalAllocBuffer 事先在堆里面为每个线程分配一块私有内存 原子性   默认开启(建议开启)
-XX:TLABSize=512k  设置TLAB的大小
-XX:PretenureSizeThreshold 默认0不管多大都是先在eden中分配内存 当超过eden区的大小的时候,才分配到old区。
 大于该值大小的对象直接在老年代分配(单位字节)  自己看着办设置

-XX:+DoEscapeAnalysis  开启逃逸分析 对象作用域逃出函数 就是在方法new了个对象并把这个对象返回出去了  需要配合下面一起才生效 默认开启
-XX:+EliminateAllocations 标量替换 分析出成员变量没有逃逸 把其分配到局部变量也就是栈中 这样就不需要垃圾回收   默认开启

CMS参数配置说明

1、增量收集  -XX:CMSInitiatingOccupancyFraction=80   判断当前 Old 区使用率是否大于阈值,则触发 CMS GC 默认百分之92 降低触发CMS GC的阈值,
让CMS GC尽早执行,以保证有足够的连续空间,也减少 Old 区空间的使用大小 
另外需要使用 -XX:+UseCMSInitiatingOccupancyOnly 来配合使用,不然 JVM 仅在第一次使用设定值,后续则自动调整

-XX:+ParallelRefProcEnabled 对 Reference 进行并行处理。
-XX:+CMSClassUnloadingEnabled  这会使得 CMS 在 CMS-Remark 阶段尝试进行类的卸载 对 MetaSpace 或 Perm 进行垃圾收集,默认关闭, ps:最好不要处理

2、内存碎片  -XX:+UseCMSCompactAtFullCollection  来控制 Full GC的过程中是否进行空间的整理(默认开启 是Full GC,不是CMS GC)
-XX:CMSFullGCsBeforeCompaction=0  来控制多少次 Full GC 后进行一次压缩  

3、浮动垃圾: 视情况控制每次晋升对象的大小,或者缩短每次 CMS GC 的时间,必要时可调节 NewRatio 的值。
另外就是使用 -XX:+CMSScavengeBeforeRemark 在FullGc过程中提前触发一次 Young GC,防止后续晋升过多对象。

G1参数配置说明

 正常来说,大部分在 Young 的对象都不会存活很长时间。如果 Young gc 中,花费了大量的时间
如果不符合 (大部分在 Young 的对象都不会存活很长时间)这个规则,你可能需要调整一下 Young 区域占比。来降低 Young 对象的拷贝时间。
-XX:G1NewSizePercent (默认:5) Young region 最小值
-XX:G1MaxNewSizePercent (默认: 60) Young region 最大值

Mixed gc 会选取所有的 Young region + 收益高的若干个 Old region
-XX:G1MaxNewSizePercent 与 Young 关联
-XX:MixedGCCountTarget 与 old 关联
-XX:MixedGCCountTarget默认是8,意味着要在8次以内回收完所有的 old region
换句话说,如果你有 800 个 old region, 那么一次 mixed gc 最大会回收 100 个 old region
G1 也可以被调整成不做这么多工作,也就是回收少点,浪费堆内存
-XX:G1MixedGCLiveThresholdPercent(默认:85)可能会提高堆使用率
-XX:G1HeapWastePercent (默认:5) 如果可回收低于这个值, 那么将不会启动Mixed gc

-XX:MaxGCPauseMillis   G1会尽量满足这个参数设定的目标时间,通过此参数可以平衡应用需要的吞吐量以及延时

ZGC参数配置说明

-XX:ReservedCodeCacheSize -XX:InitialCodeCacheSize:设置CodeCache的大小, JIT编译的代码都放在CodeCache中,一般服务64m或128m就已经足够。
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC:启用ZGC的配置。 
-XX:ConcGCThreads:并发回收垃圾的线程。默认是总核数的12.5%,8核CPU默认是1。调大后GC变快,但会占用程序运行时的CPU资源,吞吐会受到影响。
-XX:ParallelGCThreads:STW阶段使用线程数,默认是总核数的60%。 
-XX:ZCollectionInterval:ZGC发生的最小时间间隔,单位秒。
-XX:ZAllocationSpikeTolerance:ZGC触发自适应算法的修正系数,默认2,数值越大,越早的触发ZGC。 
-XX:+UnlockDiagnosticVMOptions -XX:-ZProactive:是否启用主动回收,默认开启,这里的配置表示关闭。

GC日志中每一行都注明了GC过程中的信息,关键信息如下:
Start:开始GC,并标明的GC触发的原因。上图中触发原因是自适应算法。
Phase-Pause Mark Start:初始标记,会STW。
Phase-Pause Mark End:再次标记,会STW。
Phase-Pause Relocate Start:初始转移,会STW。
Heap信息:记录了GC过程中Mark、Relocate前后的堆大小变化状况。High和Low记录了其中的最大值和最小值,我们一般关注High中Used的值
如果达到100%,在GC过程中一定存在内存分配不足的情况,需要调整GC的触发时机,更早或者更快地进行GC。
GC信息统计:可以定时的打印垃圾收集信息,观察10秒内、10分钟内、10个小时内,从启动到现在的所有统计信息。利用这些统计信息,可以排查定位一些异常点。
image.png

个人建议

1、设置-Xms -Xmx 设置成一样的大小 减少动态调整分代带来的开销(本地提前测试 一般情况下 永久代的大小应当为活跃对象的 2~3 倍左右,考虑到浮动垃圾问题最好在 3 倍左右,剩下的都可以分给 Young 区)。
2、栈大小一般 256k 就够用了(除非代码中有很深的调用链)。
3、方法区内存: 与堆处于平行的空间 不属于堆和栈。
4、在一个方法区内频繁创建对象 为了避免GC大量回收 可以开启逃逸分析 jdk1.8默认开启。
栈空间的内存 随着线程的销毁而销毁  在栈上分配的对象所以不需要GC。
5、CGLIB技术直接操作字节码运行 生成大量的动态类会导致,jvm堆永久代内存溢出,排查问题困难,在使用的时候一定要谨慎。
6、偏向锁在只有一个线程使用到该锁的时候效率很高,但是在竞争激烈情况会升级成轻量级锁,此时就需要先消除偏向锁,这个过程是 STW 的。如果每个同步资源都走这个升级过程,开销会非常大,所以在已知并发激烈的前提下,一般会禁用偏向锁 -XX:-UseBiasedLocking 来提高性能。

通用配置 (java $通用配置 -jar ***.jar)

-XX:+PrintGCDetails 开启打印GC详细过程 并不会占用什么资源
-XX:+PrintGCTimeStamps | -XX:+PrintGCDateStamps 时间间隔 | 系统时间 方便看GC发生频率  
-XX:+HeapDumpOnOutOfMemoryError 发生内存溢出时 自动生成dump日志
-Xloggc:'gc.log'  指定GC日志的地方  
-Xlog:safepoint,classhisto*=trace,age*,gc*=info:file=/opt/logs/logs/gc-%t.log:time,tid,tags:filecount=5,filesize=50m 

GC日志说明

[图片上传中...(image-c2b5f4-1600391556819)]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352