垃圾收集(本地参考)

NKR*_*NKR 1 java android garbage-collection jvm

我对GC如何在Java中工作感到困惑.

以下是令我困惑的代码段:

private Data data = new Data();

void main() {

    for (int i = 0; i < 100 ; i++) {
       MyThread thread = new MyThread(data);
       thread.start();
    }

    System.gc();

    // Long running process

} 

class MyThread extends Thread {
    private Data dataReference;

    MyThread(Data data) {
        dataReference = data;
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,如果在继续进一步继续之前调用gc(//长时间运行进程)

  • 本地线程会被垃圾收集吗?

  • 或GC将迎来他们(MyThread的本地引用)一样活着,因为它拥有的参考全球参考的数据

Era*_*ran 5

MyThread实例可以被垃圾收集他们做了之后(即他们的run方法做).在for循环结束之后,任何完成MyThreadrun方法的实例都可能被垃圾收集(因为没有对它们的引用).

MyThread每个实例都持有Data对未收集垃圾的实例的引用这一事实不会影响MyThread实例符合垃圾收集条件的时间.

  • @NKR是的.只要它在运行,它就不能被垃圾收集.一旦完成运行,就会应用与任何其他引用类型相同的规则 - 仅当存在对MyThread实例的引用时(例如,如果您的main方法有一个`List <MyThread>`保存对所有创建的`MyThread`的引用) s),它不能被垃圾收集.它拥有对不能进行垃圾回收的实例的引用这一事实无关紧要. (2认同)