浅谈GC---二

Java SE平台的一个优势是它将开发人员从内存分配和垃圾收集的复杂性中解放出来。但是,当垃圾收集是主要瓶颈时,理解底层是很有用的。

Generational Garbage Collection

一个对象会被认为是垃圾,并且它的内存会被虚拟机回收重新使用,当程序中任何其他活动对象都没有引用到达该对象时。

大部分对象被分配在专门存放年轻对象的内存区域(年轻代),并且大部分对象死在这里。当年轻代满了之后,会触发minor collection,只收集年轻代。其他代的垃圾不回收。这种垃圾收集的代价正比于被收集区域活着对象数量。充满死亡对象的年轻代的垃圾收集是很快的。通常情况下,年轻代幸存对象中的一小部分会在每次小规模收集(minor collection)时转移到老年代。最终老年代满了,然后需要收集,触发major collection,这个时候整个堆都会收集。major collection通常比minor collections持续更长时间,因为涉及到大量对象。


年轻代由一个Eden区和两个Survivor区组成,大部分对象最初被分配在Eden。任何时候都确保一个Survivor是空的,作为目的Survivor存放垃圾收集时Eden区和另一个Survivor区中幸存的对象。在一次垃圾收集之后,Eden和源Survivor区都会清空。在下一次垃圾收集时,两个Survivor区的角色互换。对象就在两个Survivor区之间来回复制,直到复制到特定次数或者没有足够的剩余空间,这些对象就会复制到老年代。这个过程叫做老年化。


Performance Considerations

垃圾收集的主要衡量标准是吞吐量和延迟:

• Throughput is the percentage of total time not spent in garbage collection
considered over long periods of time. Throughput includes time spent in allocation
(but tuning for speed of allocation generally isn't needed).
• Latency is the responsiveness of an application. Garbage collection pauses affect

the responsiveness of applications.

用户对于垃圾收集会有不同的要求,例如,有些人认为Web服务器的正确度量标准是吞吐量,因为垃圾收集期间的暂停是可以容忍的,或者会被网络延迟掩盖。但是,在交互式图形程序中,即使短暂的暂停也会对用户体验产生负面影响。

一般来说,为特定的代确定大小是对于这些考虑方面的折中。例如,一个非常大的年轻代会最大化吞吐量,但是这样做会牺牲footprint,promptness和暂停时间。年轻代暂停可以通过使用一个小的年轻代来最小化,以牺牲吞吐量为代价。每个代的大小不会影响彼此的收集频率和暂停时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值