【发布时间】:2014-04-23 19:33:50
【问题描述】:
我们有几台虚拟机在生产中运行数据服务,客户端向数据服务发送 Restful HTTP 请求,负载有点重(每台主机通常每秒 500 个请求),并且每个虚拟机上的负载总是平衡的。我们在所有主机上都有相同的配置(2 个 CPU,-Xms2048m -Xmx4096m -XX:MaxPermSize=192m -XX:NewSize=512m -XX:MaxNewSize=512M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError)
两天前,我们看到其中 5 台虚拟机上的旧代堆使用量开始增长(每天 300 MB),其他虚拟机上的旧代堆使用量保持不变(大约 80 MB),我们正在尝试识别根原因,请问这是内存泄漏问题还是只是正常情况?老一代内存使用量的增长是否总是意味着 Java 中的内存泄漏?
谢谢。
更新:我们昨天刚刚重新启动了这 5 台主机,所有这些主机上的 old gen 堆使用都像其他主机一样恢复正常,但是,在我们今天早上的峰值负载之后,其中一台主机上的 old gen 堆使用开始了再次成长……
【问题讨论】:
-
我是这些东西的新手,但我认为 GC 应该完全防止内存泄漏。换句话说,我认为内存泄漏和 java 从来就不是同一句话。
-
Java only GCs 未引用的内存。如果您创建一个 for 循环,不断向列表中添加新对象,您将在说蓝莓派之前耗尽内存。
-
@Takendarkk java 出现内存泄漏并非不可能,但 GC 本身肯定存在错误。我相信有过这样的案例,不过不要引用我的话。
-
@NatanCox 我不确定内存泄漏是否真的与简单地用完所有内存一样。
-
@Nata 在 Java 中完全有可能发生内存泄漏——例如,将越来越多的数据放入您用作缓存的
HashMap中,而没有任何驱逐/过期策略
标签: java memory-leaks