1. 程式人生 > >監控程序運行兩種方法

監控程序運行兩種方法

str deb tcl clear ger create all 追蹤 sleep

1.監控程序運行堆棧

val currentThread = Thread.currentThread()
@volatile
var flag = false
val t = new Thread(
new Runnable {
override def run(): Unit = {
while(!flag) {
val stackElements = currentThread.getStackTrace
logger.info(stackElements.map(_.toString).mkString("\n"))
Thread.sleep(100)
}
}
}
)
t.start()

......//do something

var flag = true

2. 計時及運行次數;

定義計時:

import org.slf4j.LoggerFactory

/**
* 類功能描述:Debug日誌追蹤
*
* @author barry create at 18-8-29 下午3:41
* @version 1.0.0
*/
object Debug {
val LOGGER = LoggerFactory.getLogger(getClass)
val counter = collection.mutable.Map[String, Int]() // label -> count
val times = collection.mutable.Map[String, Long]() // label - time(ns)

/**
*追蹤代碼塊
* @param label 標簽名
* @param codeBlock 代碼塊
* @tparam T 返回結果類型
* @return
*/
def trace[T](label: String)(codeBlock: => T) = {
val t0 = System.nanoTime()
val result = codeBlock
val t1 = System.nanoTime()
counter.get(label).map(_counter => counter.put(label, _counter + 1)).orElse(counter.put(label, 1))
times.get(label).map(cost => times.put(label, cost + (t1 - t0))).orElse(times.put(label, t1 - t0))
result
}

/**
* 打印日誌
*/
def info(): Unit = {
LOGGER.warn("FinallyDone...")
LOGGER.warn(s"counter:${counter}")
LOGGER.warn(s"times:${times.map { case (label, cost) => (label, cost / 1000000)}}ms")
}

/**
* 重新計數
*/
def reset(): Unit = {
counter.clear()
times.clear()
}
}

監控程序運行兩種方法