【发布时间】:2011-12-01 00:38:04
【问题描述】:
我正在使用以下命令行选项启动一个 JBoss 4.2 服务器实例:
-Xms8192m -Xmx8192m -XX:+DisableExplicitGC -XX:MaxPermSize=512m
我没有收到 OutOfMemoryException,但我不希望内存使用量会增加,如果因为它们的引用死亡而被 GC 处理。常驻内存使用量(用 top 测量)从 ~ 4.2G 开始,并在接下来的几天到一周内稳步增加,直到达到 8.4G。我仍然没有收到异常。我担心的是,在重要活动期间(JBoss 消息处理 > 10k mssgs/秒),每 6-10 秒会出现约 100-700 毫秒的处理延迟。这似乎也与常驻内存使用量的增加有关。这发生在具有 2 个四核处理器和 32G 内存的机器上。
我将打开额外的命令行参数:
-verbosegc -XX:+PrintGCDetails
但是,我想知道这似乎是垃圾收集问题还是内存泄漏?几周以来,我一直试图追踪潜在的内存泄漏,并发现了我认为肯定会解决它的 XML 处理问题,但这是一条死胡同。无论是否存在泄漏(尤其是禁用显式 GC),驻留内存使用量是否会攀升以满足 Xmx 的值?如果确实不是泄漏,是否还有其他一些垃圾收集参数可能会有所帮助(例如修改垃圾收集器类型、幸存者比率或暂停目标)?
我知道 100-700 毫秒的延迟看起来并不多,但它有可能在这个应用程序中产生重大影响。提前感谢您提供的任何帮助/建议。
【问题讨论】:
-
如果您还没有这样做,我建议您使用 JConsole(或其后续版本)监控您的 Java 进程:componative.com/content/controller/developer/insights/jconsole1/…
-
猜测一下,是不是有什么东西(例如缓存)使用了一堆
SoftReferences? -
@paulsm4 - 我还没有这样做。感谢您的提示,我会检查一下。使用 jconsole 是否会对性能产生影响?
-
@tc - 我不相信有缓存。传入消息替换散列图中的对象,但不添加到散列中。根据 javadocs,如果存在的话,对 HashMap 执行 put 会删除现有对象。那是我能找到的唯一存放东西的地方。
-
@user979273 -- 但是,当然,如果您收到的传入消息与现有消息的密钥不同,它将增加整体大小。还有很多其他地方可以让复杂的服务器存储东西,以及 JVM 本身可能缓存东西的地方。
标签: java memory-management jboss garbage-collection