我使用Domino服务器并开发java代理。通常我将外部jar文件放入脚本库,但定期获取OutOfMemory。我将jar从脚本库中提取到jvm / lib / ext。我可以通过ClassLoader获取类,但不能通过import语句。 我应该怎么做才能通过import语句使其工作?
答案 0 :(得分:1)
您实际上可以明确地将jar添加到Java代理。请注意,默认情况下Java代理没有包名称,并且在引用语句中引用包时,您需要引用正确的包名称。将jar导入代理中的内容为here,版本为8.5 here和here
另外,我怀疑你没有明确清理你的java对象。 JVM和Domino内存堆之间的连接“很弱”。所以你必须在Domino对象上拥有自己的垃圾收集,以保持服务器的内存清洁。它对我来说仍然是黑魔法,但我的理解是,尽管代理应该“包含”会话,然后在终止时释放内存,但未正确回收的Domino对象可能会泄露Domino的堆内存。以下是我保持记忆清洁的简单提示:
1 /将会话对象保留在包装器对象中。创建一个在其中包含Domino会话对象的类(我称之为SessionWrapper)。然后仅在NotesMain方法中声明SessionWrapper对象,不要在类级别声明它。这个SessionWrapper类需要拥有调用Session.recycle()的自己的循环方法,并且需要在NotesMain的末尾调用它。其原因在第2点解释。如果你没有在NotesMain中调用任何其他方法,那么你真的不需要这个包装器。关于回收会话,请参阅第4点。
2 /将SessionWrapper传递给需要Domino访问的所有方法。基本上你在这个包装类中传递会话作为参数。这是因为我们不希望在类级别声明会话对象。这并不理想,但它可以防止因将会话类保持在类级别而导致的内存泄漏。
3 /积极回收。在我看到这个示例循环
之前,这对我来说从来没有多大意义ViewEntryCollection vec = view.getAllEntries();
ViewEntry ve = vec.getFirstEntry();
While (ve!=null) {
ViewEntry veNext = vec.getNextEntry(ve);
// do stuff
ve.recycle;
ve = null;
ve = veNext;
}
了解“ve”对象如何被回收,veNext将获得下一个对象。基本上你需要在完成它之后回收每个对象,“getNext”方法实际上并没有回收Domino堆内存中的对象,如果你不回收它,它就是孤立的,Domino也不会清理它,服务器最终会耗尽Domino对象的内存。请注意,我不回收veNext。我不需要因为我指定ve => veNext。 “ve”将链接到同一个Domino对象,并在循环结束时调用recycle ve。从中可以看出,许多java对象可以指向后端的同一个Domino实例对象。如果我试图在ve.recycle之后调用veNext.recycle,我会得到一个“对象已被删除或回收”错误。
4 / NotesMain结束时的Recylce会话。确保在NotesMain的末尾调用SessionWrapper.recycle()以确保将该位内存释放回服务器。
5 /确保为服务器上的JVM提供足够的内存。见technote。还要注意“HTTPJVMMaxHeapSizeSet = 1”这是一个奇怪的设置,以确保内存设置“坚持”..更多关于它here。
多年来,IBM没有提供对象的内部清理任务,这些对象非常需要消除开发人员的这种开销。然后,您需要显式释放内存,这也是性能损失,但它是稳定性的必要折衷。这些要点并非详尽无遗,但我发现在遵守这些规则时,代理和servlet的稳定性大大提高。
答案 1 :(得分:1)
现在您可以导入类了。