前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >没有日志,有什么办法能知道“这个任务跑到哪了?”

没有日志,有什么办法能知道“这个任务跑到哪了?”

作者头像
烟雨平生
发布2024-11-23 08:23:13
发布2024-11-23 08:23:13
5200
代码可运行
举报
文章被收录于专栏:数字化之路
运行总次数:0
代码可运行

执行了一个耗时大任务,还没有执行结束。

“这个任务跑到哪了?预计什么时候能跑完?”

“我看下”

一搜日志,发现除了入口日志外,没有别的了。

一看代码,除了调用入口和任务完成时有日志外,其它地方都没有打日志。

没打日志,也不想重新跑任务,还想知道任务执行到哪了,有什么办法呢?

可以做个Dump看看。

什么是”做个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文件。

使用IDEA来演示一下

代码语言:javascript
代码运行次数:0
复制
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行

代码执行到哪找到了,“任务跑到哪了”各位朋友根据情况估算就可以了。

其它dump的方法

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 的数字化之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是”做个dump““”“
  • 使用IDEA来演示一下
  • 其它dump的方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档