我有一个sbt autoplugin,当用户运行一个任务时,我想用一个-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任务?
谢谢!
发布于 2017-01-20 00:23:42
显然,fork只可用于run和test任务。我添加了自己的派生代码,并将度量代码移到了一个单独的类MemoryMeasure中
val mainClass: String = "MemoryMeasure"
val forkOptions = ForkOptions(
bootJars = (fullClasspath in Test).value.files,
runJVMOptions = Seq(
(dependencyClasspath in Test).map(makeAgentOptions).value
)
)
val process = Fork.java.fork(forkOptions, mainClass +: arguments)
def cancel() = {
process.destroy()
1
}
val exitCode = try process.exitValue() catch { case e: InterruptedException => cancel() }https://stackoverflow.com/questions/41717605
复制相似问题