Đây là cách chúng tôi làm điều đó cách lập trình: http://pastebin.com/uS5jYpd4
Chúng tôi sử dụng JMX
ThreadMXBean
và ThreadInfo
lớp:
ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = mxBean.getThreadInfo(mxBean.getAllThreadIds(), 0);
...
Bạn cũng có thể làm một kill -QUIT pid
dưới ~ unix để đổ đống với tiêu chuẩn cấp tốc . Ngoài ra còn có jstack để đổ ngăn xếp của một JVM.
Chúng tôi cũng có một tự động hóa mà bãi stack nếu tỷ lệ trung bình tải của ứng dụng là trên một số ngưỡng:
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;
}
Thread.getAllStackTraces() sẽ cung cấp cho bạn hầu hết những gì bạn muốn. Hoặc bạn có thể chạy 'jstack {pid}' như một chương trình bên ngoài. –
Tôi không thể nghĩ ra một cách để tạo ra một kết xuất chuỗi yêu cầu khởi động lại ....;) –
Thread.dumpStack() sẽ cho bạn dấu vết ngăn xếp cho chuỗi hiện tại. –