【发布时间】:2017-06-02 17:23:13
【问题描述】:
我有一个 sbt 自动插件,当用户运行一个任务时,我想用 -javaagent 分叉一个新的 JVM。该任务应使用jamm 测量内存。
object SbtMemory extends AutoPlugin {
object autoImport {
val agentTest = inputKey[Unit]("Run task with javaagent")
}
def makeAgentOptions(classpath: Classpath) : String = {
val jammJar = classpath.map(_.data).filter(_.toString.contains("jamm")).head
s"-javaagent:$jammJar"
}
override lazy val projectSettings =
Seq(
agentTest := agentTask.value,
fork in agentTest := true,
javaOptions in agentTest += (dependencyClasspath in Test).map(makeAgentOptions).value
)
lazy val agentTask = Def.task {
val o = new Array[Byte](1024*1024)
val mm = new MemoryMeter()
println("Size of new Array[Byte](1024*1024): " + mm.measureDeep(o))
}
}
当我从命令行运行sbt perf 时,出现以下异常:
java.lang.IllegalStateException: Instrumentation is not set; Jamm must be set as -javaagent
我还尝试打印 javaOptions,但未设置 -javaagent 选项。
如何在插件中添加-javaagent javaOption 以使用 jamm 运行任务?
谢谢!
【问题讨论】: