`
m635674608
  • 浏览: 4930309 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

sbt为什么总抛出“java.lang.OutOfMemoryError: PermGen space”?

 
阅读更多

最近学习scala,在用sbt(Simple Build Tool,scala的构建工具)时,隔断时间会抛出“java.lang.OutOfMemoryError: PermGen space”这个异常,重启之后就好了,今天终于仍受不了了。

在问了google后,其解决方案比较直观,和增大jvm的内存大小的方法类似,增加些启动参数即可:

- 在哪里设置?
     $ cat `which sbt`
    其内容类似于下面的输出
    #!/bin/sh
    test -f ~/.sbtconfig && . ~/.sbtconfig
    exec java -Xmx512M ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.13.0/libexec/sbt-launch.jar "$@"
    可以看到sbt的配置默认在~/.sbtconfig文件中设置
- 设置选项
    SBT_OPTS="-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:PermSize=256M -XX:MaxPermSize=512M"

但是,为什么会出现这个问题呢?以及配置中的选项都是什么含义?

- PermGen是什么?(参见https://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation
    PermGen(Permanent Generation),主要用来存放Java Classes的内部表示。联系到sbt的问题上,是scala在动态运行时会生成class(closure会生成单独的class?),所以在运行一段时间后会出现PermGen不够的情况,重启后又ok了。

- CMSClassUnloadingEnabled参数什么意思?
    默认情况下GC是不回收PermGen的空间的(其名字也能反映这点),这个选项就是启用清除PermGen的功能,删除不用的classes。但是需要和UseConcMarkSweepGC参数使用。

 

 

http://www.douban.com/note/311383726/?type=like

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics