我们开发Java程序都需要在JVM上运行和调试,但是你知道JVM的垃圾回收算法吗?今天华清Java学院小编就来和大家分享一下JVM垃圾回收算法的相关知识。
JVM垃圾回收算法可以分为三类,都基于标记-清除(复制)算法:Serial算法(单线程)、并行算法、并发算法。
JVM会根据机器的硬件配置对每个内存代选择适合的回收算法,比如,如果机器多于1个核,会对年轻代选择并行算法,关于选择细节请参考JVM调优文档。
稍微解释下的是,并行算法是用多线程进行垃圾回收,回收期间会暂停程序的执行,而并发算法,也是多线程回收,但期间不停止应用执行。所以,并发算法适用于交互性高的一些程序。经过观察,并发算法会减少年轻代的大小,其实就是使用了一个大的年老代,这反过来跟并行算法相比吞吐量相对较低。
还有一个问题是,垃圾回收动作何时执行?
1>当年轻代内存满时,会引发一次普通GC,该GC仅回收年轻代。需要强调的时,年轻代满是指Eden代满,Survivor满不会引发GC
2>当年老代满时会引发Full GC,Full GC将会同时回收年轻代、年老代
3>当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载
另一个问题是,何时会抛出OutOfMemoryException,并不是内存被耗空的时候才抛出
1>JVM98%的时间都花费在内存回收
2>每次回收的内存小于2%
满足这两个条件将触发OutOfMemoryException,这将会留给系统一个微小的间隙以做一些Down之前的操作,比如手动打印Heap Dump。
热点新闻