jstack监控JVM线程的运行情况

1.通过jstack监控JVM当中线程的运行情况  jstack 进程ID

线程抢占CPU资源,当CPU过高时,定位线程,查看线程使用状态
                
                线程状态:
                    初始状态:New,线程对象创建出来后,没有调用start方法,线程处于初始状态
                    运行状态:
                        1.就绪状态:Ready,调用了Start方法,等待CPU分配资源
                        2.运行状态:RUNNING,CPU分配资源给该线程,该线程处于运行状态
                    阻塞状态 BLOCKED:
                        线程获取资源,如果资源获取成功则正常运行,如果资源获取失败,就处于阻塞状态,等待什么时候获取到资源再变为运行状态
                    等待状态 WAITING:线程手动调用了wait()方法,或者join()方法,这些方法都是主动进入等待状态,等待状态会将CPU资源让渡
                              需要其他线程手动唤醒,notify(),notifyAll()唤起所有的等待线程
                    超时等待状态 TIMED_WAITING:与等待状态相同,都是主动进入等待,也是需要其他线程唤醒,但是区别在于超时等待,如果超过了等待时间,则自动唤醒
                        Thread.sleep(2000),在休眠等待时间内会将CPU资源让渡,然后等待时间结束自动进入运行状态
                    终止状态DIED:线程结束之后的状态
            
            2.手动模拟死锁情况

                public class LockTest {
                    //定义资源
                    private static Object obj1=new Object();
                    private static Object obj2=new Object();
                    //线程A:先获取到资源1,然后休眠2s,再获取资源2
                    private static class ThreadA implements Runnable{
                        @Override
                        public void run() {
                            synchronized (obj1){
                                System.out.println("ThreadA获取到了OBJ1资源");

                                try {
                                    //休眠2s,因为我们要将CPU资源让渡出去,这样线程B就可以先抢占obj2资源
                                    Thread.sleep(2000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }

                                synchronized (obj2){
                                    System.out.println("ThreadA获取到了OBJ2资源");
                                }
                            }
                        }
                    }
                    private static class ThreadB implements Runnable{
                        @Override
                        public void run() {
                            synchronized (obj2){
                                System.out.println("ThreadB获取到了OBJ2资源");

                                try {
                                    //休眠2s,因为我们要将CPU资源让渡出去,这样线程B就可以先抢占obj2资源
                                    Thread.sleep(2000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }

                                synchronized (obj1){
                                    System.out.println("ThreadA获取到了OBJ1资源");
                                }
                            }
                        }
                    }

                    public static void main(String[] args) {
                        new Thread(new ThreadA()).start();
                        new Thread(new ThreadB()).start();
                    }
                }

线程A拿到obj1时休眠俩秒

同时线程B拿到obj2也休眠俩秒

当他们休眠结束时都想拿对方锁住的资源

这样就造成了死锁

2.1监控当前程序的线程运行情况
                jstack 进程ID,查看到如下信息:

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at com.chx.LockTest$ThreadB.run(LockTest.java:41)
        - waiting to lock <0x000000075693d5a0> (a java.lang.Object)
        - locked <0x000000075693d5b0> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:748)
"Thread-0":
        at com.chx.LockTest$ThreadA.run(LockTest.java:22)
        - waiting to lock <0x000000075693d5b0> (a java.lang.Object)
        - locked <0x000000075693d5a0> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:748)

Found 1 deadlock.

这样就定位到了线程,发现了死锁

原文地址:https://www.cnblogs.com/chx9832/p/12411279.html

时间: 2024-08-05 01:35:16

jstack监控JVM线程的运行情况的相关文章

jconsole监控远程linux tomcat运行情况的配置 (转)

来自:http://zhumeng8337797.blog.163.com/blog/static/100768914201242494649455/ 步骤如下: 1.编辑tomcat/bin/catalina.sh Bash代码 vi catalina.sh 在其中“ # ----- Execute The Requested Command -----------------------------------------” 之前插入新的一行(中间没有换行),内容如下: Vi catalin

JConsole监控Java程序的运行情况

JConsole 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JConsole(或者,它更高端的 "近亲" VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码. 注:现在jdk已经发展到jdk8版本,在这我安装的是jdk8,所以以jdk8给大家分享jconsole的一些简单用法 二 .jconsole的启动问题 我现

JVM:查看java内存情况命令

jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. jstat:一个极强的监视VM内存工具.可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量. jmap:打印出某个java进程(使用pid)内存内的所有'对象'的情况(如:产生那些对象,及其数量). jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据.并可通过远程连接监视远程的服务器V

Linux ---&gt; 监控JVM工具

Linux ---> 监控JVM工具shkingshking 发布时间: 2013/10/10 01:27 阅读: 2642 收藏: 26 点赞: 1 评论: 0 JDK内置工具使用 jps(Java Virtual Machine Process Status Tool)        查看所有的jvm进程,包括进程ID,进程启动的路径等等.    jstack(Java Stack Trace)        ① 观察jvm中当前所有线程的运行情况和线程当前状态.        ② 系统崩溃

Java千百问_07JVM架构(018)_如何监控jvm的运行情况

点击进入_更多_Java千百问 1.如何监控jvm的运行情况 了解jvm内存模型看这里:java内存模型是什么样的 了解jvm内存管理看这里:jvm是如何管理内存的 了解jvm垃圾回收机制看这里:java垃圾回收机制是什么 了解jvm内存优化看这里:java内存如何优化 我们通常使用Jdk工具来监控jvm的运行情况,当然目前有很多第三方产品是通过jdk提供的api来组织数据进行监控的.具体来说有如下监控软件: Jconsole jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回

Linux crontab的使用方式,sh脚本的编写,sh脚本自动启动tomcat服务器,sh监控系统运行情况

1.如果想使用Linux crontab(类似java quartz),需要先启动crontab.关于crontab的启动.关闭.重启.重新载入配置的方式如下: /sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service crond restart //重启服务 /sbin/service crond reload //重新载入配置 2.crontab的命令介绍: A:添加crontab的命令是:c

jconsole、jvisualvm监控远程linux下tomcat运行情况的配置

1.编辑tomcat/bin/catalina.sh 找到Execute The Requested Command,把以下代码加入到这段注释上面(中间无换行): CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=10.12.116.135 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8088 -Dcom.sun.management.jmxr

visualvm监控jvm及远程jvm监控方法

VisualVM是Sun的一个OpenJDK项目,其目的在于为Java应用创建一个整套的问题解决工具.它集成了多个JDK命令工具的一个可视化工具,它主要用来监控JVM的运行情况,可以用它来查看和浏览Heap Dump.Thread Dump.内存对象实例情况.GC执行情况.CPU消耗以及类的装载情况. Java开发人员可以使用 VisualVM创建必要信息的日志,系统管理人员可用来监控及控制Java应用程序在网络中的运行状况.    下载页面 : https://visualvm.dev.jav

visualvm监控jvm及远程jvm监控方法(转)

VisualVM是Sun的一个OpenJDK项目,其目的在于为Java应用创建一个整套的问题解决工具.它集成了多个JDK命令工具的一个可视化工具,它主要用来监控JVM的运行情况,可以用它来查看和浏览Heap Dump.Thread Dump.内存对象实例情况.GC执行情况.CPU消耗以及类的装载情况. Java开发人员可以使用 VisualVM创建必要信息的日志,系统管理人员可用来监控及控制Java应用程序在网络中的运行状况.    下载页面 : https://visualvm.dev.jav