J2EE Struts应用程序中出现意外的堆使用情况

时间:2010-02-15 12:53:27

标签: java-ee weblogic memory-management daemon

我对我的应用中的堆使用情况几乎没有疑问。在实例中,观察到周末用户活动最小(或零),但堆使用率线性增加,达到阈值,导致GC启动。我希望分析此堆使用的原因并确认这是否正常和预期。假设没有用户活动,这个堆使用可能是由守护进程引起的,例如我的应用程序的守护程序进程或Weblogic线程。如何确认哪个守护程序进程导致此行为,是否需要执行任何操作才能解决此问题?

我已经对我的应用程序的守护进程进行了大量测试,并且相当确信它不会滥用堆。 但是我可以用Weblogic的守护进程做什么呢?我应该忍受它还是打架?

编辑:我正在使用BEA JRockit 1.6在Weblogic 10.3上运行。在垃圾收集器运行之前,观察到堆使用量的线性增加约20小时。我用JProbe测试了我的应用程序,但没有发现任何泄漏。

3 个答案:

答案 0 :(得分:2)

我肯定会尝试寻找问题(这可能在您的代码中,而不是在WebLogic中)。问题是您没有提供有关您的环境的详细信息(例如WLS版本,Java版本,平台)或您的问题(例如,到GC需要多长时间)所以提供指导有点困难但是......

如果这是一个选项,我会将VisualVM用于analyze this memory leak(或您选择的探查器)。如果可能,尝试在本地环境中重现问题,这将更容易。如果没有,这是JMX URL:

service:jmx:iiop:///jndi/iiop://host:port/weblogic.management.mbeanservers.runtime

只需确保启用匿名管理员查找:转到域>安全>常规并选中匿名管理员查找已启用复选框)。

还要确保为管理服务器和应用程序服务器启用IIOP协议:转到服务器>协议,并选中 IIOP 复选框)。还要确定

另一种选择是采用一些堆转储并使用Eclipse MAT等工具进行分析。

更新:由于GC需要大约20个小时,我会安排一个任务来生成一些堆转储(例如每小时一个)并分析它们以找出哪些对象随着时间流逝占用内存。这可能会给罪魁祸首提供一个暗示。

答案 1 :(得分:1)

似乎是J2EE服务器的正常行为。即使您的应用程序根本没有负载,服务器上也会有一些活动(管理,监控等),这些活动将继续创建对象。即使是在分析堆使用情况的活动也会创建对象。

我认为对象创建的速度非常小,因为填充堆并启动GC循环需要20个小时。关于您的担忧的更多细节可能会有所帮助

即。 - 您是否收到OutOfMemory错误 - 什么是JVM创业公司? (堆大小,垃圾收集器类型等。)

答案 2 :(得分:1)

看看盒子上的prstat,了解周末运行的其他工作。 cron / backup jobs等运行并命中你的服务器是很常见的,并且团队已经解决了为什么首先设置它们的原因。