我是靠谱客的博主 爱撒娇野狼,这篇文章主要介绍关于GC的问题,现在分享给大家,希望可以做个参考。

一、相关算法

如果内存不足的情况下会触发GC回收垃圾对象。相关的算法理论。

  1. Mark-Sweep(标记-清除)算法
    标记阶段:标记出所有需要被回收的对象。
    清除阶段:回收被标记的对象所占用的空间。

    存在问题:容易产生内存碎片,碎片太多可能就会导致后续过程中需要为大对象分配空间时无法找到足够的空间而提前触发新的一次垃圾收集动作。(产生空间碎片)
    在这里插入图片描述

  2. Copying(复制算法)
    将可用内存按照容量划分为大小相等的两块。每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另一块上面。然后再把已使用的内存空间一次清理掉。这样就避免了容易出现内存碎片的问题
    存在问题:虽然高校,不易产生碎片,但是对内存空间的使用作出了高昂的代价(能够使用的内存缩减一半)。如果存活对象很多,那么算法的效率将会大大降低。MinorGC算法采用的就是这种算法。(浪费空间,而且效率低)
    在这里插入图片描述

  3. Mark-Compact(标记-整理)算法
    为了解决Copying算法的缺陷,充分利用内存空间。该算法标记阶段和Mark-Sweep一样,但在标记之后,不是直接清理可回收对象。而是将存活对象都向一端移动,然后清理掉端边界以外的内存。
    在这里插入图片描述

注:而垃圾收集器就是回收算法的具体实现,用户可以根据自己的需求组合出新生代和老年代使用的收集器。

二、相关问题

1. Minor GC 和Full GC的区别
Minor GC 又称新生代GC。指发生在新生代的垃圾收集动作;因为Java对象大多是朝生夕灭,所以Minor GC非常频繁,一般回收速度比较快;
Full GC又称Major GC 或者老年代 GC,发生在老年代的GC;出现Full GC经常会盘水至少一次的Minor GC(一般只有当新生代的空间经过Minor GC之后还不足的时候会判断老年代的空间是否充足,如果老年代不足则触发Full GC。有一种情况可能不会产生Minor GC比如当创建对象的内存非常大,此时会直接保存到老年代;)Major GC 速度一般比Minor GC要慢很多10倍以上。

2. Minor GC和Full GC的触发条件
当创建对象的新生代空间不足则触发Minor GC,Minor GC非常频繁,一般回收速度也比较快。当老年代空间不足的时候会触发FullGC。Full GC叫做Major GC。
3. Minor GC处理中存活区空间的基本过程
gc时把存活的对象从一块空间(from space)复制到另一块空间(To space),再把原先的那块内存(From space)清理干净。最后调换From space和To space的逻辑角色(这样下一次gc的时候还可以按这样的方式进行)。当启动Minor GC的时候会停止应用线程启动GC回收线程,这个线程就是一个守护线程。
注:GC在处理存活区空间的时候使用的是复制算法。

最后

以上就是爱撒娇野狼最近收集整理的关于关于GC的问题的全部内容,更多相关关于GC内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(111)

评论列表共有 0 条评论

立即
投稿
返回
顶部