カスタム Java Bean を使用する 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 クラスが必要以上に頻繁に表示されていることが印象的です。
アプリケーションにログインしている何千人ものユーザーが、これらすべてのインスタンスを作成できたわけではありません。私と仲間の開発者だけです。HTTPJVMMaxHeapSize は 256M に設定されており、理論的には、このサイズのアプリケーションには十分すぎるはずです。
JVM がメモリ不足になるまでクラスの無用なインスタンスを大量に作成するのはなぜですか? また、ガベージ コレクターによってそれらのインスタンスが破棄されないのはなぜですか? これは xPages 固有の問題ですか、それとも何か見逃していましたか?
アップデート
今日、エラーが再び発生しましたが、私は賢明ではありません。以下に示すように、BCCPropertyStore を enum に変更しましたが、ヒープ ダンプは以前に投稿したスクリーンショットとほぼ同じに見えるため、明らかに何も変更されませんでした。
実行中に 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.doServiceInternal(NSFService.java:521) で com.ibm.domino.xsp.module.nsf.NSFService.doService(NSFService.java:342) で com. com.ibm.domino の com.ibm.designer.runtime.domino.adapter.LCDEnvironment.service(LCDEnvironment.java:261) の ibm.designer.runtime.domino.adapter.LCDEnvironment.doService(LCDEnvironment.java:304)。 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.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) で org.apache.harmony.security.fortress.DefaultPolicy.implies(DefaultPolicy.java:365) で java.security.ProtectionDomain.implies(ProtectionDomain.java:159) で 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) at com.ibm.domino.xsp.module.nsf.Activator.findResource(Activator.java:103) at 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) at java.lang.ClassLoader.getResourceAsStream(ClassLoader.java:503) javax.xml.parsers.SecuritySupport$4.run(Unknown Source) at java.security. AccessController.doPrivileged(AccessController.java:202) で javax.xml.parsers.SecuritySupport.getResourceAsStream(不明なソース) で javax.xml.parsers.FactoryFinder.findJarServiceProvider(不明なソース) で javax.xml.parsers.FactoryFinder.find(不明)ソース) org.apache.commons.digester.Digester.getFactory(Digester.java:512) の javax.xml.parsers.SAXParserFactory.newInstance(未知のソース) org.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 at java.util.HashMap.newElementArray(HashMap.java:282) at java.util.HashMap.rehash(HashMap.java:686) で java.util.HashMap.rehash(HashMap.java:730) で java.util.HashMap.putImpl(HashMap.java:611) で java.util.HashMap com.ibm.domino.xsp.module.nsf.RuntimeFileSystem の .put(HashMap.java:605)。com.ibm.domino.xsp.module.nsf.NSFComponentModule.initNSFData(NSFComponentModule.java:565) の refresh(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.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.refresh(RuntimeFileSystem.java:269) の com.ibm.domino. xsp.module.nsf.NSFComponentModule.initNSFData(NSFComponentModule.java:565) at com.ibm.domino.xsp.module.nsf.NSFComponentModule.doInitModule(NSFComponentModule.java:439) at com.ibm.designer.runtime.domino. com.ibm.domino.xsp.module.nsf.NSFComponentModule の adapter.ComponentModule.initModule(ComponentModule.java:412)。com.ibm.domino.xsp.module.nsf.NSFService.loadModule(NSFService.java:561) の initModule(NSFComponentModule.java:427) 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) で.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) で.ibm.domino.xsp.bridge.http.engine.XspCmdManager.service(XspCmdManager.java:291)