当我运行以下JUnit测试时,java进程的内存不断增加。几个小时后,它使用超过2go。然而,当我用jvisualvm看,堆和permgen大小是稳定的,我没有看到任何泄漏。试验是用-Xmx32m
GroovyCategorySupport和“系统”内存泄漏
public class TestCat {
public static class A { }
@Test
public void testCategory() {
for(;;) {
GroovyCategorySupport.use(A.class, new Closure<Object>(null) {
public Object call() { return null; }
});
}
}
}
我已经使用Groovy 2.4.7,Windows和一个JRE1.7_80,MacOS和JRE1.7_60进行了测试运行。 我无法重现与MacOS和JRE 1.8.0_91
这个错误我想这是与在JRE1.7的错误,我正在寻找一种方法来缓解这个问题:
- 我的测试可能是错的?如何泄漏“系统”内存而不会泄漏堆空间或permgen空间?
- 它是Groovy和JRE 1.7之间的“已知”错误还是不兼容?
- 如何使用1.7 jre的groovy类别,而不会遭受这种内存泄漏?
编辑
我可以通过调用VMPluginFactory.getPlugin().invalidateCallSites()
,与这种 “纯Java” 单元测试中翻译重现此错误:
public class TestSwitchPoint {
@Test
public void testSP() {
SwitchPoint switchPoint = new SwitchPoint();
for(;;) {
SwitchPoint old = switchPoint;
switchPoint = new SwitchPoint();
SwitchPoint.invalidateAll(new SwitchPoint[]{old});
}
}
}
事实上,只有new SwitchPoint()
就够了。
谢谢!如果我强迫Groovy不使用MethodHandles,我想假设有一个副作用? –
@JérémieB可能会有性能影响,但我不认为他们会发挥重大作用。当然,这取决于特定的应用。 – apangin
7u91的更新日志没有列出JDK-8050166都没有JDK-8144848,并且我没有看到任何有关MethodHandle –