【问题标题】:What are some tools that can analyse memory usage outside of the heap in Java?有哪些工具可以分析 Java 堆外的内存使用情况?
【发布时间】:2010-12-02 03:12:17
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您使用的是哪个 JVM/版本?这不太可能,但也许尝试另一个只是为了排除 JVM 错误。
  • 我试过 openjdk 和 Sun 的 JDK,在 linux 下都一样。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    1) 进程的堆空间没有改变但 2) 交换使用量确实改变的情况是否表明盒子上的某些其他进程可能会导致内存使用量的突然增长?

    换句话说,我的理解是,像交换使用这样的东西是由操作系统调节的——所以如果 Java 进程自己的堆使用没有改变,但交换使用发生了变化,这似乎表明问题出在其他地方,并且恰好操作系统正在选择您的 Java 进程来开始占用交换空间。

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

    【讨论】:

    • 我已经把问题说得更清楚了。基本上我要说的是这个过程的 VIRT 不断增长。这意味着该进程要求的总内存正在增长。只是它的堆部分没有增长。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-23
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 2012-04-25
        • 2011-10-02
        • 1970-01-01
        相关资源
        最近更新 更多