酒类网站如何做,新手建网站推荐,做外贸都得有网站吗,南城做网站一、分代收集理论
1、三个假说
弱分代假说#xff1a;绝大多数对象都是朝生夕灭的。
强分代假说#xff1a;熬过越多次垃圾收集过程的对象越难以消亡。 这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则#xff1a;收集器应该将Java堆划分出不同的区域绝大多数对象都是朝生夕灭的。
强分代假说熬过越多次垃圾收集过程的对象越难以消亡。 这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则收集器应该将Java堆划分出不同的区域然后将回收对象依据其年龄年龄即对象熬过垃圾收集过程的次数分配到不同的区域之中存储。 把分代收集理论具体放到现在的商用Java虚拟机中里设计者一般至少会把Java堆划分成新生代和老年代两个区域。 新生代和老年代每次垃圾收集时都发现有大批对象死去而每次回收后存活的少量对象将会逐步晋升到老年代中存放。
每次回收进行后没有被回收的对象年龄加1加到一定次数(一般是13)就会进入老年代。 如果一个区域中大多数对象都是朝生夕灭难以熬过垃圾收集过程的话那么把它们集中放在一起每次回收时只关注如何保留少量存活而不是去标记那些大量将要被回收的对象就能以较低代价回收到大量的空间如果剩下的都是难以消亡的对象那把它们集中放在一块虚拟机便可以使用较低的频率来回收这个区域这就同时兼顾了垃圾收集的时间开销和内存的空间有效利用。 跨代引用问题 跨代引用问题新生代引用了老年代的对象老年代不消亡新生代就不消亡但是每次回收还需要扫描看老年代有没有被回收需要遍历老年代所有对象增加内存压力让新生代年龄加1当老年代消亡时新生代也消亡了。 跨代引用假说存在互相引用关系的两个对象是应该倾向于同时生存或者同时消亡的。 依据这条假说我们就不应再为了少量的跨代引用去扫描整个老年代也不必浪费空间专门记录 每一个对象是否存在及存在哪些跨代引用 只需在新生代上建立一个全局的数据结构 该结构被称为“记忆集” Remembered Set 这个结构把老年代划分成若干小块标识出老年代的哪一块内存会存在跨代引用 。此后当发生Minor GC 时只有 包含了跨代引用的小块内存里的对象才会被加入到GC Roots进行扫描 。虽然这种方法需要在对象改变引用关系如将自己或者某个属性赋值时维护记录数据的正确性会增加一些运行时的开销但比起收集时扫描整个老年代来说仍然是划算的。 2、部分收集和整堆收集
部分收集Partial GC指目标不是完整收集整个Java堆的垃圾收集 新生代收集Minor GC/Young GC指目标只是新生代的垃圾收集。老年代收集Major GC/Old GC指目标只是老年代的垃圾收集。目前只有CMS收集器会有单独收集老年代的行为。混合收集Mixed GC指目标是收集整个新生代以及部分老年代的垃圾收集。目前只有G1收集器会有这种行为。
整堆收集Full GC收集整个Java堆和方法区的垃圾收集。
二、垃圾回收算法
1、标记-清除算法
分为标记和清除两个阶段。后续大部分算法也是以它为基础。
标记所有需要回收的对象然后统一回收。
反过来也可以。
标记所有存活的对象回收没有标记的。
缺点
1.程序效率不稳定当Java堆中包含大量对象而其中大部分是需要被回收的这时必须进行大量标记和清除动作导致标记和清除两个过程的执行效率都随对象数量的增长而降低。
2.内存碎片化标记、清除之后会产生大 量不连续的内存碎片空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找 到足够的连续内存而不得不提前触发另一次垃圾收集动作。
2、标记-复制算法 将可用内存按容量划分为大小相等的两块每次只使用其中的一块。当这一块的内存用完了就将还存活着的对象复制到另外一块上面然后再把已使用过的内存空间一次清理掉。 优点解决碎片化问题实现简单运行高效。
缺点可用内存缩小为原来的一半。 3、标记-整理算法
针对老年代其中的标记过程仍然与“标记-清除”算法一样但后续步骤不是直接对可回收对象进行清理而是让所有存活的对象都向内存空间一端移动然后直接清理掉边界以外的内存。
优点1.移动完会使内存更加规整 2.如果老年代多基本上都不移动
缺点1.如果不应用于老年代需要移动的对象过多就会消耗大量资源 2.移动时必须暂停所有程序