2011-11-30 101 views
75

我注意到了我的scala編譯器的一個奇怪的行爲。編譯類時偶爾會引發OutOfMemoryError。這裏的錯誤消息:如何防止java.lang.OutOfMemoryError:Scala編譯時的PermGen空間?

[info] Compiling 1 Scala source to /Users/gruetter/Workspaces/scala/helloscala/target/scala-2.9.0/test-classes... 
java.lang.OutOfMemoryError: PermGen space 
Error during sbt execution: java.lang.OutOfMemoryError: PermGen space 

它只是在一段時間發生的一次錯誤通常不扔在後續編譯運行。我使用Scala 2.9.0並通過SBT編譯。

沒有任何人有一個線索,以什麼可能是這個錯誤的原因是什麼?提前感謝您的見解。

+0

的答案也是'java.lang.OutOfMemoryError工作:Metaspace'(針對Java運行斯卡拉等效問題8)如果你用'MaxMetaspaceSize'替換'MaxPermSize'。 –

回答

46

OutOfMemoryError: PermGen space的原因是,它沒有足夠的permanent generation space :)如果你使用的是Oracle JVM,您需要將-XX:MaxPermSize=256M(或空間的一些其他金額)參數添加到您的sbt腳本。對於其他JVM,請看他們的文檔。

+1

謝謝阿列克謝。我已經使用了-Xmx512M選項。我認爲這應該有同樣的效果,對吧?我已經添加了-XX:MaxPermSize參數,看看錯誤是否仍然存在。 – BumbleGee

+3

@BumbleGee不,由'-Xmx'添加的內存不能用於PermGen。 –

+0

謝謝你澄清,亞歷克斯。 – BumbleGee

98

我使用HomeBrew在OS X上安裝sbt。它支持SBT_OPTS參數,該參數可以放在~/.sbtconfig文件中,其中export SBT_OPTS=-XX:MaxPermSize=256M

+0

謝謝,這對我有用! – Matthias

+1

使用SBT開發Homebrew似乎是一個非常易於管理的軟件包解決方案。 :) – crockpotveggies

+0

sbt brew安裝腳本設置內存最大值太小,擺脫java部分中的-Xmx512M -cat'sbt'#!/ bin/sh test -f〜/ .sbtconfig &&。 〜/ .sbtconfig exec java -Xmx512M $ {SBT_OPTS} -jar /usr/local/Cellar/sbt/0.13.1/libexec/sbt-launch.jar「$ @」 –

3

它看起來像在SBT內存泄漏對我來說在我的案件的程序編譯和運行成功約3-5次打擊是由SBT重啓固定異常之前。

最合適的解決方案確實似乎是-XX:MaxPermSize= JVM參數作爲阿列克謝·羅曼諾夫建議或者定期重新啓動SBT是否有幫助。

但還有另一種有趣的方法:嘗試切換到Java 8。 AFAIK它不再使用PermGen,並且可能免於這種異常。

我仍然希望SBT的作者將在未來的版本中解決這個問題。

+0

因此,Java 8使用不同的內存系統? – Adrian

+0

是的,據我所知。 https://www.google.com/search?q="java+8"+MaxPermSize – Ivan

+0

在J8中,perm gen只是捲入內存堆空間。 – monkjack

4

我有這個問題,發揮它周圍10分鐘看試圖改變內存大小網站。

事實證明,我的解決它,

user-profile$ sbt 

然後,

sbt-project-name 0.1> clean 

這清除它適合我。

1

我正在建造Jenkins sbt插件並且有同樣的問題。將SBT_OPTS從sbt文件複製到Jenkins作業配置的JVM標誌後,它們得到解決。

35

我假設你正在使用SBT 0.13.6或更高。創建.sbtopts文件在您SBT項目的根具有以下內容:

-J-Xmx4G 
-J-XX:MaxMetaspaceSize=1G 
-J-XX:MaxPermSize=1G 
-J-XX:+CMSClassUnloadingEnabled 

MaxMetaspaceSize是Java 8,而MaxPermSize是Java 7。他們是至關重要的,以防止出現相關的內存不足的錯誤要麼的PermGen元空間疲憊。當然,考慮調整標誌值或添加所需的其他標誌。

更多細節和替代方法可以在這blog post找到。

+0

太好了。您也可以將這些選項放入您的全局配置文件中;對我來說,它是'/ usr/local/etc/sbtopts'(用於在Mac上安裝Homebrew的sbt)。 –

1

最初使用如下命令:

java -jar /path/to/sbt-launch.jar test 

我得到了第一的OutOfMemoryError:PermGen的空間我使用-XX:MaxPermSize解決,然後OutOfMemoryError異常:Java堆空間,到-Xmx是補救。

所以在我的情況下,這樣的命令工作:

java -XX:MaxPermSize=256M -Xmx2048M -jar /path/to/sbt-launch.jar test 
0

變化下面的代碼塊sbt.sh文件並保存其工作的罰款。

get_mem_opts() { 
    local mem=${1:-1536} 
    local perm=$(($mem/4)) 
    (($perm > 256)) || perm=1024 //256 to 1024 
    (($perm < 1024)) || perm=2048 // 1024 to 2048 
    local codecache=$(($perm/2)) 

    echo "-Xms${mem}m -Xmx${mem}m -XX:MaxPermSize=${perm}m -XX:ReservedCodeCacheSize=${codecache}m" 
} 

使用終端SBT配置這裏出口

export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=1024M -XX:MaxPermSize=2048M"