Vue Element-ui实现后台治理系统(4)---封装一个ECharts组件的一点思绪_pubg卡盟,rust辅助ark辅助

前言

若是有一天,你的Java程序长时间停留,也许是它病了,需要用jstack拍个片子剖析剖析,才气诊断详细什么病症,是死锁综合征,照样死循环等其他病症,本文我们一起来学习jstack下令~

jstack 的功效

jstack用法

线程状态等基础回首

实战案例1:jstack 剖析死锁

实战案例2:jstack 剖析CPU 过高

jstack 的功效

jstack是JVM自带的Java客栈跟踪工具,它用于打印出给定的java历程ID、core file、远程调试服务的Java客栈信息.

jstack prints Java stack traces of Java threads for a given Java process or

core file or a remote debug server.

jstack下令用于天生虚拟机当前时刻的线程快照。

线程快照是当前虚拟机内每一条线程正在执行的方式客栈的聚集,天生线程快照的主要目的是定位线程泛起长时间停留的缘故原由,

如线程间死锁、死循环、请求外部资源导致的长时间守候等问题。

线程泛起停留的时刻通过jstack来查看各个线程的挪用客栈,就可以知道没有响应的线程到底在后台做什么事情,或者守候什么资源。

若是java程序溃逃天生core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是若何溃逃和在程序那边发生问题。

另外,jstack工具还可以隶属到正在运行的java程序中,看到那时运行的java程序的java stack和native stack的信息, 若是现在运行的java程序出现hung的状态,jstack是异常有用的。

jstack用法

jstack 下令花样如下

jstack [ option ] pid

jstack [ option ] executable core

jstack [ option ] [server-id@]remote-hostname-or-IP

executable Java executable from which the core dump was produced.(可能是发生core dump的java可执行程序)

core 将被打印信息的core dump文件

remote-hostname-or-IP 远程debug服务的主机名或ip

server-id 唯一id,如果一台主机上多个远程debug服务

最常用的是

jstack [option] // 打印某个历程的客栈信息

option参数说明如下:

选项

作用

-F

当正常输出的请求不被响应时,强制输出线程客栈

-m

若是挪用到内陆方式的话,可以显示C/C 的客栈

-l

除客栈外,显示关于锁的附加信息,在发生死锁时可以用jstack -l pid来考察锁持有情形

线程状态等基础回首

线程状态简介

jstack用于天生线程快照的,我们剖析线程的情形,需要温习一下线程状态吧,拿小凳子坐好,温习一下啦~

Java语言界说了6种线程池状态:

New:建立后尚未启动的线程处于这种状态,不会泛起在Dump中。

RUNNABLE:包罗Running和Ready。线程开启start()方式,会进入该状态,在虚拟机内执行的。

Waiting:无限的守候另一个线程的特定操作。

Timed Waiting:有时限的守候另一个线程的特定操作。

壅闭(Blocked):在程序守候进入同步区域的时刻,线程将进入这种状态,在守候监视器锁。

竣事(Terminated):已终止线程的线程状态,线程已经竣事执行。

Dump文件的线程状态一样平常实在就以下3种:

RUNNABLE,线程处于执行中

BLOCKED,线程被壅闭

WAITING,线程正在守候

Monitor 监视锁

由于Java程序一样平常都是多线程运行的,Java多线程跟监视锁环环相扣,以是我们剖析线程状态时,也需要回首一下Monitor监视锁知识。

有关于线程同步关键字Synchronized与监视锁的爱恨情仇,有兴趣的同伴可以看一下我这篇文章

Synchronized剖析——若是你愿意一层一层剥开我的心

Monitor的事情原理图如下:

线程想要获取monitor,首先会进入Entry Set行列,它是Waiting Thread,线程状态是Waiting for monitor entry。

当某个线程乐成获取工具的monitor后,进入Owner区域,它就是Active Thread。

若是线程挪用了wait()方式,则会进入Wait Set行列,它会释放monitor锁,它也是Waiting Thread,线程状态in Object.wait()

若是其他线程挪用 notify() / notifyAll() ,会叫醒Wait Set中的某个线程,该线程再次实验获取monitor锁,乐成即进入Owner区域。

Dump 文件剖析关注重点

runnable,线程处于执行中

deadlock,死锁(重点关注)

blocked,线程被壅闭 (重点关注)

Parked,住手

locked,工具加锁

waiting,线程正在守候

waiting to lock 守候上锁

Object.wait(),工具守候中

waiting for monitor entry 守候获取监视器(重点关注)

Waiting on condition,守候资源(重点关注),最常见的情形是线程在守候网络的读写

实战案例1:jstack 剖析死锁问题

什么是死锁?

若何用jstack排查死锁?

什么是死锁?

死锁是指两个或两个以上的线程在执行过程中,因争取资源而造成的一种相互守候的征象,若无外力作用,它们都将无法举行下去。

若何用若何用jstack排查死锁问题

先来看一段会发生死锁的Java程序,源码如下:,绝地求生卡盟,

/**

* Java 死锁demo

*/

public class DeathLockTest {

private static Lock lock1 = new ReentrantLock();

private static Lock lock2 = new ReentrantLock();

public static void deathLock() {

Thread t1 = new Thread() {

@Override

public void run() {

try {

lock1.lock();

System.out.println(Thread.currentThread().getName() " get the lock1");

Thread.sleep(1000);

lock2.lock();

System.out.println(Thread.currentThread().getName() " get the lock2");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

};

Thread t2 = new Thread() {

@Override

public void run() {

try {

lock2.lock();

System.out.println(Thread.currentThread().getName() " get the lock2");

Thread.sleep(1000);

lock1.lock();

System.out.println(Thread.currentThread().getName() " get the lock1");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

};

//设置线程名字,利便剖析客栈信息

t1.setName("mythread-jay");

t2.setName("mythread-tianluo");

t1.start();

t2.start();

}

public static void main(String[] args) {

deathLock();

}

}

运行效果:

显然,线程jay和线程tianluo都是只执行到一半,就陷入了壅闭守候状态~

jstack排查Java死锁步骤

在终端中输入jsp查看当前运行的java程序

使用 jstack -l pid 查看线程客栈信息

剖析客栈信息

在终端中输入jsp查看当前运行的java程序

通过使用 jps 下令获取需要监控的历程的pid,我们找到了23780 DeathLockTest

使用 jstack -l pid 查看线程客栈信息

由上图,可以清晰看到死锁信息:

mythread-tianluo 守候这个锁 “0x00000000d61ae3a0”,这个锁是由于mythread-jay线程持有。

mythread-jay线程守候这个锁“0x00000000d61ae3d0”,这个锁是由mythread-tianluo 线程持有。

还原死锁真相

“mythread-tianluo"线程客栈信息剖析如下:

mythread-tianluo的线程处于守候(waiting)状态,持有“0x00000000d61ae3d0”锁,守候“0x00000000d61ae3a0”的锁

“mythread-jay"线程客栈信息剖析如下:

mythread-tianluo的线程处于守候(waiting)状态,持有“0x00000000d61ae3a0”锁,守候“0x00000000d61ae3d0”的锁

实战案例2:jstack 剖析CPU过高问题

来个导致CPU过高的demo程序,一个死循环,哈哈~

/**

* 有个导致CPU过高程序的demo,死循环

*/

public class JstackCase {

private static ExecutorService executorService = Executors.newFixedThreadPool(5);

public static void main(String[] args) {

Task task1 = new Task();

Task task2 = new Task();

executorService.execute(task1);

executorService.execute(task2);

}

public static Object lock = new Object();

static class Task implements Runnable{

public void run() {

synchronized (lock){

long sum = 0L;

while (true){

sum = 1;

}

}

}

}

}

jstack 剖析CPU过高步骤

top

top -Hp pid

jstack pid

jstack -l [PID] >/tmp/log.txt

剖析客栈信息

1.top

在服务器上,我们可以通过top下令查看各个历程的cpu使用情形,它默认是按cpu使用率由高到低排序的

由上图中,我们可以找出pid为21340的java历程,它占用了最高的cpu资源,凶手就是它,哈哈!

2. top -Hp pid

通过top -Hp 21340可以查看该历程下,各个线程的cpu使用情形,如下:

可以发现pid为21350的线程,CPU资源占用最高,嘻嘻,小本本把它记下来,接下来拿jstack给它拍片子

3. jstack pid

通过top下令定位到cpu占用率较高的线程之后,接着使用jstack pid下令来查看当前java历程的客栈状态,jstack 21350后,内容如下:

4. jstack -l [PID] >/tmp/log.txt

实在,前3个步骤,客栈信息已经出来啦。然则一样平常在天生环境,我们可以把这些客栈信息打到一个文件里,再转头仔细剖析哦~

5. 剖析客栈信息

我们把占用cpu资源较高的线程pid(本例子是21350),将该pid转成16进制的值

在thread dump中,每个线程都有一个nid,我们找到对应的nid(5366),发现一直在跑(24行)

这个时刻,可以去检查代码是否有问题啦~ 固然,也建议隔段时间再执行一次stack下令,再一份获取thread dump,究竟两次拍片效果(jstack)对比,更准确嘛~

参考与谢谢

小我私家民众号

以为写得好的小同伴给个点赞 关注啦,谢谢~

若是有写得不正确的地方,贫苦指出,感激涕零。

同时异常期待小同伴们能够关注我民众号,后面逐步推出更好的干货~嘻嘻,绝地求生辅助MySQL 入门(3):事务隔离_卡盟,dnf脚本

java 吃鸡辅助,给你的Java程序拍个片子吧:jstack下令剖析_彩虹六号辅助,pubg辅助...相关推荐

  1. 绝地求生游戏怎么转到计算机上玩,绝地求生大逃杀吃鸡游戏提示tslgame.exe 应用程序错误解决方法...

    众所周知,玩家口中所谓的"吃鸡"游戏就是绝地求生大逃杀,这款游戏虽然比较好玩,但是游戏优化比较差,此外游戏的应用程序会出现各种报错,最为常见的就是tslgame.exe 应用程序错 ...

  2. 吃鸡是服务器好还是i系列好,绝地求生服务器区别是什么_各个服务器有什么特点...

    绝地求生服务器区别是什么?各个服务器有什么特点?不少玩家已经都想要换服,不知道哪些服务器比较好玩,比较适合自己,下面就和安卓市场小编来了解一下吧. 亚服:地狱难度.挂多.LYB多.各种莫名其妙就躺下最 ...

  3. python嵌套循环跳出_python 行使 for ... else 跳出双层嵌套循环_rust辅助,彩虹六号辅助...

    Mockito不能mock final类的解决办法方舟生存进化辅助 靠山 周末在写一个爬虫时,遇到这样一种场景:从搜索效果中下载指定数目的文件 例如:搜索效果中共分为10页展示,加起来一共50条数据, ...

  4. 黑产盯上“吃鸡”游戏 木马盛行勒索扣费

    阿里巴巴旗下钱盾反诈实验室近日监测到,黑客利用吃鸡玩家的游戏排名以及游戏账号的预约痛点,开发了多种木马病毒,以锁屏勒索.恶意扣费.捆绑恶意代码等方式来达到感染用户手机,勒索钱财的目的. 文/鲸朔 &q ...

  5. 测试吃鸡游戏帧数软件,高频内存吃鸡、CSGO帧数提高多少?这一测试告诉你

    高频内存吃鸡.CSGO帧数提高多少?这一测试告诉你 2020-03-12 14:06:29 8点赞 8收藏 11评论 前言 我先前时候工作机用的是在性价比领域广为人知的Klevv科赋,当然那会儿是去年 ...

  6. 吃鸡(绝地求生)进入游戏时出现Driver Load Error(1450) 错误的解决方案

    近期有些朋友在玩吃鸡的时候,会提示Failed to initialize BattlEye Service:Driver Load Error(1450) 驱动加载失败错误,如下图,到底是什么原因造 ...

  7. steam+linux+吃鸡游戏,Steam秋季特卖开启,GTA、吃鸡等游戏半价

    Steam秋季特卖开启,GTA.吃鸡等游戏半价 2020年11月26日 10:03作者:陈沐梁编辑:陈沐梁文章出处:泡泡网原创 分享 Steam平台秋季特卖现在已经开启,将从北京时间11月26日持续至 ...

  8. java投屏刺激战场_吃鸡手游直播教程,怎么投屏直播玩刺激战场/全军出击

    吃鸡手游直播教程,怎么投屏直播玩刺激战场/全军出击 作者:小葫芦直播管家 来源:小葫芦 时间:2018-05-15 15:57 "吃鸡"游戏火热,尤其是刺激战场和全军出击这两款手机 ...

  9. java mx150显卡够了吗_虽然小编觉得想要吃鸡怎么也要GTX 1050,但事实上MX150就够...

    原标题:虽然小编觉得想要吃鸡怎么也要GTX 1050,但事实上MX150就够 虽说无论是之前的专题测试,还是装机后的演示,如果想要在<绝地求生:大逃杀>中获得比较健康的体验,那么至少需要R ...

最新文章

  1. SQL Server ltrim(rtrim()) 去不掉空格
  2. 心得体悟帖---开解语录2
  3. android控件ems,Android登录等待效果
  4. 父级透明,子级不透明
  5. 北京信息科技大学计算机专业学科评估,北京信息科技大学学科评估结果排名(第四次):最新完整...
  6. 【Java-Web】初始化加载Serlvet工程后-HttpServlet报错
  7. HTML5之语义化标签
  8. 【Django 2021年最新版教程20】python for循环遍历queryset
  9. 前端协商缓存强缓存如何使用_强制缓存(200)和协商缓存(304)
  10. C# 赛邮接口短信API验证demo
  11. 数据结构与算法之排序篇(下)
  12. get busy trying or get busy dying
  13. Android Tv限制后台进程数量
  14. bt 下载工具 deluge 配置 优化 使用
  15. 将网页保存为图片--修改
  16. matplotlib绘图教程
  17. 17.深入浅出:非正弦波发生电路——参考《模拟电子技术基础》清华大学华成英主讲
  18. 数字电路_1. 逻辑门表达式 真值表
  19. 40多岁,失业负债,我该怎么办?
  20. 【Python知识树 -- 预备知识】之 模块管理

热门文章

  1. ATL::CPath用法
  2. 小米4 第三方re奇兔_【搞事】小米上架39元充电器 20W可适配iPhone 12系列
  3. 初学者需了解的AutoCAD三大基础功能,具体有哪些?
  4. Android databingding与jetpack的lifecycle使用与比较
  5. mysql保存不了微信表情符emoji问题解决方案
  6. 隐私政策与用户协议 Privacy statement and User agreement——《学拼音》
  7. java k v t_java 中的 t,e,k,v
  8. 对四大杀毒软件的评价(卡巴、麦咖啡、诺顿、nod32)
  9. 零基础学习游戏建模先从基础做起?「教程」高级影视肖像《傲慢美女》全流程制作中文教程(保存)
  10. STM8S105 TIM1 TIM2 定时器的定时时间初始化