java.lang.OutOfMemoryError:PermGen与Jenkins和Maven

java.lang.OutOfMemoryError:PermGen与Jenkins和Maven,maven,junit,jenkins,Maven,Junit,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.

我在詹金斯的工作中遇到以下例外情况:-

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)
java.lang.OutOfMemoryError:PermGen空间
位于java.lang.ClassLoader.defineClass1(本机方法)
位于java.lang.ClassLoader.defineClass(ClassLoader.java:791)
位于java.lang.ClassLoader.defineClass(ClassLoader.java:634)
位于org.powermock.core.classloader.MockClassLoader.loadUnmockedClass(MockClassLoader.java:201)
位于org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:149)
位于org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:67)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:356)
登录org.apache.log4j.LogManager(LogManager.java:86)
位于org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:64)
位于org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:270)
位于org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281)

在这个工作中,我通过Maven运行Junit测试用例。正如Jenkins所建议的,我有一个新的全局属性
MAVEN_OPTS
,其值高达
-XX:MaxPermSize=1024m

但我仍然继续得到
java.lang.OutOfMemoryError:PermGen


非常感谢您的帮助。

PowerMock因类加载内容而导致内存泄漏:

您可以使用log4j类的默认类加载器:

@RunWith(PowerMockRunner.class)
@PowerMockIgnore(value = {"org.apache.log4j.*"})
public class YourTest {
    ...
}

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

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

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

这解决了我的问题。

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