一、什么是垃圾
內存中已經不再被使用到的空間就是垃圾
二、要進行垃圾回收,如何判斷一個對象是否可以被回收?
- 引用計數法
很難解決對象之間的循環引用問題
- 枚舉根節點做可達性分析
通過一系列名為“GC Roots”的對象作為起始點,從“GC Roots”對象開始向下搜索,如果一個對象到“GC Roots”沒有任何引用鏈相連,說明此對象可以被回收。
三、哪些對象可以作為 GC Roots 的對象:
- 虛擬機棧中局部變量(也叫局部變量表)中引用的對象
- 方法區中類的靜態變量、常量引用的對象
- 本地方法棧中 JNI (Native方法)引用的對象
public class GCRootDemo { private byte[] byteArray = new byte[100 * 1024 * 1024]; private static GCRootDemo gc2; private static final GCRootDemo gc3 = new GCRootDemo(); public static void m1(){ GCRootDemo gc1 = new GCRootDemo(); System.gc(); System.out.println("第一次GC完成"); } public static void main(String[] args) { m1(); } }
解釋:
gc1:是虛擬機棧中的局部變量
gc2:是方法區中類的靜態變量
gc3:是方法區中的常量
都可以作為GC Roots 的對象。