性能 – 用〜运行sbt高CPU使用率

在我看来,SBT只是在观察文件更改时占用了过多的CPU时间.我知道 this的帖子,但是作者那里的IDE CPU时间与SBT cpu时间混淆了;我没有运行IDE.

我正在Scala中开发一个Play项目,大约有370个scala文件,分为5个模块.

使用~run运行sbt会占用我的MacBook Pro上大约70-90%的CPU(2012年中).我没有运行IDE,我没有编辑任何文件,也没有浏览器访问服务器…根据Activity Monitor,只需使用〜运行(并观察文件系统)占用70-90%的CPU.

看着它空闲一段时间后我启动了VisualVM;它展示了自己和另一个JVM进程:

VisualVM overview

有关xsbt进程的详细信息(每个VisualVM):

PID: 56661
Host: localhost
Main class: xsbt.boot.Boot
Arguments: -Dhttp.port=9001 -Dhttps.port=9443 -Djsse.enableSNIExtension=false -Dhazelcast.config=conf/hazelcast-dev.xml -Dlogger.file=conf/logback-dev.xml -Dconfig.file=conf/passwords/local-dev.conf

JVM: Java HotSpot(TM) 64-Bit Server VM (25.121-b13, mixed mode)
Java: version 1.8.0_121, vendor Oracle Corporation
Java Home: /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre
JVM Flags: <none>

Heap dump on OOME: disabled

JVM参数:

-Xms1024m
-Xmx1024m
-XX:ReservedCodeCacheSize=128m
-XX:MaxMetaspaceSize=256m
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

以下是VisualVM中有关时间的详细信息:

CPU sampling

80%的CPU使用率 – 以及大多数时间都在运行的风扇 – 合理而sbt是空闲的吗?看起来真的很高.什么策略让它失望?

PS:当sbt刚好在命令提示符下(不是在观察文件更改)时,Activity Monitor显示大约5%的CPU使用率.

PPS:我通常在构建文件中的Global = Tags.limit(Tags.Test,4)中有concurrentRestrictions以防止在测试期间有太多并发数据库连接.我不确定这实际上是否符合我的想法.上面的统计数据是用该行注释掉的.当我恢复它时,Activity Monitor仍会报告大约80%的CPU使用率,但在CPU样本中,idleAwaitWork根本没有出现,而且ConcurrentRestrictions $$和$4.take紧随其后的是SourceModificationWatch $.watch.

假设你正在使用sbt 1,这可能是由于WaldemarWosiński在评论中指出的 https://github.com/sbt/sbt/issues/3860.

由于我们采用了Close Watch,现在应该解决这个问题.请尝试sbt 1.1.6或更高版本,看看问题是否仍然存在.

相关文章
相关标签/搜索