我看到'java.lang.OutOfMemoryError:PermGen space',同時運行〜300 JUnit測試和使用Spring上下文。有一個艱難的時間搞清楚什麼是吃了PermGen的,因爲:除了Class對象之外,還存儲在Perm Gen Space(sun 1.6 VM)中?
穩態- 應用程序消耗的PermGen space的
- 我已經試過-XX約90米:MaxPermSize參數=256米單元測試 - 仍在運行的
- 使用
-XX:+TraceClassLoading
和-XX:+TraceClassUnloading
啓用時,在執行OutOfMemoryError
之前的最後20-30次測試時,沒有看到額外的「加載」事件。
後者似乎表明,除了Class對象之外的東西正在填充PermGen,不是嗎?如果是這樣,它會是什麼?例如,實例是否存儲在PermGen中?
這裏是我的VM信息:
$ java -version
java version "1.6.0_25"
Java(TM) SE Runtime Environment (build 1.6.0_25-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.0-b11, mixed mode)
相關
FWIW,即沉澱這個帖子我的問題的根源竟然是有點微不足道:我認爲Maven的Surefire插件繼承VM設置從MAVEN_OPTS(或運行mvn的VM實例)中,當它分出一個VM時 - 它不是(boo)。必須在插件的配置中明確指定使用argLine的那些。 HTH。
的JProfiler或YourKit會給你裏面有什麼了更多的信息。 – bmargulies 2011-06-14 17:40:31
@bmergulies - 使用探查器的好主意! – 2011-06-14 17:44:49
沒有看到你的代碼,我的第一個想法是,每個測試用例都在實例化spring上下文。 – Woot4Moo 2011-06-14 17:46:05