生成Java线程转储而不重新启动。
导读:如何解决生成Java线程转储而不重新启动。?这是我们以编程方式进行的操作:http ://pastebin.com/uS5jYpd4我们使用JMXThreadMXBean和ThreadInfo类:ThreadMXBean mxBean = ManagementFactory.getThreadMXB...
这是我们以编程方式进行的操作:http ://pastebin.com/uS5jYpd4
我们使用JMXThreadMXBean和ThreadInfo类:
ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();ThreadInfo[] threadInfos = mxBean.getThreadInfo(mxBean.getAllThreadIds(), 0);...
您也可以kill -QUIT pid在〜unix下进行操作以将堆栈转储到标准输出中。还有jstack来转储JVM的堆栈。
我们还具有一个自动化功能,如果应用程序的平均负载高于某个阈值,则该功能将转储堆栈:
private long lastcpuTimeMillis;private long lastPollTimeMillis;public void checkLoadAverage() { long Now = System.currentTimeMillis(); long currentcpuMillis = getTotalcpuTimeMillis(); double loadAvg = calcLoadAveragePercentage(Now, currentcpuMillis); if (loadAvg > LOAD_AVERAGE_DUMP_THRESHOLD) {try { dumpStack('Load average percentage is ' + loadAvg);} catch (IOException e) { // Oh well, we tried} } lastcpuTimeMillis = currentcpuMillis; lastPollTimeMillis = Now;}private long getTotalcpuTimeMillis() { long total = 0; for (long id : threadMxBean.getAllThreadIds()) {long cpuTime = threadMxBean.getThreadcpuTime(id);if (cpuTime > 0) { total += cpuTime;} } // since is in nano-seconds long currentcpuMillis = total / 1000000; return currentcpuMillis;}private double calcLoadAveragePercentage(long Now, long currentcpuMillis) { long timeDiff = Now - lastPollTimeMillis; if (timeDiff == 0) {timeDiff = 1; } long cpuDiff = currentcpuMillis - lastcpuTimeMillis; double loadAvg = (double) cpuDiff / (double) timeDiff; return loadAvg;}解决方法
我想创建一个跟踪内存使用情况和cpu使用情况的线程。
如果应用程序达到较高级别,我想生成一个堆转储或线程转储。
有没有一种方法可以生成线程转储运行时而无需重新启动?
相关文章:
1. vagrant - 使用NFS文件夹作为mysql datadir无法启动mysql的问题?2. javascript - kindeditor上传本地图片3. AngularJs。是否可以通过单击取消选择HTML“广播”输入?4. 性能基准:PHP生成的内容VS。JavaScript和DOM over AJAX5. java-如何使列表彼此相邻(水平)而不是向下(垂直)。6. Java等于一个类。==与.equals相同7. ios - 为什么用WKWebView加载相同的html文本,有时展示的内容却不一样。8. css和HTML样式 投票管理系统9. PHP搜索代码只能搜出一页,点击任意页码不实现10. navicat - 数据库建索引选择的是hash,但保存后自动变成了btree|实践时mysql四种引擎都有什么要注意的?