从盘古开天辟地说起JVM性能调优

本文详细阐述了JVM中的垃圾回收算法,包括标记-清除、复制和标记压缩,重点讲解了分代收集和GC流程,以及对象晋升年老代的条件。此外,探讨了新生代和survivor区设置对Full GC的影响,以及如何通过调整堆内存、GC策略优化性能。
摘要由CSDN通过智能技术生成

首先谈一谈垃圾回收算法

主要有三种基本算法:标记-清除算法、复制算法、标记压缩算法.
而目前最常用的就是分代收集算法:将Java堆分为新生代和年老代,这样就可以根据各个年代的特点采用适当的算法。

然后要谈的是一次完整的GC流程,对象如何晋升到年老代

  1. Java堆 = 新生代 + 年老代
  2. 新生代 = Eden + s0 + s1
  3. 当Eden满了之后,虚拟机触发一次Minor GC, 已收集新生代的垃圾。存活下来的对象,会被转移到survivor区,大对象(需要大量连粗存储空间的Java对象)直接进入老年态。
  4. 如果对象在Eden中出生, 并经过一次Minor GC之后仍然存活,并且被survivor容器所容纳的话, 年龄设为1,每熬过一次MInor GC,年龄+1,若年龄超过一定的限制(15),则被晋升到老年态,即长期存活的对象进入老年态。
  5. 老年态满了无法容纳更多对象,Minor GC之后通常会进行Full GC,Full GC清理整个内存堆,包括年轻代和年老代。
  6. Major GC 发生在年老代的GC, 清理年老区,经常伴随着至少一次的Full GC ,比Minor GC慢十倍以上。

然后就想说一说导致Full GC的情况

  1. 新生代设置的过小
    一是新生代GC的次数太频繁,增加系统消耗;二是导致大量对象直接进入年老代,占据了年老代的剩余空间,诱发Full GC.。
  2. 新生代设置的过大
    一是新生代设置的过大会导致年老代过小(堆内存容量大小一定),从而诱发Full GC;二是新生代GC消耗的时间大幅度增加。
  3. survivor设置的过小
    导致对象从Eden直接进入年老代
  4. survivor设置的过大
    导致Eden过小,增加了GC的频率。

JVM性能调优

  1. 设定堆内存大小
  2. 设置新生代大小
  3. 设定垃圾回收器:新生代用UseParNewGC;年老代使用UseConMarkSweepGC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值