【问题标题】:Diagnose RSS leak in Java when heap is stable当堆稳定时诊断 Java 中的 RSS 泄漏
【发布时间】:2012-03-11 19:13:53
【问题描述】:

我正在使用一个运行了几个小时的简单测试程序。

public static void main(String[] args)  {
    for (int i=1; i<500; i++) {
        run();
    }
}

public static void run() {
    new Thread(new Runnable() {

        @Override
        public void run() {
            while (true) {
                new String("Hello World");
            }
        }
    }).start();
}

当我通过 PS 或 pmap 监控进程时,RSS 部分增加,而 jvisualvm 报告堆稳定。

如果我总结所有 RSS 匿名映射,它们会随着时间的推移而增加。

我正在使用 Centos 5.7 x64 和 Sun JDK 1.6.0_31。

RSS 是否应该随着时间的推移而增加?

【问题讨论】:

  • 您的程序是否创建了 499 个运行无限循环的线程?
  • 嗨,我不确定 RSS 是什么意思,但尝试更改这个新字符串(“Hello World”);到这个“Hello World”;如果你不让它每次都创建一个新字符串,你可能不会有内存泄漏。这个练习有什么意义呢?
  • @yael: RSS 代表 resident set size,你可以在en.wikipedia.org/wiki/Resident_set_size阅读更多内容

标签: java linux memory pmap


【解决方案1】:

随着后台任务将更多代码/资源带入内存,RSS 会随着时间的推移而增加。在您的示例中,它应该不多。注意:如果您在另一个 JVM 实例中使用共享库,则该共享库会加载到内存中,这可能会增加您的 RSS。

通常最好找到最简单的例子来说明你的问题。它必须是 500 个线程,还是只是您拥有的核心数?当你有一个繁忙的线程时会发生这种情况吗?如果您改为创建new Object() 会怎样?如果您忙于等待而没有创建对象怎么办?

【讨论】:

  • 内核数肯定少于 500 个线程。当这是唯一运行的 JAVA 应用程序时,我试图了解为什么在这个简单的示例中 RSS 会增加的行为。我倾向于认为这是由于共享库加载到内存中?
  • 除非您简化示例,否则很难判断。这可能是由过多的上下文切换或 GCing 引起的问题。它可能以某种方式特定于您的机器。这可能是由于连接监控工具或在其他进程中使用您的共享库造成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 2012-10-09
  • 2015-06-08
  • 1970-01-01
  • 2013-10-24
相关资源
最近更新 更多