垃圾回收是如何工作的?如何优化?

Posted ljdgm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了垃圾回收是如何工作的?如何优化?相关的知识,希望对你有一定的参考价值。

1)   垃圾回收是一种回收无用内存空间并使其对未来实例可用的过程。

 

Eden :当一个实例被创建了,首先会被存储在堆内存年轻代的 Eden 区中。

注意:如果你不能理解这些词汇,我建议你阅读这篇 垃圾回收介绍 ,这篇教程详细地介绍了内存模型、JVM 架构以及这些术语。

Survivor 区(S0 和 S1):作为年轻代 GC(Minor GC)周期的一部分,存活的对象(仍然被引用的)从 Eden 区被移动到 Survivor 区的 S0 中。

类似的,垃圾回收器会扫描 S0 然后将存活的实例移动到 S1 中。

(译注:此处不应该是Eden和S0中存活的都移到S1么,为什么会先移到S0再从S0移到S1?)

死亡的实例(不再被引用)被标记为垃圾回收。根据垃圾回收器(有四种常用的垃圾回收器,将在下一教程中介绍它们)选择的不同,要么被标记的实例都会不停地从内存中移除,要么回收过程会在一个单独的进程中完成。

老年代: 老年代(Old or tenured generation)是堆内存中的第二块逻辑区。当垃圾回收器执行 Minor GC 周期时,在 S1 Survivor 区中的存活实例将会被晋升到老年代,而未被引用的对象被标记为回收。

老年代 GC(Major GC):相对于 Java 垃圾回收过程,老年代是实例生命周期的最后阶段。Major GC 扫描老年代的垃圾回收过程。如果实例不再被引用,那么它们会被标记为回收,否则它们会继续留在老年代中。

内存碎片:一旦实例从堆内存中被删除,其位置就会变空并且可用于未来实例的分配。这些空出的空间将会使整个内存区域碎片化。为了实例的快速分配,需要进行碎片整理。基于垃圾回收器的不同选择,回收的内存区域要么被不停地被整理,要么在一个单独的GC进程中完成。

2)   

将转移到老年代的对象数量降低到最小;

2、减少full GC的执行时间; 

为了达到上面的目的,一般地,你需要做的事情有:

1、减少使用全局变量和大对象;

2、调整新生代的大小到最合适;

3、设置老年代的大小为最合适;

4、选择合适的GC收集器

以上是关于垃圾回收是如何工作的?如何优化?的主要内容,如果未能解决你的问题,请参考以下文章

Unity优化如何写一个C++垃圾回收器!

Unity优化方向——优化Unity游戏中的垃圾回收

垃圾收集器与内存分配策略-内存分配与回收策略

GC垃圾回收器和回收算法

GC垃圾回收器和回收算法

jvm垃圾回收算法整理