惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tor Project blog
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 【当耐特】
G
Google Developers Blog
J
Java Code Geeks
The Cloudflare Blog
Attack and Defense Labs
Attack and Defense Labs
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
Cisco Talos Blog
Cisco Talos Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
I
Intezer
Jina AI
Jina AI
T
Tenable Blog
P
Palo Alto Networks Blog
Project Zero
Project Zero
D
DataBreaches.Net
Hugging Face - Blog
Hugging Face - Blog
The Hacker News
The Hacker News
F
Full Disclosure
Cloudbric
Cloudbric
量子位
H
Heimdal Security Blog
K
Kaspersky official blog
有赞技术团队
有赞技术团队
罗磊的独立博客
V
Vulnerabilities – Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
Recent Announcements
Recent Announcements
WordPress大学
WordPress大学
GbyAI
GbyAI
S
SegmentFault 最新的问题
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
Recorded Future
Recorded Future
Security Archives - TechRepublic
Security Archives - TechRepublic
AI
AI
Webroot Blog
Webroot Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
The Exploit Database - CXSecurity.com
Apple Machine Learning Research
Apple Machine Learning Research
C
Cybersecurity and Infrastructure Security Agency CISA
H
Hacker News: Front Page
Latest news
Latest news

博客园 - 江城2211

大数值的精度与格式化显示问题 【知识总结】数据库的事务、并发与锁管理 基于数据源连接,动态构造JPA上下文EntityManager 【转载】使用了HTTPS为啥还要接口数据加密? RSA加密算法,加解密、签名示例 国密SM2算法,加密、签名示例 【问题记录】JVM进程崩溃(hs_err_pid.log致命错误日志) [问题记录】存在视图依赖的数据表,DDL修改字段比如做扩容等注意事项 【编码技巧】批量校验或处理关联引用数据的优化总结 【问题总结】Garmin路线无法同步和地图坐标偏移的解决办法 【工具推荐】磁盘IO检测工具之Diskspd 【编码技巧】总结一个稳定而高效的方法,将二维关系数据转换为树形结构 【编程技巧】SQL脚本快速生成随机测试数据 【编程技巧】结合JPA通用分页与排序技术,支持百万级以上数据的DML批量处理方案 【使用技巧】CodeDecom.exe批量反编译JAR包+Beyond Compare对比 【问题记录】Cause: java.sql.SQLRecoverableException: No more data to read from socket JDBC与各数据库产品连接的驱动及URL示例 【问题记录】使用PowerDesigner连接数据库并反向工程生成所有表及关系 使用tcpdump抓取网络包,在wareshark查看对应请求及响应的原始报文
【知识总结】JVM线程堆栈中的基础概念解读
江城2211 · 2025-01-24 · via 博客园 - 江城2211

看《Java深度调试技术》,偷懒拍照的方式记录一些JVM线程堆栈中的基础概念解读。 

微信图片_20250124094528

微信图片_20250124094433

微信图片_20250124094504

微信图片_20250124094519

微信图片_20250124094547

微信图片_20250124163255

image

线程状态的解读:

  • NEW 线程被创建但尚未启动时的状态,此时线程尚未调用 start() 方法。
  • RUNNABLE 从jvm角度看,线程处于正在运行的状态。在调用native本地代码时,由于jvm无法获取本地代码的内部状态,所以此时仍为runnable状态。也就是说此状态包括线程在等待网络返回等场景,例如等待SQL执行的返回(包括SQL阻塞),此时是不消耗应用CPU的。
  • TIMED_WAITING(on object monitor) 表示当前线程被挂起一段时间,此线程正在执行obj.wait(int time)方法
  • TIMED_WAITING(sleeping) 表示当前线程被挂起一段时间,此线程正在执行Thread.Sleep(int time)方法
  • TIMED_WAITING(parking) 表示当前线程被挂起一段时间,此线程正在执行LockSupport.parkNanos(int time)或LockSupport.parkUntil(int time)方法
  • WAITING(on object monitor) 表示当前线程被挂起,此线程正在执行obj.wait()、Thread.join()、LockSupport.park()方法(无限等待,只能通过notify()方法唤醒)
  • BLOCKED(on object monitor) 线程因为等待锁而被阻塞的状态,线程尝试获取一个已经被其他线程持有的锁(如 synchronized 块)。
  • TERMINATED 线程执行结束

线程状态之间常见的转换路径:

  • NEW → RUNNABLE:调用 start() 方法。
  • RUNNABLE → BLOCKED:尝试获取锁失败。
  • RUNNABLE → WAITING/TIMED_WAITING:调用 wait() 或 sleep() 等方法。
  • BLOCKED → RUNNABLE:获取锁成功。
  • WAITING/TIMED_WAITING → RUNNABLE:被唤醒或等待时间结束。
  • RUNNABLE → TERMINATED:线程执行完成。

给个示例: 

public class Test {
    public static void main(String[] args) throws Exception {
        Object obj = new Object();
        new TestThread_Locked(obj).start();
        new TestThread_WaitingOn().start();
        new TestThread_WaitingTo(obj).start();
    }
}

public class TestThread_Locked extends  Thread{
    private Object lock;
    public TestThread_Locked(Object obj) {
        this.lock = obj;
        this.setName(this.getClass().getName());
    }

    @Override
    public void run(){
        func();
    }

    private void func(){
        synchronized (lock) {
            func_longTime();
        }
    }
    private void func_longTime()  {
        try {
            Thread.sleep(600000);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

public class TestThread_WaitingOn extends Thread {
    private  Object lock = new Object();
    public TestThread_WaitingOn() {
        this.setName(this.getClass().getName());
    }

    @Override
    public void run() {
        func();
    }

    private void func() {
        synchronized (lock) {
            func_waitingOn();
        }
    }

    private void func_waitingOn() {
        try {
            lock.wait(600000);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

public class TestThread_WaitingTo extends Thread {
    private Object lock;
    public TestThread_WaitingTo(Object obj) {
        this.lock = obj;
        this.setName(this.getClass().getName());
    }

    @Override
    public void run() {
       func();
    }

    private void func(){
        synchronized (lock) {
            func_longTime();
        }
    }
    private void func_longTime() {
        try {
            Thread.sleep(600000);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

抓取线程堆栈如下: 

Full thread dump OpenJDK 64-Bit Server VM (25.232-b09 mixed mode):

"com.example.cloudbus.TestThread_WaitingTo" #17 prio=5 os_prio=0 tid=0x0000017b82bed000 nid=0xa884 waiting for monitor entry [0x00000024b2afe000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at com.example.cloudbus.TestThread_WaitingTo.func(TestThread_WaitingTo.java:17)
        - waiting to lock <0x000000076d3ad6c0> (a java.lang.Object)
        at com.example.cloudbus.TestThread_WaitingTo.run(TestThread_WaitingTo.java:12)

"com.example.cloudbus.TestThread_WaitingOn" #16 prio=5 os_prio=0 tid=0x0000017b82bea000 nid=0x50cc in Object.wait() [0x00000024b29ff000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076d3b43e0> (a java.lang.Object)
        at com.example.cloudbus.TestThread_WaitingOn.func_waitingOn(TestThread_WaitingOn.java:22)
        at com.example.cloudbus.TestThread_WaitingOn.func(TestThread_WaitingOn.java:16)
        - locked <0x000000076d3b43e0> (a java.lang.Object)
        at com.example.cloudbus.TestThread_WaitingOn.run(TestThread_WaitingOn.java:11)

"com.example.cloudbus.TestThread_Locked" #15 prio=5 os_prio=0 tid=0x0000017b82bc6800 nid=0xb734 waiting on condition [0x00000024b28ff000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.example.cloudbus.TestThread_Locked.func_longTime(TestThread_Locked.java:22)
        at com.example.cloudbus.TestThread_Locked.func(TestThread_Locked.java:17)
        - locked <0x000000076d3ad6c0> (a java.lang.Object)
        at com.example.cloudbus.TestThread_Locked.run(TestThread_Locked.java:12)