1 What:哪些内存区域需要回收
-
程序计数器,虚拟机栈,本地方法栈随线程而生,随线程而灭。栈中栈帧随着方法的调用和返回自动的入栈和出栈,并且栈帧需要多大在编译期就是可知的。因此这些区域的内存分配和回收是确定的,故不需要GC来参与。
-
堆:对象和数组基本都在这个区域,是GC的主力
-
方法区:无用的类型信息和const都是回收的目标,但一般他们是垃圾的概率不大,故这个区域GC的性价比不高
2 What:堆区哪些对象需要被回收
-
确定哪些对象需要回收
-
引用计数法:
使用简单,效率很高。但解决不了相互循环引用的问题。Python和其他一些语言采用的这个方法。
-
可达性分析法:
1) 从GC Roots开始,向下搜索节点,搜索的路径就是引用链。不在引用链中的对象就是无用的对象。 2) GC Roots: a) JVM栈中引用的对象 b) 类static引用,final引用 c) 本地方法栈中引用的对象
-