如何判断一个对象应该被回收?
在 Java 中采取了 可达性分析法 通过一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成 为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果 在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对 象了。 虚拟机栈中引用的对象、方法区类静态属性引用的对象、方法区常量池引用的对象、本地 方法栈 JNI 引用的对象GC 触发的条件?
1)程序调用 System.gc 时可以触发;(2)系统自身来决定 GC 触发的时机
可以作为 GCRoots 的对象有哪些?
虚拟机栈中引用的对象
方法区中类静态属性引用的对象方法区中常量引用的对象 本地方法栈中引用的对象
JVM 中一次完整的 GC 流程是怎样的,对象如何晋升到老年代?
Java 堆 = 老年代 + 新生代新生代 = Eden + S0 + S1 当 Eden 区的空间满了, Java 虚拟机会触发一次 Minor GC,以收集新生代的垃圾,存活下来的对象,则会转移到 Survivor 区。 大对象(需要大量连续内存空间的 Java 对象,如那种很长的字符串)直接进入老年态; 如果对象在 Eden 出生,并经过第一次 Minor GC 后仍然存活,并且被 Survivor 容纳的话,年