如何解决生成Java线程转储而不重新启动。?
这是我们以编程方式进行的操作:http ://pastebin.com/uS5jYpd4
我们使用JMX
ThreadMXBean
和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使用情况的线程。
如果应用程序达到较高级别,我想生成一个堆转储或线程转储。
有没有一种方法可以生成线程转储运行时而无需重新启动?
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。