-3

我的服务器发生了某种内存泄漏或其他问题,java CPU 使用率在一小时内跃升至 100%,几个小时后,它跃升至 1100%。

我想知道这个循环遍历是否会导致内存泄漏。

for (Object o : friends.values()) {
    doSomethingWith(o); 
}

Friends 是一个 ConcurrentHashMap,当朋友上线或下线时,它的内容可能会在某些情况下发生变化。

如果这是安全的,我怎样才能找到内存泄漏?

提前致谢。

4

3 回答 3

2

您可以使用 visualvm 在应用程序运行时对其进行监控。

创建内存转储并使用 Eclipse Memory Analyzer 研究您的转储

您应该能够使用这些工具获得更多详细信息

于 2013-06-04T10:32:47.727 回答
1

ConcurrentHashMap 确实是线程安全的。所以我认为这不是你的内存泄漏的根本原因。事实上,如果你的 'doSomethingWith' 代码中有一些糟糕或繁重的代码,就会导致 CPU 占用问题。内存泄漏不等于 CPU 高速率。内存泄漏意味着应用程序的内存不断增加而不是再次降低。

于 2013-06-04T10:34:04.357 回答
1

循环遍历肯定会导致内存泄漏,但这取决于您的“doSomethingWith(o)”方法中发生的情况。

您将需要使用分析工具,例如 http://www.ej-technologies.com/download/jprofiler/files

或免费工具,例如http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/intro.html

于 2013-06-04T10:34:37.437 回答