【发布时间】:2018-04-29 07:22:14
【问题描述】:
在这段代码中
new Thread(new Runnable() {
@Override
public void run() {
byte b[] = new byte[1024*1024*1024];
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// just for testing
b = null;
}
},"thread").start();
5 秒后 1 GB 的内存应该是空闲的! 但它不会!
永远不会!!
我怎样才能找回记忆?
【问题讨论】:
-
为什么你认为它应该是免费的?它是符合条件的 GC,这并不意味着它很快就会被 GC。您所能做的就是相信 GC 最终会做到这一点。
-
@AndyTurner 不符合 GC 条件。
-
@shmosel 正确,但在休眠后,变量被重新分配为 null,删除了对
b的最后引用。 OP 期望它在在睡眠之后立即被释放。 -
@mehranrafiee 为什么?你想达到什么目标,你想解决什么问题? GC 最终将运行,清理阵列。如果您希望进程将一些堆内存返回给操作系统,那么这也是可能的。一些 GC 可以做到这一点,例如G1 GC,它是 Java 9 中的默认 GC(但也可以在以前的版本中启用)。您可以尝试运行
System.gc(),但这只是一种启发式方法,它可以根据许多事情实现为无操作... -
任务管理器不会测量JVM堆,它会测量分配给JVM进程的总内存,这是另一回事。要查看 JVM 堆,请使用 jvisualvm 之类的工具。 jvisualvm 工具可以向您显示堆内分配的对象,您可以使用它向您的 JVM 发送信号,请求它在设置为 null 后删除任何孤立对象,例如您的
b数组。如果在从 jvisualvm 发送此类信号后的一段时间内,jvisualvm 报告分配的对象占用的空间随着时间的推移继续增长,那么您可能有内存泄漏。
标签: java multithreading memory javafx memory-leaks