XPages:Java类实例太多,导致Java/lang/OutOfMemoryError
我们正在Domino8.5.2上构建使用自定义JavaBean的xPages应用程序,开发服务器有时会遇到Java/lang/OutOfMemoryError。在http任务重新启动后,一切都可以正常工作,但如果它发生在客户的服务器上,这当然是一个绝对的杀手。因此,我查看了Eclipse内存分析中的heapdump,并检查了我得到的顶级消费者: 显然,类BCCPropertyStore被实例化的次数太多,以至于它占整个堆的20%,尽管它应该是单实例的。课程开始时是这样的:XPages:Java类实例太多,导致Java/lang/OutOfMemoryError,java,xpages,Java,Xpages,我们正在Domino8.5.2上构建使用自定义JavaBean的xPages应用程序,开发服务器有时会遇到Java/lang/OutOfMemoryError。在http任务重新启动后,一切都可以正常工作,但如果它发生在客户的服务器上,这当然是一个绝对的杀手。因此,我查看了Eclipse内存分析中的heapdump,并检查了我得到的顶级消费者: 显然,类BCCPropertyStore被实例化的次数太多,以至于它占整个堆的20%,尽管它应该是单实例的。课程开始时是这样的: public cla
public class BCCPropertyStore {
// Constants
private static final String CLASS_NAME = "BCCPropertySynch ";
private static BCCPropertyStore instance = new BCCPropertyStore();
...
public static BCCPropertyStore getInstance() {
return instance;
}
每次使用它时,我们都用BCCPropertyStore.getInstance()调用它,它是静态的,因此我的理解是不应该有多个实例(Java bean通常在应用程序范围内,所以我不明白为什么它们也应该有多个实例)。
但是,如果我看一下重复类,会发现还有很多xPages类出现的频率远远超过它们应该出现的频率:
没有成千上万的用户登录到应用程序中,所有这些实例都可以为他们创建,只有我和一位开发人员。HTTPJVMMaxHeapSize设置为256M,从理论上讲,对于这种大小的应用程序来说,这应该足够了
为什么JVM在耗尽内存之前会创建这么多无用的类实例,为什么它们不会被垃圾收集器清除?这是xPages特有的问题还是我遗漏了什么
更新
今天错误又发生了,我也不明白。我按照下面的建议将BCCPropertyStore更改为enum,显然这并没有改变任何东西,因为堆转储看起来与我之前发布的屏幕截图中几乎相同
是否有任何工具可以在JVM运行时监控其内存使用情况,或者有类似的工具可以帮助我们确定修复和建议是否有效
以下是stacktrace:
2013-05-07T10:44:32.441+02:00
java.lang.RuntimeException:com.ibm.xsp.FacesExceptionEx:java.lang.OutOfMemoryError
位于com.ibm.designer.runtime.domino.adapter.ComponentModule.initModule(ComponentModule.java:433)
位于com.ibm.domino.xsp.module.nsf.NSFComponentModule.initModule(NSFComponentModule.java:427)
位于com.ibm.domino.xsp.module.nsf.NSFService.loadModule(NSFService.java:561)
位于com.ibm.domino.xsp.module.nsf.NSFService.doServiceInternal(NSFService.java:521)
位于com.ibm.domino.xsp.module.nsf.NSFService.doService(NSFService.java:342)
位于com.ibm.designer.runtime.domino.adapter.LCDEnvironment.doService(LCDEnvironment.java:304)
位于com.ibm.designer.runtime.domino.adapter.LCDEnvironment.service(LCDEnvironment.java:261)
位于com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.service(XspCmdManager.java:291)
原因:com.ibm.xsp.FacesExceptionEx:java.lang.OutOfMemoryError
位于com.ibm.xsp.config.CLBootStrap.initContext(CLBootStrap.java:73)
位于com.ibm.xsp.config.BootStrap.init(BootStrap.java:60)
在com.ibm.xsp.config.ConfigureCoreListener.contextInitialized(ConfigureCoreListener.java:58)上
位于com.ibm.designer.runtime.domino.adapter.ComponentModule.initModule(ComponentModule.java:425)
... 还有7个
原因:java.lang.OutOfMemoryError
位于java.util.Hashtable.newEntry(Hashtable.java:91)
位于java.util.Hashtable.put(Hashtable.java:766)
位于java.util.PropertyPermissionCollection.add(PropertyPermissionCollection.java:40)
位于java.security.Permissions.add(Permissions.java:98)
位于org.apache.harmony.security.fortress.PolicyUtils.toPermissionCollection(policUtils.java:541)
位于org.apache.harmony.security.fortress.DefaultPolicy.getPermissions(DefaultPolicy.java:242)
位于org.apache.harmony.security.fortress.DefaultPolicy.implies(DefaultPolicy.java:365)
位于java.security.ProtectionDomain.implies(ProtectionDomain.java:159)
在java.security.AccessController.checkPermission(AccessController.java:98)
位于java.lang.SecurityManager.checkPermission(SecurityManager.java:533)
位于org.eclipse.osgi.framework.internal.core.framework.checkAdminPermission(framework.java:1299)
位于org.eclipse.osgi.framework.internal.core.BundleHost.getResource(BundleHost.java:266)
位于com.ibm.domino.xsp.module.nsf.Activator.findResource(Activator.java:84)
位于com.ibm.domino.xsp.module.nsf.Activator.findResource(Activator.java:103)
位于com.ibm.domino.xsp.module.nsf.Activator.findResource(Activator.java:103)
位于com.ibm.domino.xsp.module.nsf.Activator.findResource(Activator.java:67)
位于com.ibm.domino.xsp.module.nsf.NotesClientClassLoader.getResource(NotesClientClassLoader.java:130)
位于java.lang.ClassLoader.getResource(ClassLoader.java:438)
位于com.ibm.domino.xsp.module.nsf.ModuleClassLoader.getResource(ModuleClassLoader.java:117)
位于java.lang.ClassLoader.getResourceAsStream(ClassLoader.java:503)
位于javax.xml.parsers.SecuritySupport$4.run(未知源)
位于java.security.AccessController.doPrivileged(AccessController.java:202)
位于javax.xml.parsers.SecuritySupport.getResourceAsStream(未知源)
位于javax.xml.parsers.FactoryFinder.findJarServiceProvider(未知源)
位于javax.xml.parsers.FactoryFinder.find(未知源)
位于javax.xml.parsers.SAXParserFactory.newInstance(未知源)
位于org.apache.commons.digester.digester.getFactory(digester.java:512)
位于org.apache.commons.digester.digester.getParser(digester.java:686)
位于org.apache.commons.digester.digester.getXMLReader(digester.java:902)
位于org.apache.commons.digester.digester.parse(digester.java:1548)
位于com.sun.faces.config.ConfigureListener.parse(ConfigureListener.java:1229)
在com.sun.faces.config.ConfigureListener.contextInitialized上(ConfigureListener.java:328)
位于com.ibm.xsp.config.CLBootStrap.initContext(CLBootStrap.java:65)
... 10多
public enum BCCPropertyStore {
INSTANCE;
public static BCCPropertyStore getInstance() {
return INSTANCE;
}
}