1

カスタム Java Bean を使用する Domino 8.5.2 で xPages アプリケーションを構築していますが、時々開発サーバーで java/lang/OutOfMemoryError が発生します。http タスクを再起動すると、すべて正常に動作しますが、顧客のサーバーでこれが発生した場合は、もちろん致命的です。そこで、Eclipse メモリ分析でヒープダンプを調べて、上位の消費者を確認したところ、次のようになりました。

スクリーンショット 1

明らかに、クラス 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 クラスが必要以上に頻繁に表示されていることが印象的です。

スクリーンショット 2

アプリケーションにログインしている何千人ものユーザーが、これらすべてのインスタンスを作成できたわけではありません。私と仲間の開発者だけです。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) 

4

4 に答える 4

1

これは大したことではありませんが、多くの Java エンタープライズ サーバーには、クラスローダー、静的オブジェクト、およびアプリケーションの再展開に関連するメモリ リークの問題があると聞いています。

アプリケーションのクリーン/実行サイクルを繰り返すことで java/lang/OutOfMemoryError を再作成できるかどうかを確認していただけますか?

この問題を軽減するには、静的オブジェクトをアプリケーション スコープに移動してみてください。

于 2013-04-26T13:16:14.160 に答える
0

JVM がメモリ不足になるまでクラスの無用なインスタンスを大量に作成するのはなぜですか?

無駄だと思ってはいけません。

ガベージコレクターによってそれらが消されないのはなぜですか?

何かがまだそれらへの参照を持っているからです。クラスは独自の静的参照を持っているので、それだと思います。

これは xPages 固有の問題ですか、それとも何か見逃していましたか?

ここで提供されるコードは、BCCPropertyStore のコンストラクターが表示されないため、原因を特定するには不十分です。また、このクラスをシングルトンにするだけでなく、シリアル化される可能性のあるスコープに配置したかどうかもわかりません。

私が提供する最初の提案は、シングルトンを定義するために列挙型パターンに切り替えることです。

public enum BCCPropertyStore {
  INSTANCE;

  public static BCCPropertyStore getInstance() {
    return INSTANCE;
  }
}
于 2013-04-26T12:56:44.203 に答える
0

上記のネイサンのコメントに加えて....重いカスタムJavaオブジェクトのメモリ内オプションの代わりに、ディスク永続性(つまり、ページをディスクに保存する)も使用する必要があります-ハイエンドのスケーラビリティが必要な場合は特に重要です。その際、Bean とそのメンバーがシリアライズ可能および/またはそれに応じて一時的であることを確認してください。このアプローチにより、ヒープ スペースの使用量が大幅に削減されます。ディスク スペースは RAM よりも安価です。

于 2013-04-30T20:35:17.903 に答える
0

アンマネージドBeanの代わりにマネージドBeanを使用しない理由はありますか? アプリケーションをスコープとするマネージド Bean がある場合でも、ExtLibUtil.resolveVariable() を使用して Java からアクセスできます。そうすればインスタンスは 1 つだけ作成され、必要に応じて JVM (NSF 固有) がインスタンスを作成し、アンロード時に削除します。したがって、クラス自体への静的参照は必要ありません。

拡張ライブラリがない場合は、そのコードを見ると、静的メソッドに必要なものが得られます。

于 2013-04-26T13:29:02.690 に答える