【深入理解JVM】GC垃圾回收面试热点

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/sinat_27933301/article/details/76222089

  “堆”是一个“运行时”数据区,是通过new等指令建立的,Java的堆是有Java的垃圾回收机制来负责处理的。堆是动态分配内存大小,垃圾收集器可以自动回收不再使用的内存空间。所谓的内存垃圾,是指在堆上开辟的内存空间,在不用的时候就变成了“垃圾”。
  Java中,这部分“垃圾”可以被Java虚拟机的一个程序发现并自动清除掉。Java语言提供了一个系统级的线程级——垃圾收集器线程,来跟踪每一块分配出去的内存空间,当JVM处于空闲循环时,自动回收每一块可以回收的内存。
  垃圾收集器完全是自动被执行的,它不能被强制执行。程序员可以做的只是调用System.gc()来“建议”执行垃圾收集器程序。将对象的引用变量初始化为null值,来暗示垃圾收集器来收集该对象。
  finalize()在该对象垃圾回收前调用。
  JVM使用的是分代垃圾回收的方式,主要是因为在程序运行的时候会有如下特点:
  1.大多数对象在创建后很快就没有对象使用它了。(98%的对象)
  2.大多数在一直被使用的对象很少再去引用新创建的对象。
  因此就将Java对象分为年轻对象和年老对象。JVM将内存分为两个区域,分别称为“新生代”和“老年代”。“新生代”区域中绝大多数新创建对象都存放在这个区域里,一般来说较小而且垃圾回收频率较高。“老年代”区域中存放的是在“新生代”中生存了较长时间的对象,这些对象将被转移到“老年代”区。

1、什么对象需要收集

  就是收集内存里面没有引用的对象定位。

2、怎么去定位到对象没有被引用?

  引用计数(存储在堆对象数据里面(对象头)):一个对象被引用一次,那么应用计数就加1,如果说没有引用,减1 引用计数等于0,就表示这个对象需要回收。

3、在什么时机下GC回收呢?

  新对象在创建的时候,内存空间不足的时候,开始Gc回收(删除对象实例)。

4、有什么特点?

  会中端所有的线程执行,降低程序响应速度。

5、垃圾回收有哪些算法?

【深入理解JVM】GC垃圾回收算法

6、Minor GC和Full GC的区别

  • 新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。年轻代满时就会触发Minor GC,这里的年轻代满指的是Eden代满,Survivor满不会引发GC。
  • 老年代 GC(Major GC / Full GC):指发生在老年代的 GC,出现了 Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在 ParallelScavenge 收集器的收集策略里就有直接进行 Major GC 的策略选择过程)。MajorGC 的速度一般会比 Minor GC 慢 10倍以上。

7、在什么时机下触发full GC?

(1)老年代空间不足
  新生代对象转入及创建为大对象、大数组时,无法找到足够大的连续空间来分配当前对象。
(2)永久代空间不足
  永久代中存放的为一些class的信息等,当系统中要加载的类、反射的类和调用的方法较多时,永久代可能会被占满。
(3)CMS GC时出现promotion failed和concurrent mode failure
(4)统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间)
(5)System.gc()方法的调用

猜你喜欢

转载自blog.csdn.net/sinat_27933301/article/details/76222089