内存泄漏简单powermockito测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存泄漏简单powermockito测试相关的知识,希望对你有一定的参考价值。

我有以下powermock测试:

@RunWith(PowerMockRunner.class)
@PrepareForTest({DaoCaseTypeDefinition.class, QDataContext.class})
public class PowermockTest {

private static QDataContext m_dc;
private static DaoCaseTypeDefinition m_daoCaseTypeDefinition;

@Test
public void test() throws Exception {
    m_dc = mock(QDataContext.class);
    m_daoCaseTypeDefinition = mock(DaoCaseTypeDefinition.class);
    when(m_daoCaseTypeDefinition.findAll(m_dc)).thenReturn(Collections.EMPTY_LIST);

    DaoCaseTypeDefinition daoCaseTypeDefinition = new DaoCaseTypeDefinition();
    List<CaseTypeDefinition> all = daoCaseTypeDefinition.findAll(m_dc);

    System.out.println("sleep");
    Thread.sleep(2000);
}

@AfterClass
public static void after() throws InterruptedException {
    m_daoCaseTypeDefinition = null;
    m_dc = null;
    System.out.println("done");
    Thread.sleep(2000);
}
}

在这个测试中,我在jdk1.8上使用powermockito 1.7.1(也使用了powermockito 2 btw)。当我让Intellij一遍又一遍地运行这个测试并将visualvm附加到它上面时,很明显我有内存泄漏。

visualvm memory leak by powermockito

我注意到,对于每个使用PowerMockRunner.class注释的测试类,都会创建一个MockClassloader实例,该实例保存对DaoCaseTypeDefinition的引用。不幸的是,mockclassloader实例永远不会被恢复。

我的测试中有什么东西我做错了吗?为什么垃圾收集没有清除mockclassloader实例?

答案

虽然我找不到解决这个问题的方法,但我确实找到了解决方法。我正在使用Maven,这允许我通过配置分叉来创建一个新的jvm进程。这样,根据配置,我可以指示何时终止用于运行powermock单元测试的jvm进程。这样,内存泄漏不会导致内存不足。见http://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html

以上是关于内存泄漏简单powermockito测试的主要内容,如果未能解决你的问题,请参考以下文章

避免android片段中内存泄漏的最佳方法是啥

FragmentStatePagerAdapter 内存泄漏(带有 viewpager 的嵌套片段)

带有 UI 和内存泄漏的保留片段

自定义无内存泄漏的Handler内部类

在片段中保存活动实例:是否会导致内存泄漏?

片段 - 全局视图变量与本地和内部类侦听器和内存泄漏