我负责维护一台运行Java EE Web应用程序的服务器。 Jboss 4.0用作servlet容器,JVM启动时内存足以运行应用程序(我认为):
if [“x $ JAVA_OPTS”=“x”];然后 JAVA_OPTS =“ - server -Xms1500m -Xmx1500m -Dsun.rmi.dgc.client.gcInterval = 3600000 -Dsun.rmi.dgc.server.gcInterval = 3600000” 网络
我必须每天重启jboss,因为java进程开始使用大量内存,因此应用程序运行速度非常慢。
我想知道它是设计问题还是jboss配置问题。
PD:我知道我只写了一些细节,但这就是我所拥有的。感谢。
答案 0 :(得分:1)
使用大量内存没有根本问题。如果VM大小太大并且您创建了大量需要进行垃圾回收的对象,则需要更频繁地执行GC,这意味着更频繁地使用GC。在一个非常大的虚拟机上使用完整的GC会导致“冻结”最多几秒钟。对于某些应用,这可能是一个真正的问题。在其他人可能没有。
您希望随时跟踪VM大小,任何探查器都会执行此操作。 VisualVM附带Java 6u14(iirc)或更高版本,它会做到这一点。如果你随着时间的推移观察你的应用程序,你会看到内存量上升然后突然下降,因为临时对象被垃圾收集形成“锯”模式。
现在随着时间的推移可能会上升(即整体斜率上升)。这可能表示也可能不表示存在问题。它可能表明你正在泄漏记忆。这可能意味着你要对你根本不需要的对象进行引用,这样它们就不会被GC。或者它根本不是问题。这取决于你的应用程序正在做什么。例如,如果随着时间的推移你在内存中缓存越来越多的数据,那么这可能根本不是泄漏,但它可能表明一个架构问题,因为你没有刷新缓存。
1.5GB但是内存不是很多,所以只要你的虚拟机本身没有理由你不必每天重启它。听起来你有另一个问题,粘性参考是最可能的罪魁祸首。