首页 > 解决方案 > 为什么不收集垃圾

问题描述

看下面这行代码

myClass.myMethod(new MyObject());

在这里,我在参数中传递了一个匿名对象,因此该对象没有引用,因此应该有资格进行垃圾收集(我不确定),但是在分配给的参数myMethod(MyObject obj),可能只是在创建此对象并且上下文立即切换到某个其他线程以及当上下文返回到创建该对象的线程时,该对象不存在的情况。

喜欢

thread1 |
        |
        | myClass.myMethod(new MyObject()); <- called, and immediately 
                                                 thread2|
                                                        |
                                                        |
                                                        |  // doing some work
          meanwhile GC sees new MyObject(); and eats it
 thread1| //gets chance again 
        |
        | myClass.myMethod(null); object gone

可能看起来像一个愚蠢的问题,它从来没有发生在我身上,但我只是好奇。

如果你回答请解释

谢谢

标签: java

解决方案


只有当您拥有的对象符合 GC 条件时,垃圾收集才会启动。如果正在处理以下一种(或多种)情况,您可能需要 GC:

  1. 取消您的参考变量
  2. 重新分配参考变量
  3. 孤立岛
  4. 在方法内部创建的对象

您提供的代码片段似乎是第三种情况。MyObject()你在里面实例化myMethod()。因此,当myMethod()被调用时,它会进入堆栈框架。如果您的方法被弹出(通过取消引用),myObject变得无法访问并有资格进行垃圾收集

class Test 
{ 

    // to store object name 
    String obj_name; 

    public Test(String obj_name) 
    { 
        this.obj_name = obj_name; 
    } 

    static void myMethod1(Test t) 
    { 
        //object t1 inside method becomes unreachable when myMethod1(...) removed 
        myMethod2(new Test("t2")); 

    } 
    static void myMethod2(Test t) 
    { 
        // dereference myMethod2(...)
        return;
    } 

    // Driver method 
    public static void main(String args[]) 
    { 
        myMethod1(new Test("t1")); 

        // calling garbage collector 
        System.gc(); 
    } 

    @Override
    // Overriding finalize method to check which object is garbage collected
    protected void finalize() throws Throwable 
    { 
        // will print name of object 
        System.out.println(this.obj_name + " successfully garbage collected!"); 
    } 
} 

推荐阅读