JVM 优化以及垃圾回收总结

为什么suvivor是两个?
1、解决内存碎片
2、为了尽可能的gc

JVM启动模式client,server
Server VM启动比Client VM慢大概10%,运行比Client VM快至少有10倍;
JVM在client模式默认-Xms是1M,-Xmx是64M;JVM在Server模式默认-Xms是128M,-Xmx是1024M;
client:启动快,针对桌面应用程序优化
server:启动慢,编译更完全,针对服务端有优化

jvm 串行 并行 并发:
目前的收集器主要有三种: 串行收集器、并行收集器、并发收集器 。
串行收集器:在GC时会停止其他所有工作线程(stop-the-world),CPU利用率是最高的,所以适用于要求高吞吐量(throughput)的应用,但停顿时间(pause time)会比较长
并行收集器:在串行收集基础上采用多线程方式进行GC,很好的弥补了串行收集的不足,可以大幅缩短停顿时间,停顿时间很短,回收效率高,适合高频率执行。冻结所有的应用程序线程当执行垃圾回收的时候
并发收集器:GC线程和应用线程大部分时间是并发执行,只是在初始标记(initial mark)和二次标记(remark)时需要stop-the-world,由于GC是和应用线程并发执行,只有在多CPU场景下才能发挥其价值。
G1垃圾回收器:

默认垃圾回收器:
如果你运行在JVM的客户端模式(Client)下,JVM默认垃圾收集器是串行垃圾收集器(Serial GC,-XX:+UseSerialGC);在JVM服务器模式(Server)下默认垃圾收集器是并行垃圾收集器(Parallel GC,-XX:+UseParallelGC)


JVM命令参数配置:
-server
-Xmx2g
-Xms2g
-Xss1m
-XX:PermSize=512m
-XX:MaxPermSize=512m
-XX:+DisableExplicitGC
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0


-Xmx 最大内存
-Xms 初始化内存
-Xss 线程内存
-XX:PermSize=512m 持久带初始容量
-XX:MaxPermSize=512m 持久带最大容量( 非堆内存 )
-XX:NewRatio=4 年轻代:老年代的大小比值为1:4
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=0 :设置垃圾最大年龄。
-XX:TargetSurvivorRatio=90
-XX:+DisableExplicitGC 禁止代码中显示调用GC
-XX:UseParNewGC 新生代并行垃圾回收器
-XX:+UseConcMarkSweepGC 老年代使用CMS回收器
-XX:ParallelGCThreads=n 指回ParNew回收器工作时的线程数量, cpu核数小时8时, 其值等于cpu数量, 高于8时,可以使用公式(3+((5*CPU_count)/8))
-XX:ConcGCThreads=n 并发垃圾收集器使用的线程数量. 默认值随JVM运行的平台不同而不同.
-XX:UseCMSInitiatingOccupancyOnly JVM自动触发(JVM的动态策略,也就是悲观策略)(基于之前GC的频率以及旧生代的增长趋势来评估决定什么时候开始执行),如果不希望JVM自行决定,可以显式使用命令-XX:UseCMSInitiatingOccupancyOnly来制定;
-XX:CMSInitiatingOccupancyFraction 老年代Full Gc触发比例
旧生代或者持久代已经使用的空间达到设定的百分比时(默认CMS是在tenured generation,也就是old区占满92%的时候开始进行CMS收集,
-XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩.
-XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩
-XX:+PrintGCDetails : 打印GC详情
-XX:+PrintGCTimeStamps : 打印GC日志时间
-Xloggc:filename : 相关日志信息记录到文件

jvm gc 并行和并发的区别
并行(Parallel):多条垃圾收集线程并行工作,而用户线程仍处于等待状态
并发(Concurrent):垃圾收集线程与用户线程一段时间内同时工作(交替执行)
concurrent: 并发, 多个线程协同做同一件事情(有状态)
parallel: 并行, 多个线程各做各的事情(互相间无共享状态)

新生代(并行收集):
-XX:+UseParNewGC 复制算法,解决了 内存碎片化,内存利用率不高
老年代(并发收集)
-XX:+UseConcMarkSweepGC 标记清除, 内存碎片化严重


G1什么情况下进行Full GC:
  • 永久代满了
  • 应用程序分配内存的速度大于G1并发收集的速度(concurrently collect garbage)



线上GC信息:
5W QPS

线上full gc  一天2次左右。 500毫秒时长。
线上的minor gc   总数一天大约4000次
线上minor gc      >40毫秒的 大约一天380次左右。
线上minor gc      <40毫秒 其余

整体的gc 停顿时间  123秒 每天




JAVA_MEM_OPTS=" -server -Xmx2g -Xms2g -Xss1m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "




































  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值