从地图中删除后如何从内存中删除 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。
我在公开可用的地图中保留对本地创建对象的引用。当我从地图中删除对象时,它也应该从内存中删除(无效)。
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。