次の JUnit テストを実行すると、Java プロセスのメモリが常に増加しています。数時間後、2合以上使用。しかし、jvisualvm を見ると、ヒープと permgen のサイズは安定しており、リークは見られません。テストはで実行されます-Xmx32m
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()
で十分です。