13

在最近的系统测试部署之后,我们的一个 servlet 受到的打击比平时大得多,我们注意到内存开始攀升,weblogic 最终会死掉。我的实习生,我很自豪,发现了内存泄漏的根源。

每当有请求进入时,都会调用此行:

JAXBContext jc = JAXBContext.newInstance(“ruby.oracle_servlet.schemas”);

由于某种原因,该对象永远不会被垃圾收集。一旦我们将它设为静态并移动到我们初始化它的位置,我们的内存泄漏就消失了。

我们的另一位开发人员在独立的 Java 应用程序中将那行代码放入了一个 while 循环中,并且还看到内存不断增加。

有谁知道为什么该对象没有被垃圾收集?

谢谢

4

2 回答 2

8

您正在使用哪个 JAXB 实现和版本?如果您使用的是 Java SE 6 附带的参考实现,那么它是 Metro ( https://jaxb.dev.java.net/ )。

以下是一些与内存相关的错误:

如果您碰巧使用 MOXy 实现(http://www.eclipse.org/eclipselink/moxy.php),那么我可以帮助调试。

好消息是 JAXBContext 是线程安全的,应该只创建一次并重复使用。重用 JAXBContext 似乎也可以解决您的内存泄漏问题。

有关更多信息,请参阅:

于 2010-08-27T14:06:32.107 回答
1

是的,这是一个泄漏。每次调用此方法时,它将加载“ruby.oracle_servlet.schemas”类。

JAXBContext.newInstance(“ruby.oracle_servlet.schemas”)
于 2013-04-08T14:03:42.803 回答