【问题标题】:Java Memory Leak (Loop Traversing)Java 内存泄漏(循环遍历)
【发布时间】:2013-05-30 17:01:45
【问题描述】:

我的服务器有某种内存泄漏什么的,java CPU 使用率在一小时内跳到 100%,几个小时后跳到 1100%。

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

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

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

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

提前致谢。

【问题讨论】:

  • @MitchWheat 在具有足够内核的 Linux 上 it could...
  • @MitchWheat 你错了。在 linux 中,CPU 使用率似乎代表每个核心。所以 2 个核心,每个使用 100% 将显示为 200%
  • @Matthew Kirkley:叹息!显示的内容与实际正确的内容有所不同!
  • @MitchWheat 您决定为自己定义“100% CPU”的含义。在你的定义中,你似乎是孤独的。
  • @MarkoTopolnik 不孤单,微软世界站在他这一边;-)

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


【解决方案1】:

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

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

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

【讨论】:

  • 我在远程连接时遇到困难。在开发系统(我的电脑)上,我没有看到任何异常。部署到服务器并等待 1-2 小时后,使用率跃升 100%。我没有在我最近添加的代码中尝试任何新的东西(比如新的数据结构或不同的类类型)。
  • 以前的 cmets 可能是正确的,百分比可能来自其他内核并支持来自服务器的更多线程。 some article
  • jvisualvm 帮我找到了无限循环。谢谢。
【解决方案2】:

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

【讨论】:

  • 我并没有在 doSomethingWith 上做任何繁重的事情,我只是像在整个服务器上一样获得连接并发送消息。
  • 感谢您的评论,我会寻找其他的。
【解决方案3】:

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

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

http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/intro.html等免费工具

【讨论】:

  • 感谢您的评论。我需要设置分析以查看发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 2016-01-13
相关资源
最近更新 更多