我们正在使用自定义 Java Beans 的 Domino 8.5.2 上构建 xPages 应用程序,并且开发服务器有时会遇到 java/lang/OutOfMemoryError。重新启动http任务后一切正常,但是如果它发生在客户的服务器上,这当然是一个绝对的杀手。因此,我查看了 Eclipse 内存分析中的堆转储,并检查了我得到的顶级消费者:
显然,BCCPropertyStore 类经常被实例化,以至于它占整个堆的 20%,尽管它应该是单例的。课程是这样开始的:
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-classes 出现的频率比它们应该出现的要多得多:
没有成千上万的用户登录到应用程序,所有这些实例都可以为其创建,只有我和一位开发人员。HTTPJVMMaxHeapSize 设置为 256M,理论上这对于一个应用程序的大小应该绰绰有余。
为什么 JVM 会创建这么多无用的类实例,直到内存耗尽,为什么它们没有被垃圾收集器清除?这是特定于 xPages 的问题还是我错过了什么?
更新
今天错误再次发生,我并不聪明。我按照下面的建议将 BCCPropertyStore 更改为枚举,显然这并没有改变任何东西,因为堆转储看起来与我之前发布的屏幕截图中的几乎相同。
是否有任何工具可以在 JVM 运行时监控它的内存使用情况,或者类似的工具可以帮助我们确定修复和建议是否有效?
这是堆栈跟踪:
2013-05-07T10:44:32.441+02:00 java.lang.RuntimeException: com.ibm.xsp.FacesExceptionEx: java.lang.OutOfMemoryError at 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.doService(NSFService.java:342) 在 com.ibm.domino.xsp.module.nsf.NSFService.doServiceInternal(NSFService.java:521) 在 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:com.ibm.xsp.config.CLBootStrap.initContext(CLBootStrap.java:73) 处的 java.lang.OutOfMemoryError com.ibm.xsp.config.BootStrap.init(BootStrap.java:60) ) at com.ibm.xsp.config.ConfigureCoreListener.contextInitialized(ConfigureCoreListener.java:58) at com.ibm.designer.runtime.domino.adapter.ComponentModule.initModule(ComponentModule.java:425) ... 7 更多: java.util.Hashtable.newEntry(Hashtable.java:91) 处的 java.lang.OutOfMemoryError 在 java.util.PropertyPermissionCollection.add(PropertyPermissionCollection.java:40) 处的 java.util.Hashtable.put(Hashtable.java:766) ) 在 java.security.Permissions.add(Permissions.java:98) 在 org.apache.harmony.security.fortress.PolicyUtils.toPermissionCollection(PolicyUtils.java:541) 在 org.apache.harmony.security.fortress.DefaultPolicy。getPermissions(DefaultPolicy.java:242) at org.apache.harmony.security.fortress.DefaultPolicy.implies(DefaultPolicy.java:365) at java.security.ProtectionDomain.implies(ProtectionDomain.java:159) at java.security.AccessController .checkPermission(AccessController.java:98) at java.lang.SecurityManager.checkPermission(SecurityManager.java:533) at org.eclipse.osgi.framework.internal.core.Framework.checkAdminPermission(Framework.java:1299) at 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(激活器。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(Unknown Source) 在 java.security。 AccessController.doPrivileged(AccessController.java:202) 在 javax.xml.parsers.FactoryFinder.findJarServiceProvider(Unknown Source) 在 javax.xml.parsers.FactoryFinder.find(Unknown) 在 javax.xml.parsers.SecuritySupport.getResourceAsStream(Unknown Source)来源)在 javax.xml.parsers.SAXParserFactory.newInstance(Unknown Source) 在 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 更多 2013-05-07T10:44:33.879+02:00 java.lang.OutOfMemoryError 在 java.util.HashMap.newElementArray(HashMap.java:282) 在java.util.HashMap.rehash(HashMap.java:686) 在 java.util.HashMap.rehash(HashMap.java:730) 在 java.util.HashMap.putImpl(HashMap.java:611) 在 java.util.HashMap .put(HashMap.java:605) 在 com.ibm.domino.xsp.module.nsf.RuntimeFileSystem。在 com.ibm.domino.xsp.module.nsf.NSFComponentModule.initNSFData(NSFComponentModule.java:565) 上刷新(RuntimeFileSystem.java:269) 在 com.ibm.domino.xsp.module.nsf.NSFComponentModule.doInitModule(NSFComponentModule. java:439) 在 com.ibm.designer.runtime.domino.adapter.ComponentModule.initModule(ComponentModule.java:412) 在 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:439) 在 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) 2013-05-07T10:46:17.582+02:00 java.util.OutOfMemoryError。 HashMap.newElementArray(HashMap.java:282) 在 java.util.HashMap.rehash(HashMap.java:686) 在 java.util.HashMap.rehash(HashMap.java:730) 在 java.util.HashMap.putImpl(HashMap .java:611) 在 java.util.HashMap.put(HashMap.java:605) 在 com.ibm.domino.xsp.module.nsf.RuntimeFileSystem.refresh(RuntimeFileSystem.java:269) 在 com.ibm.domino。 xsp.module.nsf.NSFComponentModule.initNSFData(NSFComponentModule.java:565) 在 com.ibm.domino.xsp.module.nsf.NSFComponentModule.doInitModule(NSFComponentModule.java:439) 在 com.ibm.designer.runtime.domino。 com.ibm.domino.xsp.module.nsf.NSFComponentModule 上的 adapter.ComponentModule.initModule(ComponentModule.java:412)。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:439) 在 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)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)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)