Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,哪些工具可以分析堆外的内存使用情况?_Java_Optimization_Memory_Memory Management_Memory Leaks - Fatal编程技术网

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

在Java中,哪些工具可以分析堆外的内存使用情况?,java,optimization,memory,memory-management,memory-leaks,Java,Optimization,Memory,Memory Management,Memory Leaks,linux中运行的Java进程存在奇怪的内存泄漏问题,交换使用率不断增加。因此,我们自然地查看了堆转储,并使用探查器在一段时间内对其进行监视。我们发现 1) 线程数不会增长 2) 堆使用率没有增长 3) 但是(VIRT)的使用量不断增长(这可能会成为一个问题,因为系统开始耗尽交换空间) 现在有很多工具可以转储堆或监视堆,但对于堆外的内存却没有。有人有什么想法吗 PS这是一个远程服务器,我们没有访问任何GUI的权限。如果1)进程的堆空间没有变化,但2)交换使用率确实发生了变化,这是否表明机箱上的其

linux中运行的Java进程存在奇怪的内存泄漏问题,交换使用率不断增加。因此,我们自然地查看了堆转储,并使用探查器在一段时间内对其进行监视。我们发现

1) 线程数不会增长
2) 堆使用率没有增长
3) 但是(VIRT)的使用量不断增长(这可能会成为一个问题,因为系统开始耗尽交换空间)

现在有很多工具可以转储堆或监视堆,但对于堆外的内存却没有。有人有什么想法吗

PS这是一个远程服务器,我们没有访问任何GUI的权限。

如果1)进程的堆空间没有变化,但2)交换使用率确实发生了变化,这是否表明机箱上的其他进程可能会导致内存使用量的突然增长

换句话说,我的理解是,交换的使用是由操作系统控制的——因此,如果Java进程自己的堆使用没有改变,但交换的使用却改变了,这似乎向我表明问题出在其他地方,而且碰巧操作系统选择Java进程开始占用交换空间


还是我对交换空间的理解有误?

您可能在本机内存中泄漏了某些内容,如套接字。是否有大量连接正在发生,并且您是否正在最后一个块中关闭连接?

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


您是否使用本机库(JNI)?

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

我已经把问题说得更清楚了。基本上我想说的是,这个过程的VIRT在不断增长。这意味着进程占用的总内存正在增长。只是堆部分没有增长。您使用的是哪个JVM/版本?这不太可能,但可能只是为了排除JVM错误而尝试另一种方法。我曾经尝试过openjdk和Sun的JDK,这两种方法在linux中的结果都是一样的。