为什么应用程序堆被释放但机器上的实际内存不能反映这一点?

时间:2016-03-07 15:34:56

标签: java unix memory-leaks heap

我有这个多线程应用程序,它们在发送给它时执行任务。这些任务有时会占用大量内存,但有时候并不多。

无论哪种方式,我都在运行应用程序的unix服务器上查看Java Visual机器,并在unix上使用" top"查看进程级别。

我可以在JVM图上看到,一旦任务完成,堆就会被释放,但是进程的分配内存只会增加(这是top命令中的RES字段)。

这可能是什么原因以及解决这个问题的潜在选择是什么?

非常感谢, 御所

2 个答案:

答案 0 :(得分:1)

一个简单的原因可能是Java没有执行任何垃圾收集周期,也没有执行GC周期,这确实会将内存释放回操作系统。

This article解释了GC周期如何将内存释放回操作系统。

答案 1 :(得分:0)

原因在于操作系统(和JVM)如何处理进程的内存分配。只要你有足够的空闲物理内存,就没有理由回收分配给进程的内存(进程可能会再次需要这个内存,因此重新分配内存将是一项相当昂贵的任务)。这里没有错,所以你无需修理。