Java.lang.OutOfMemoryError: PermGen 在 Jenkins 和 Maven 中的解决方法

5
我在Jenkins作业中遇到了以下异常:-
java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at org.powermock.core.classloader.MockClassLoader.loadUnmockedClass(MockClassLoader.java:201)
at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:149)
at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:67)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at org.apache.log4j.LogManager.<clinit>(LogManager.java:86)
at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:64)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:270)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281)

我在Maven中运行我的Junit测试用例,正如Jenkins建议的那样,我有一个新的全局属性MAVEN_OPTS,值设置得尽可能高:-XX:MaxPermSize=1024m。但是我仍然遇到了java.lang.OutOfMemoryError: PermGen错误。
非常感谢您的帮助。
2个回答

11

感谢Stefan的回答。不幸的是,添加默认的log4j类加载器并没有解决我的问题。然而,您提供的链接解决了这个问题。

我必须在我的“maven-surefire-plugin”定义中添加以下配置:-

<argLine>-XX:PermSize=512m -XX:MaxPermSize=1024m</argLine>

这解决了我的问题。


今天我遇到了类似的问题,发现这是PowerMock和Log4j的问题,因为我在要模拟的类中将日志记录器实例化为静态变量。 这会导致PermGen中的内存泄漏。 Stefan提出使用默认类加载器的方法最终解决了这个问题,尽管我不得不编写@PowerMockIgnore({“javax.management。*”,“org.apache.logging。*”,“org.apache.xerces。*”})。 我认为仅增加PermSize 并不能解决问题,但对于这种内存泄漏问题仅发生在单元测试期间,可能还可以接受。 - Jogi

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接