代码之家  ›  专栏  ›  技术社区  ›  erotsppa

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

  •  2
  • erotsppa  · 技术社区  · 15 年前

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

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

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

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

    4 回复  |  直到 15 年前
        1
  •  1
  •   Amir Afghani    15 年前

    你可能在本机内存中泄漏了一些东西,比如套接字。是否有很多连接正在发生,并且您是否在最后一个街区关闭了连接?

        2
  •  0
  •   matt b    15 年前

    1)进程的堆空间没有变化,但2)交换使用率确实发生了变化,这种情况难道不表明盒子上的其他进程可能会导致内存使用量的突然增长吗?

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

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

        3
  •  0
  •   Eduard Wirch    15 年前

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

    您使用本机库(JNI)吗?

        4
  •  0
  •   Vadim Punski    15 年前

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