如果对象的方法之一在调用堆栈上,Java中的垃圾收集器是否会删除该对象?

问题描述 投票:0回答:1

一般问题

在Java中,没有指向对象的引用,但是此对象的方法之一仍在调用堆栈上。垃圾回收器是否有可能在从调用堆栈弹出其方法之前删除该对象,还是等待直到该方法弹出?(请在下面参考我的具体问题)

特定问题

类结构

简单的单链表的实现:

  • 类别LIST:LIST_ELEMENT类型的属性“开始”
  • 带有所有必需抽象方法的抽象类LIST_ELEMENT
  • END和NODE类继承自LIST_ELEMENT
  • END没有任何属性,它始终标记列表的末尾
  • NODE的属性是LIST_ELEMENT类型的“ next”和DATA_ELEMENT类型的“ data”
  • DATA_ELEMENT是一个接口,必须由要存储在列表中的任何类来实现

列表方法

  • insertSorted:在插入排序列表的同时插入元素
  • sort:首先清除列表,然后使用insertSorted方法再次插入每个元素,对列表进行排序

代码

public class LIST
{
    private LIST_ELEMENT begin = new END();

    // some methods to add or remove elements

    public void clear()
    {
        begin = new END();
    }

    public void insertSorted(DATA_ELEMENT dataNew)
    {
        begin = begin.insertSorted(dataNew);
    }

    public void sort()
    {
        begin.sort(this);
    }
}
public abstract class LIST_ELEMENT
{
    public abstract LIST_ELEMENT insertSorted(DATA_ELEMENT dataNew);
    public abstract void sort(LIST list);
}
public class END extends LIST_ELEMENT
{
    @Override
    public LIST_ELEMENT insertSorted(DATA_ELEMENT dataNew)
    {
        return new NODE(this, dataNew);
    }

    @Override
    public void sort(LIST list)
    {
        list.clear();
    }
}
public class NODE extends LIST_ELEMENT
{
    private LIST_ELEMENT next;
    private DATA_ELEMENT data;

    public NODE(LIST_ELEMENT nextNew, DATA_ELEMENT dataNew)
    {
        next = nextNew;
        data = dataNew;
    }

    @Override
    public LIST_ELEMENT insertSorted(DATA_ELEMENT dataNew)
    {
        if(data.isSmallerThan(dataNew))
        {
            next = next.insertSorted(dataNew);
            return this;
        }
        else
        {
            return new NODE(this, dataNew);
        }
    }

    @Override
    public void sort(LIST list)
    {
        next.sort(list);
        list.insertSorted(data);
    }
}
public interface DATA_ELEMENT
{
    public boolean isSmallerThan(DATA_ELEMENT dataCompare);
}

问题

已经实现了这种排序算法,是否安全?清除列表后,垃圾收集器能否从NODE对象中删除数据(因此调用list.insertSorted(data);发生意外情况),还是调用堆栈上的方法算作对对象的引用,以使data属性在LIST.sort调用的整个过程中都有效?是否保证在此期间不删除对象?

在我的测试中,对LIST.sort的调用总是按预期对列表进行排序。

java garbage-collection singly-linked-list
1个回答
1
投票

在Java中,没有指向对象的引用,但其中之一是 该对象的方法仍在调用堆栈上。

这不可能发生。如果某个方法正在运行,则引用其方法被调用的对象。

垃圾回收器是否有可能在删除对象之前 它的方法从调用堆栈中弹出,或者等待直到 方法弹出?

只要方法正在运行,就存在对该对象的引用。这就是为什么无法删除此类对象的原因。

© www.soinside.com 2019 - 2024. All rights reserved.