从地图中删除后如何从内存中删除 object/instance?

How to remove object/instance from memory after removing it from map?

我在公开可用的地图中保留对本地创建对象的引用。当我从地图中删除对象时,它也应该从内存中删除(无效)。

public class X {
    public boolean infiniteloop = true;

    public X() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (infiniteloop) {
                    System.out.println("Still exists");
                }
            }
        }).start();
    }


public class Y{
      Map myMap = new HashMap();
      public Y() throws InterruptedException{
       X x = new X();
       myMap.put("Key", x);
       Thread.sleep(10000);
       ((X)myMap.get("Key")).infiniteloop= false;
       myMap.remove("Key");
      }
 }

在上面的代码中,"Still exists"是在myMap.remove("Key")之后的printend。这意味着该对象仍然存在于内存中。我怎样才能将它从内存中删除?

Java 负责在最适合您的时候从内存中删除对象,所以不用担心。如果您真的想确保线程已终止,您应该保留对 Thread 和/或 Runnable 的引用,以便您可以尝试优雅地关闭线程(并在必要时突然关闭)。

如果您想尽快从内存中删除对象,您可以尝试 System.gc() You could try System.gc() but that is considered bad practice

使用父实例变量可能会导致线程不终止,这可能涉及一些技巧,但比我聪明的人肯定可以解释这一点:)

您使用 remove 仅从地图中删除了您的对象,但该对象仍然存在。如果没有对它的引用,JVM 将自动垃圾收集您的对象。您需要设置 x=null 以使 X 对象符合 GC 的条件。 这将删除对您的对象的引用。

另外,请记住 GC 过程不是即时的。它不是确定性的。它在 JVM 中的单独线程上运行。

设置 x=null 从原始对象中删除引用。然后该对象有资格进行 GC。此外,该对象已从地图中删除,因此地图中对该对象的任何引用也不存在。

如果您的对象没有进行 GC,请确保在其余代码中没有对该对象的引用。您只提供了伪代码,我认为您应该更广泛地搜索您的问题

运行 线程没有看到 infiniteloop 变量已更改。 要使此更改可见,您需要添加一些同步。例如,将此变量标记为 volatile:

public volatile boolean infiniteloop = true;

现在应该可以了。无需再做任何事情,没有 x=null 之类的东西。 要了解更多信息,请阅读 Java Memory Model