當我運行以下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 –