2012-02-21 21 views
0

我正在使用运行几个小时的简单测试程序。当堆稳定时诊断Java中的RSS泄漏

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匿名映射,他们随着时间的推移而增加。

我在Sun JDK 1.6.0_31上使用了Centos 5.7 x64。

RSS应该随着时间而增加吗?

+0

您的程序是否创建了499个运行无限循环的线程? – ydroneaud 2012-02-21 13:28:24

+3

嗨,即时通讯不知道什么是RSS的意思,但尝试改变这个新的字符串(“你好世界”);到这个“你好世界”;如果你不让它在你每次没有内存泄漏的时候创建一个新的字符串。无论如何,这个练习的重点是什么? – 2012-02-21 13:33:28

+0

@yael:RSS表示驻留集大小,您可以在http://en.wikipedia.org/wiki/Resident_set_size – tr9sh 2012-02-21 16:49:12

回答

0

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

通常最好找到演示你的问题的最简单的例子。它必须是500个线程,还是只有你拥有的核心数量?当你有一个繁忙的线程时会发生吗?如果你创建一个new Object()而不是?如果你忙着等待而不创建一个对象呢?

+0

上阅读更多内容。肯定具有比500个线程更少的内核。我试图理解为什么RSS在这个简单的例子中增加的行为,这是唯一运行的JAVA应用程序。我倾向于认为这是由于共享库加载到内存中? – 2012-02-22 02:34:08

+0

除非你简化你的例子,否则很难说。这可能是由过度的上下文切换或GCing引起的问题。它可能以某种方式特定于您的机器。这可能是因为连接了监视工具,或在其他进程中使用共享库。 – 2012-02-22 07:57:58