有哪些工具可以分析Java中堆外的内存使用情况?

时间:2009-09-28 20:40:22

标签: java optimization memory memory-management memory-leaks

我们有一个奇怪的内存泄漏问题,在linux中运行的Java进程有一个不断增长的交换使用。所以很自然地,我们查看了堆转储,并使用分析器在一段时间内监视它。我们发现了

1)线程数不增加
2)堆使用量不增长 3)然而(VIRT)使用量不断增长(由于系统开始耗尽交换空间,这可能会成为一个问题)

现在有大量的工具可以转储堆或监视堆,但没有可用于堆外的内存。有人有什么想法吗?

PS这是一个远程服务器,我们无法访问任何GUI。

4 个答案:

答案 0 :(得分:1)

你可能会在本机内存中泄漏某些东西,比如套接字。是否有很多连接发生,你是否在finally块中关闭连接?

答案 1 :(得分:0)

不是1)进程的堆空间没有改变而2)交换使用确实发生变化的情况表明盒子上的其他一些进程可能是内存使用量突然增长的原因吗?

换句话说,我的理解是交换使用的东西是由操作系统调节的 - 所以如果Java进程自己的堆使用没有改变但交换使用没有改变,那似乎表明问题出在其他地方而实际上操作系统正在选择你的Java进程来开始占用交换空间。

或者我对交换空间有错误的理解吗?

答案 2 :(得分:0)

JVM内存的其他部分是否会增长?例如permgen空间?

您使用本机库(JNI)吗?

答案 3 :(得分:0)

我会通过回答另一个问题来回答。 JVM的堆大小配置是否可能超过您拥有的免费物理内存?即使您将初始堆大小定义为远小于最大堆大小,并且JVM全部分配它,它也永远不会将其返回给操作系统,即使您将其全部垃圾收集,并且您再也没有任何分配。不要在1G RAM服务器上混淆1.5GB最大堆。请检查配置的最大堆大小是否“输入”您拥有的可用RAM以及其他进程,特别是如果它是服务器应用程序。否则,您的应用程序将出现大量页面错误并将一直交换。