我的服务器有某种内存泄漏或类似的东西,java CPU使用率在一小时内跃升至100%,经过数小时后,它跃升至1100%。
我想知道这个循环遍历是否会导致内存泄漏。
for (Object o : friends.values()) {
doSomethingWith(o);
}
朋友是ConcurrentHashMap,当朋友上线或离线时,其内容可能会在某些情况下发生变化。
如果这是安全的,我怎样才能找到内存泄漏?
提前致谢。
答案 0 :(得分:2)
您可以使用visualvm在应用程序运行时监控它。
创建内存转储并使用Eclipse Memory Analyzer来研究转储
您应该可以使用这些工具获取更多详细信息
答案 1 :(得分:1)
ConcurrentHashMap确实是线程安全的。所以我不认为这是你的内存泄漏的根本原因。 事实上,如果你在'doSomethingWith'的代码中有一些可怕或重的代码,它将导致CPU占用问题。 内存泄漏与CPU高速率不一样。 内存泄漏意味着应用程序的内存不断增加而不是再次降低。
答案 2 :(得分:1)
循环遍历肯定会导致内存泄漏,但这取决于你的'doSomethingWith(o)'方法中发生的事情。
您需要掌握一个分析工具,例如 http://www.ej-technologies.com/download/jprofiler/files
或免费工具,例如http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/intro.html