记录点滴
我们的回忆

垃圾回收基础

1、性能属性:

(1)吞吐量:不考虑垃圾收集引起的停顿时间或内存消耗,垃圾收集器能支撑应用程序达到的最高性能指标
(2)延迟:缩短由于垃圾收集引起的停顿时间或完全消除垃圾收集所引起的停顿,避免应用程序运行时发生抖动
(3)内存:垃圾收集器流畅运行所需要的内存数量

任何一个属性性能的提供几乎都是以另外一个或两个属性性能的损失作为代价的。

2、原则:

(1)MinorGC回收原则:每次MinorGC尽可能多地收集垃圾对象
(2)GC内存最大化原则:java堆空间越大,垃圾收集的效果就越好
(3)GC调优3选2原则:吞吐量、延迟、内存任意选择两个进行调优

推荐的GC日志参数
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:<filename>

-XX:+PrintGCDateStamps
-XX:+PrintGCApplicationStoppedTime (安全点阻塞代码的时间)
-XX:+PrintGCApplicationConcurrentTime (应用某段时间段的响应时间)
-XX:+PrintSafepointStatistics (区分垃圾收集安全点与其他安全点)

3、内存占用

活跃数据的大小是确定运行应用程序所需java堆大小的不错切入点,它也决定了我们是否需要重新回顾应用程序的内存占用需求、或者是否需要修改应用程序以满足内存占用需求。活跃数据的大小是指应用程序稳定运行时长期存活对象所占用的java堆内存量,换句话说,它是应用程序运行于稳定态时,FullGC之后java堆所占用的空间大小。

(1)堆大小-Xms与-Xmx设定为同一个值,这是因为无论扩展还是缩减新生代空间或年老代空间都需要进行FullGC,而FullGC会降低程序的吞吐量并导致更长的延迟。

(2)新生代大小-XX:NewSize=[g|m|k]设置新生代最小值,同时应该指定其最大值-XX:MaxNewSize=[g|m|k]

-Xmn:[g|m|k],设置新生代的“固定空间”/初始值,如果Xms和Xmx没有设置为同一个值时,堆空间扩展或收缩时,新生代大小是不会随着调整的,是固定的,只有Xms和Xmx是同一个值得时候,才使用Xmn选项。

(3)年老代大小
年老代空间的大小初始值为-Xmx减去-XX:NewSize,最小值为-Xmx减去-XX:MaxNewSize
如果使用了-Xmn,则年老代的大小为-Xmx减去-Xmn

(4)永久代大小
-XX:PermSize=[g|m|k],永久代空间的初始值和最小值
-XX:MaxPermSize=[g|m|k],永久代空间的最大值
关注性能的java应用程序应该将-XX:PermSize和-XX:MaxPermSize设置为同一个值,因为永久代空间的大小调整需要进行FullGC才能实现。

新生代、年老代和永久代这三个空间中的任何一个不能满足内存分配请求时,就会发生垃圾收集,理解这一点非常重要,换句话说,这三个空间中任何一个被用尽,同时又有新的空间请求无法满足时就会触发垃圾收集。新生代没有足够的空间满足java对象分配请求时,hotspot会进行MinorGC以释放空间,MinorGC相对FullGC而言,持续的时间要短。

经历过几次MinorGC之后仍然活跃的对象最终会被提升到年老代,年老代不足以容纳新提升的对象时,hotspot vm就会进行FullGC。实际上,当hotspot vm发现当前可用空间不足以容纳下一次MinorGC提升的对象时就会促发FullGC。与因空间问题导致的MinorGC过程中对象提升失败比起来,这种方式的代价要小很多,从失败的对象提升中恢复是一个很昂贵的操作。永久代没有足够的空间存储新的VM或类元数据时也会触发FullGC

如果FullGC缘于年老代空间已经满,即使永久代空间没有用尽,年老代和永久代都会进行垃圾收集,同样,如果FullGC是由永久代空间不够引起的,年老代和永久代都会进行垃圾收集,不论年老代是否还有空闲空间。

如果使用的-XX:+UseParallelGC或-XX:+UseParallelOldGC,如果关闭-XX:-ScavengeBeforeFullGC,则hotspot在FullGC之前不会进行MinorGC,但FullGC时仍然会收集新生代,如果开启这个选项,则在FullGC之前总是先做一次MinorGC,分担一部分FullGC原本要做的工作。

未经允许不得转载:我们的回忆 » 垃圾回收基础

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

我们的回忆 记录点滴

标签云会员中心