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

posted @ 2018-08-01 21:06  AmyZheng  阅读(1221)  评论(0编辑  收藏  举报