Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XPages:Java类实例太多,导致Java/lang/OutOfMemoryError_Java_Xpages - Fatal编程技术网

XPages:Java类实例太多,导致Java/lang/OutOfMemoryError

XPages:Java类实例太多,导致Java/lang/OutOfMemoryError,java,xpages,Java,Xpages,我们正在Domino8.5.2上构建使用自定义JavaBean的xPages应用程序,开发服务器有时会遇到Java/lang/OutOfMemoryError。在http任务重新启动后,一切都可以正常工作,但如果它发生在客户的服务器上,这当然是一个绝对的杀手。因此,我查看了Eclipse内存分析中的heapdump,并检查了我得到的顶级消费者: 显然,类BCCPropertyStore被实例化的次数太多,以至于它占整个堆的20%,尽管它应该是单实例的。课程开始时是这样的: public cla

我们正在Domino8.5.2上构建使用自定义JavaBean的xPages应用程序,开发服务器有时会遇到Java/lang/OutOfMemoryError。在http任务重新启动后,一切都可以正常工作,但如果它发生在客户的服务器上,这当然是一个绝对的杀手。因此,我查看了Eclipse内存分析中的heapdump,并检查了我得到的顶级消费者:

显然,类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运行时监控其内存使用情况,或者有类似的工具可以帮助我们确定修复和建议是否有效

以下是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;
  }
}