什么情况下JVM内存中的一个对象会被垃圾回收?
1、什么时候会触发垃圾回收?
平时我们系统运行创建的对象都是优先分配在新生代里的,如图:
然后如果新生代里的对象越来越多,都快满了,此时就会触发垃圾回收,把新生代没有人引用的对象给回收掉,释放内存空间
这就是新生代一个核心的垃圾回收触发时机,如下图。
2、被哪些变量引用的对象是不能回收的?
首先第一个问题,一旦新生代快满了,那么垃圾回收的时候,到底哪些对象是能回收的,哪些对象是不能回收的呢?
这个问题非常好解释,JVM中使用了一种可达性分析算法来判定哪些对象是可以被回收的,哪些对象是不可以被回收的。这个算法的意思,就是说对每个对象,都分析一下有谁在引用他,然后一层一层往上去判断,看是否有一个GC Roots
比如最常见的,就是下面的一种情况。
上面的代码其实就是在一个方法中创建了一个对象,