原文:https://plumbr.eu/handbook/garbage-collection-in-java
一直以来,整理和说明垃圾回收机制一直是一个重要的课题。在实际应用中,需要知道如何修改相应的设置,来满足实际的需要。
例如,让我们来看一下JVM(虚拟机)如何设置,才能保证我们能正确的分配这些资源。
碎片和压缩
当JVM垃圾回收时,必须确保足够的资源可以分配利用。这样会产生内存碎片,像磁盘碎片一样,会导致两个问题:
*要找到一个足够的空间,写操作变的更耗时,它不再是一个简单的操作
*当创建一个新的对象,虚拟机在相邻的块分配内存。如果碎片越来越多,达到某个点,没有足够的空闲碎片用来创建新的对象,
一个分配错误就会产生。
为了避免这样的问题,虚拟机必须确保不能碎片数量不能超出限制。所以内存的清理和释放的过程也发生在垃圾收集,只是为了替换标记和清除碎片。这个过程会把所有可以收集的对象重新分配到一个新的地方,消除碎片。下边是效果的展示图:
分代假设
正如我们之前提到的,垃圾收集需要停止所有的应用程序。很明显,随之对象的越来越多,垃圾收集的次数也会越来越多。
假如我们只有很小的一块内存空间,研究人员观察发现,大多数内存分配,分为两大类:
*大多数对象很快变成无用的
*还有一种是不会存活很长时间
这些数据值放到一起会变成一种假设,基于这种假设,虚拟机的内存中被分为年轻代和老年代,后者也被称为年老代
有许多如何并行和分别清理这些内存空间的算法, 为了改善垃圾回收的性能,已经做了很长时间的尝试。
并不是说有一个没有问题的方法,例如,来自不同代的对象间的相互引用,在垃圾回如何去计算,和收集这个代的数据
值得注意的是,这些假设对一些应用程序并不成立。因为垃圾回收的算法已经优化了消失殆尽的年轻代或者可能存活的年老代,
虚拟机会使快被收集的对象拥有期望的生命周期。
内存池
未完。。。。