Java每日5问(第26天)

如何判断一个对象应该被回收?

  1. 在 Java 中采取了 可达性分析法
    通过一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成 为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果 在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对 象了。
  2. 虚拟机栈中引用的对象、方法区类静态属性引用的对象、方法区常量池引用的对象、本地 方法栈 JNI 引用的对象

GC 触发的条件?

1)程序调用 System.gc 时可以触发;(2)系统自身来决定 GC 触发的时机

可以作为 GCRoots 的对象有哪些?

虚拟机栈中引用的对象

方法区中类静态属性引用的对象方法区中常量引用的对象
本地方法栈中引用的对象

JVM 中一次完整的 GC 流程是怎样的,对象如何晋升到老年代?

Java 堆 = 老年代 + 新生代新生代 = Eden + S0 + S1
当 Eden 区的空间满了, Java 虚拟机会触发一次 Minor GC,以收集新生代的垃圾,存活下来的对象,则会转移到 Survivor 区。
大对象(需要大量连续内存空间的 Java 对象,如那种很长的字符串)直接进入老年态; 如果对象在 Eden 出生,并经过第一次 Minor GC 后仍然存活,并且被 Survivor 容纳的话,年
龄设为 1,每熬过一次 Minor GC,年龄+1,若年龄超过一定限制(15),则被晋升到老年态。即长期存活的对象进入老年态。
老年代满了而无法容纳更多的对象,Minor GC 之后通常就会进行 Full GC,Full GC 清理整个内存堆 – 包括年轻代和年老代。
Major GC 发生在老年代的 GC,清理老年区,经常会伴随至少一次 Minor GC,比 Minor GC
慢 10 倍以上。

双亲委派模型?

双亲委派模型工作过程是:
如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求 委派给父类加载器完成。每个类加载器都是如此,只有当父加载器在自己的搜索范围内找不 到指定的类时(即 ClassNotFoundException),子加载器才会尝试自己去加载。

猜你喜欢

转载自blog.csdn.net/qq_39899164/article/details/107119398