旧的JaxB和JDK8 Metaspace OutOfMemory问题该怎么解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (366)

目前我们正在研究这个问题。我们创建了一个重现此行为的示例程序:

import java.io.ByteArrayInputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class X
{
  private static final String XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><x test=\"test\" />";

  @XmlAttribute
  String test;

  public static void main( String[] args ) throws JAXBException, InterruptedException
  {
    System.out.println("start");

    while ( true )
    {
      JAXBContext jc = JAXBContext.newInstance( X.class );
      Unmarshaller unmarshaller = jc.createUnmarshaller();
      X object = (X) unmarshaller.unmarshal( new ByteArrayInputStream( XML.getBytes() ) );
      System.out.println( object.test );
    }
  }
}

编辑1: 运行参数JDK7:

-XX:+TraceClassLoading -XX:+TraceClassUnloading -XX:MaxPermSize=16M -XX:PermSize=1M -XX:+UseParallelOldGC -XX:+HeapDumpOnOutOfMemoryError

运行参数JDK8:

-XX:+TraceClassLoading -XX:+TraceClassUnloading -XX:MaxMetaspaceSize=16M -XX:MetaspaceSize=1M -XX:+UseParallelOldGC -XX:+HeapDumpOnOutOfMemoryError

编辑2:

我已经尝试了所有可用的JDK8收集器。他们都有同样的问题。

编辑3:

由于JAXB和我们应用程序中的几个模块之间的重要耦合,通过交换lib来解决这个问题在我们的实际应用中很困难。

提问于
用户回答回答于

我们通过使用以下VM参数解决了我们当前的问题,直到能够修复应用程序中的所有事件:

-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true
用户回答回答于

应该使用JAXBContext.newInstance()一次为你的类创建一个上下文来解开,否则它会耗尽你的permgen或者metaspace。

扫码关注云+社区

领取腾讯云代金券