首页 > 其他分享 >JUC讲解:使用 stack log(jstack、jps)

JUC讲解:使用 stack log(jstack、jps)

时间:2024-03-11 20:12:15浏览次数:26  
标签:JUC log jstack 线程 new main stack BlockedThread

JUC讲解:使用 stack log(jstack、jps)

stack log是通过命令行来查看线程状态的手段,这篇文章着重介绍其用法

使用

为了演示,我写了一段Demo,这段 Demo里包含“wait()线程”,“sleep线程”,“被阻塞的线程”三类线程,我们待会要在stack log 中找到这些线程

代码贴出来:

    public static void main(String[] args) throws InterruptedException {

        new Thread(new WaitingThread(), "waitingThread").start();
        new Thread(new SleepingThread(), "sleepThread").start();
        new Thread(new BlockedThread(), "blockedThread-1").start();
        new Thread(new BlockedThread(), "blockedThread-2").start();
    }

    static class WaitingThread implements Runnable {

        @Override
        public void run() {
            synchronized (WaitingThread.class) {
                try {
                    WaitingThread.class.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

    static class SleepingThread implements Runnable {

        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(1000000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

    static class BlockedThread implements Runnable {

        @Override
        public void run() {
            synchronized (BlockedThread.class) {
                while (true) {
                    try {
                        Thread.sleep(1000000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }
    }

  • WaitingThread 类:测试被 wai() 的线程
  • SleepingThread 类:测试睡眠的线程
  • BlockedThread 类,测试被阻塞的线程

在 main 中创建这些线程,可以看到我创建了两个 BlockedThread,目的是模拟阻塞的效果

运行程序后,在 cmd 中,输入 “jps”命令,找到程序入口类,再通过 “jstack 进程号”来查看 stack log

怎么看呢?

我们可以在输出的log日志中找到很多正在运行的线程,有一些是 main 函数自带的,我们不用管它,我们找我们创建的 thread

在 main 函数运行的时候,会自动创建出六七个线程,我会挑一些讲解,我们先看看我们自己写的线程。

直接查找线程名就可以找到了

先看看我们自己写的线程

waitingThread”:

image-20240311194338287

sleepThread

image-20240311194432033

“blockedThread-2”

image-20240311194528175

再看几个在main启动时自带的线程

一些线程即使我们没有定义,在main启动中也会自带几个,我们挑出几个简单讲解

“Finalizer”: 垃圾回收线程

线程的状态是 WAITING,因为此时没有类需要被回收,所以处于 wait() 状态,当需要回收时会被 notify() 唤醒,值得一提的是,这个 notify() 需要用到 Signal Dispatcher 线程(同样是随着main启动的线程),Signal Dispatcher 线程 用于传输命令

image-20240311194735052

“Reference Handler”: 控制 强、弱、软、虚 引用的线程

是 wai() 状态

为什么呢?

  1. 没有垃圾收集了,不需要使用强弱引用

  2. 目前线程已经全部完成引用了, 不需要再引用处理了

image-20240311194911550

就讲到这里了!

感谢B站up 河北王校长 的知识分享

标签:JUC,log,jstack,线程,new,main,stack,BlockedThread
From: https://www.cnblogs.com/acdongla/p/18066943

相关文章

  • phosphor-logging
    输出packages:phosphor-logging-devphosphor-logging-basephosphor-rsyslog-configphosphor-logging-dev提供日志APIphosphor-logging支持的error信息需要在phosphor-dbus-interfaces中预定义phosphor-logging会搜索变量YAML_DIR目录下所有.yaml文件将.errors.yaml结尾......
  • Logstash接收udp/tcp数据 python+ udp/tcp +logstash +elasticsearch
    Logstash接收udp/tcp数据背景:在 Logstash数据源为日志文件操作 基础上进行一、配置文件1.D:\usr\local\etc\logstash\pipeline1目录下logstash.conf文件配置input{stdin{}udp{host=>"0.0.0.0"#从5000端口获取日志port=>5000......
  • Redo Log 与 Undo Log
    本文目的是简单讲清楚RedoLog和UndoLog的区别,走出常见的误区,省略了底层细节。RedoLog和UndoLog并不是MySQL发明的,而是来自ARISE理论(AlgorithmsforRecoveryandIsolationExploitingSemantics,基于语义的恢复与隔离算法),现代主流关系型数据库在事务实现上都受到......
  • 将MindSpore运行结果输出到log文件
    技术背景我们在Linux系统下使用一些深度学习框架(如MindSpore)运行脚本的时候,经常会用一些打印输出来判断当前执行的步骤,或者是使用打印输出来定位算法问题。但是在Linux系统下程序输出其实被分成了正确输出和错误输出,如果只是在屏幕上打印的话,会将两种输出同时打印出来。但是如果......
  • Logstash系列---【centos7离线安装logstash7.8.0】
    1.安装包下载地址一般根据es的版本来确定logstash的版本,一般保持一致即可。Logstash和es版本对应关系:https://www.elastic.co/cn/support/matrix#matrix_compatibility。Logstash下载地址:https://www.elastic.co/cn/downloads/past-releases/logstash-7-8-02.解压并复制配置......
  • Blog Statistics Apr 1, 2023 - Apr 1, 2024
    1.OverviewDataDate:Apr1,2023-Apr1,2024Numberofarticles:53AllPlatformTotalVisits:1,011,000+(ThesearticeswerealsopublishedatZhihu.com、Toutiao.com、WeChatOfficialAccount、HeapDump、TencentDeveloper.)2.Dataforeachplatformlast......
  • Warning: QDialog::exec: Recursive call detected
     查看QDialog::exec的源码intQDialog::exec(){Q_D(QDialog);if(d->eventLoop){qWarning("QDialog::exec:Recursivecalldetected");return-1;}booldeleteOnClose=testAttribute(Qt::WA_DeleteOnClose);set......
  • 开启 mysql 的 general_log
    在做等保评测时,会要求mysql开启general_log日志,该日志会记录所有的数据库动作,增长幅度非常大,因此适合于在出现问题时临时开启一段时间,待问题排查解决后再进行关闭,否则日志文件的增长速度会超出你的想象。1、首先来看一下关于general_log的几个参数: mysql>showvariable......
  • spdlog 源码解析
    spdlog是开源、高性能、跨平台,支持header-only/compiled的C++日志库。本文主要目的是对spdlogv1.13.0的源码进行分析(编译运行环境为6.5.0-18-generic#18~22.04.1-Ubuntu),以探讨spdlog如何构建高性能、可扩展的日志框架的。github链接gabime/spdlog:FastC++loggingli......
  • mysqldump+binlog备份脚本
    mysqldump是一种逻辑备份工具,可以对数据库进行全量备份,和binlog增量备份共同使用可以进行数据库备份,基于此写了一个备份的脚本#!/bin/bashall_path="/opt/mysql_bakup/all"#MySQL全量备份目录add_path="/opt/mysql_bakup/add"#MySQL增量备份目录old_all_path="/o......