先说结论
1、虚拟机栈(栈帧中的本地变量表)中引用的对象
2、本地方法栈中JNI(即Native方法)引用的对象
3、方法区中类静态属性引用的对象
4、方法区中常量引用的对象
再说原理
可达性分析算法:该算法的基本思路:通过一系列的“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。如下图所示,对象object5,6,7虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为可回收的对象。《深入理解java虚拟机》
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ffa7e67ed4ef4105a323e152c6a0e0e6.png#pic_center)