• JVM垃圾回收机制


     区分垃圾

    使用引用计数法,若对象的引用计数为0,对象就标识可以回收。但是这个算法有明显的缺陷,对于循环引用的情况下,循环引用的对象就不会被回收。因此我们可以使用root搜索算法,如果对象能够达到root,就不会被回收,如果对象不能够达到root,就会被回收。

    垃圾回收机制

    1、新生代

    • 主要是用来存放新生的对象。
    • 所有对象创建在新生代的Eden区,当Eden区满后触发新生代的Minor GC,将Eden区和非空闲Survivor区存活的对象复制到另外一个空闲的Survivor区中。
    • 保证一个Survivor区是空的,新生代Minor GC就是在两个Survivor区之间相互复制存活对象,直到Survivor区满为止。

    2,老年代

    • 主要存放应用程序中生命周期长的内存对象。
    • 当Survivor区也满了之后就通过Minor GC将对象复制到老年代。
    • 老年代也满了的话,就将触发Full GC,针对整个堆(包括新生代、老年代、持久代)进行垃圾回收。

    3,持久代

    • 主要存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域。
    • 持久代如果满了,将触发Full GC。

    Java回收算法

    1、复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B。此为新生代最常用的算法。

    2、标记清理:一块区域,标记可达对象(可达性分析),然后回收不可达对象,会出现碎片,那么引出。

    3、标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象。

    4、引用计数法:每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收。但是这个算法有明显的缺陷,对于循环引用的情况下,循环引用的对象就不会被回收。

    垃圾回收器

    1、Serial 收集器:针对新生代的收集器,采用的是复制算法

         Serial Old收集器:针对老年代的收集器,采用的是标记整理算法

    2、Parallel New(并行)收集器:新生代采用复制算法

         Parallel Old(并行)收集器:针对老年代,标记整理

    3、Parallel Scavenge(并行)收集器:针对新生代,采用复制收集算法

    4、CMS收集器:针对老年代,基于标记清理,大致的流程为初始标记--并发标记--重新标记--并发清除

    并行(Parallel):

    • 指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态;
    • 如ParNew、Parallel Scavenge、Parallel Old;

    并发(Concurrent)

    • 指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行);
    • 用户程序在继续运行,而垃圾收集程序线程运行于另一个CPU上;    
    • 如CMS、G1(也有并行);

    5、G1收集器:针对整堆收集器大致的流程为初始标记--并发标记--最终标记--筛选回收

     

    牛客网笔试题

    1、情况会导致持久区jvm堆内存溢出?

    正确答案: C  

    A、循环上万次的字符串处理

    B、在一段代码内申请上百M甚至上G的内存

    C、使用CGLib技术直接操作字节码运行,生成大量的动态类

    D、不断创建对象

    2、jvm中垃圾回收分为scanvenge gc和full GC,其中full GC触发的条件可能有哪些

    正确答案: C D E 

    A、栈空间满

    B、年轻代空间满

    C、老年代满

    D、持久代满

    E、System.gc()

    3、以下哪些jvm的垃圾回收方式采用的是复制算法回收

    正确答案: A D  

    A、新生代串行收集器

    B、老年代串行收集器

    C、并行收集器

    D、新生代并行回收收集器

    E、老年代并行回收收集器

    4、下面关于垃圾收集的描述哪个是错误的?

    正确答案: D

    A、使用垃圾收集的程序不需要明确释放对象

    B、现代垃圾收集能够处理循环引用问题

    C、垃圾收集能提高程序员效率

    D、使用垃圾收集的语言没有内在泄漏问题

    5、下列哪些语句关于内存回收的说明是正确的? (  )

    正确答案: B 

    A、程序员必须创建一个线程来释放内存

    B、内存回收程序负责释放无用内存

    C、内存回收程序允许程序员直接释放内存

    D、内存回收程序可以在指定的时间释放内存对象

    解析:

    • JVM一旦启动,就会创建一个守护线程来监测是否需要有对象内存被释放。
    • 内存回收程序无法直接释放。
    • 不可以指定时间,System.gc(),只是提醒JVM可以进行一次Full GC,但是什么时候真正执行,还是不知道的。

    6、以下哪项陈述是正确的?

    正确答案: E   你的答案: B (错误)

    A、垃圾回收线程的优先级很高,以保证不再 使用的内存将被及时回收

    B、垃圾收集允许程序开发者明确指定释放 哪一个对象

    C、垃圾回收机制保证了JAVA程序不会出现 内存溢出

    D、进入”Dead”状态的线程将被垃圾回收器回收

    E、以上都不对

    解析:

    • 垃圾回收线程属于守护线程,只有所有用户线程都结束运行,才会随jvm一起结束, 优先级很低
    • 垃圾收集器(GC)程序开发者只能推荐JVM进行回收,但何时回收,回收哪些,程序员不能控制。
    • 垃圾回收机制只是回收不再使用的JVM内存,如果程序有严重BUG,照样内存溢出。
    • 进入DEAD的线程,它还可以恢复,GC不会回收

    参考博客链接

    https://blog.csdn.net/ithomer/article/details/9936743

    https://www.cnblogs.com/xing901022/p/7725961.html

    https://blog.csdn.net/tjiyu/article/details/53983650

    转载请于明显处标明出处

    https://www.cnblogs.com/AmyZheng/p/9403927.html

  • 相关阅读:
    PAT Advanced 1044 Shopping in Mars (25) [⼆分查找]
    PAT Advanced 1029 Median (25) [two pointers]
    PAT Advanced 1010 Radix(25) [⼆分法]
    PAT Basic 1070 结绳(25) [排序,贪⼼]
    PAT Basic 1023 组个最⼩数 (20) [贪⼼算法]
    PAT Basic 1020 ⽉饼 (25) [贪⼼算法]
    PAT Advanced 1070 Mooncake (25) [贪⼼算法]
    PAT Advanced 1067 Sort with Swap(0,*) (25) [贪⼼算法]
    PAT Advanced 1038 Recover the Smallest Number (30) [贪⼼算法]
    PAT Advanced 1037 Magic Coupon (25) [贪⼼算法]
  • 原文地址:https://www.cnblogs.com/AmyZheng/p/9403927.html
Copyright © 2020-2023  润新知