最近在系统测试中部署之后,我们的一个servlet比平常更难受到攻击,我们注意到内存开始攀升,weblogic最终会死亡。 我的实习生,我非常自豪,发现了内存泄漏的来源。
每当请求进入时,都会调用此行:
JAXBContext jc = JAXBContext.newInstance(“ruby.oracle_servlet.schemas”);
由于某种原因,对象永远不会被垃圾收集。 一旦我们将它静态化并移动到我们初始化它的地方,我们的内存泄漏便消失了。
我们的另一位开发人员在独立的Java应用程序中将这一行放在while循环中,并且还看到了内存的蠕动。
有没有人知道为什么该对象不会被垃圾收集?
由于
答案 0 :(得分:8)
哪种实施&您使用的JAXB版本?如果您使用的是Java SE 6附带的参考实现,那么它就是Metro(https://jaxb.dev.java.net/)。
以下是一些与内存相关的错误:
如果您正在使用MOXy实现(http://www.eclipse.org/eclipselink/moxy.php),那么我可以帮助调试。
好消息是JAXBContext是线程安全的,只能创建一次并重新使用。重用JAXBContext似乎也解决了你的内存泄漏问题。
有关详细信息,请参阅:
答案 1 :(得分:1)
是的,这是泄漏。每次调用此方法时,它都会加载类“ruby.oracle_servlet.schemas”。
JAXBContext.newInstance(“ruby.oracle_servlet.schemas”)