如何解决生成Java线程转储而不重新启动。?

这是我们以编程方式进行的操作:http ://pastebin.com/uS5jYpd4

我们使用JMXThreadMXBeanThreadInfo类:

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使用情况的线程。

如果应用程序达到较高级别,我想生成一个堆转储或线程转储。

有没有一种方法可以生成线程转储运行时而无需重新启动?