执行了一个耗时大任务,还没有执行结束。
“这个任务跑到哪了?预计什么时候能跑完?”
“我看下”
一搜日志,发现除了入口日志外,没有别的了。
一看代码,除了调用入口和任务完成时有日志外,其它地方都没有打日志。
没打日志,也不想重新跑任务,还想知道任务执行到哪了,有什么办法呢?
可以做个Dump看看。
dump文件是一个进程或者系统在某一个时刻的快照。 在Java中,dump文件主要可以分为Heap Dump和Thread Dump(也被称为Java Dump或Javacore)两种类型。如果没有特别说明,“先做个dump”一般是指获取Heap Dump。 Thread Dump,翻译为线程快照或javacore文件,是一个文本文件,记录了当前虚拟机内每一条线程正在执行的执行情况,包括线程的状态、堆栈信息等。它可以帮助我们分析和诊断多线程程序中的问题,可以帮助我们定位线程出现长时间停顿的原因。 目前市场上常见的dump工具生成的dump文件,大多都包含了Heap Dump和Thread Dump的内容。
想查看“任务跑到哪了”,需要查看Thread Dump文件。
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import java.util.concurrent.TimeUnit;
@Slf4j
public class BigTaskTest {
@Test
void doABigTask() {
log.info(" task begin ");
// TODO: 2024/10/27 Step1
try {
TimeUnit.MINUTES.sleep(20);
} catch (InterruptedException ignored) {
}
// TODO: 2024/10/27 StepN
log.info(" task end ");
}
}
Run it:
可以看到 这个任务是main线程在执行
如何知道main线程正在执行哪一行代码呢?
找到这个“照相机”样式的button【Dump Threads】,点击。
找到名为main的线程,并点击 可以看到 目前main线程执行到BigTaskTest.java类的第21行
代码执行到哪找到了,“任务跑到哪了”各位朋友根据情况估算就可以了。
1、jmap:jmap(Memory Map for JAVA)是一个用于打印运行中的 JVM 内存统计信息的工具。jmap [ option ] pid 2、Arthas:Arthas dump java heap, 类似jmap命令的heap dump功能。 3、jcmd:jcmd 是一个非常完整的工具,用于向JVM发送命令。jcmd <pid> GC.heap_dump <file-path> 4、自动生成dump:java -XX:+HeapDumpOnOutOfMemoryError pid 5、JVisualVM 6、JConsole 7、JMX 8、Arms 9、IDEA+JProfiler