java 吃鸡辅助,给你的Java程序拍个片子吧:jstack下令剖析_彩虹六号辅助,pubg辅助...
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辅助...相关推荐
- 绝地求生游戏怎么转到计算机上玩,绝地求生大逃杀吃鸡游戏提示tslgame.exe 应用程序错误解决方法...
众所周知,玩家口中所谓的"吃鸡"游戏就是绝地求生大逃杀,这款游戏虽然比较好玩,但是游戏优化比较差,此外游戏的应用程序会出现各种报错,最为常见的就是tslgame.exe 应用程序错 ...
- 吃鸡是服务器好还是i系列好,绝地求生服务器区别是什么_各个服务器有什么特点...
绝地求生服务器区别是什么?各个服务器有什么特点?不少玩家已经都想要换服,不知道哪些服务器比较好玩,比较适合自己,下面就和安卓市场小编来了解一下吧. 亚服:地狱难度.挂多.LYB多.各种莫名其妙就躺下最 ...
- python嵌套循环跳出_python 行使 for ... else 跳出双层嵌套循环_rust辅助,彩虹六号辅助...
Mockito不能mock final类的解决办法方舟生存进化辅助 靠山 周末在写一个爬虫时,遇到这样一种场景:从搜索效果中下载指定数目的文件 例如:搜索效果中共分为10页展示,加起来一共50条数据, ...
- 黑产盯上“吃鸡”游戏 木马盛行勒索扣费
阿里巴巴旗下钱盾反诈实验室近日监测到,黑客利用吃鸡玩家的游戏排名以及游戏账号的预约痛点,开发了多种木马病毒,以锁屏勒索.恶意扣费.捆绑恶意代码等方式来达到感染用户手机,勒索钱财的目的. 文/鲸朔 &q ...
- 测试吃鸡游戏帧数软件,高频内存吃鸡、CSGO帧数提高多少?这一测试告诉你
高频内存吃鸡.CSGO帧数提高多少?这一测试告诉你 2020-03-12 14:06:29 8点赞 8收藏 11评论 前言 我先前时候工作机用的是在性价比领域广为人知的Klevv科赋,当然那会儿是去年 ...
- 吃鸡(绝地求生)进入游戏时出现Driver Load Error(1450) 错误的解决方案
近期有些朋友在玩吃鸡的时候,会提示Failed to initialize BattlEye Service:Driver Load Error(1450) 驱动加载失败错误,如下图,到底是什么原因造 ...
- steam+linux+吃鸡游戏,Steam秋季特卖开启,GTA、吃鸡等游戏半价
Steam秋季特卖开启,GTA.吃鸡等游戏半价 2020年11月26日 10:03作者:陈沐梁编辑:陈沐梁文章出处:泡泡网原创 分享 Steam平台秋季特卖现在已经开启,将从北京时间11月26日持续至 ...
- java投屏刺激战场_吃鸡手游直播教程,怎么投屏直播玩刺激战场/全军出击
吃鸡手游直播教程,怎么投屏直播玩刺激战场/全军出击 作者:小葫芦直播管家 来源:小葫芦 时间:2018-05-15 15:57 "吃鸡"游戏火热,尤其是刺激战场和全军出击这两款手机 ...
- java mx150显卡够了吗_虽然小编觉得想要吃鸡怎么也要GTX 1050,但事实上MX150就够...
原标题:虽然小编觉得想要吃鸡怎么也要GTX 1050,但事实上MX150就够 虽说无论是之前的专题测试,还是装机后的演示,如果想要在<绝地求生:大逃杀>中获得比较健康的体验,那么至少需要R ...
最新文章
- SQL Server ltrim(rtrim()) 去不掉空格
- 心得体悟帖---开解语录2
- android控件ems,Android登录等待效果
- 父级透明,子级不透明
- 北京信息科技大学计算机专业学科评估,北京信息科技大学学科评估结果排名(第四次):最新完整...
- 【Java-Web】初始化加载Serlvet工程后-HttpServlet报错
- HTML5之语义化标签
- 【Django 2021年最新版教程20】python for循环遍历queryset
- 前端协商缓存强缓存如何使用_强制缓存(200)和协商缓存(304)
- C# 赛邮接口短信API验证demo
- 数据结构与算法之排序篇(下)
- get busy trying or get busy dying
- Android Tv限制后台进程数量
- bt 下载工具 deluge 配置 优化 使用
- 将网页保存为图片--修改
- matplotlib绘图教程
- 17.深入浅出:非正弦波发生电路——参考《模拟电子技术基础》清华大学华成英主讲
- 数字电路_1. 逻辑门表达式 真值表
- 40多岁,失业负债,我该怎么办?
- 【Python知识树 -- 预备知识】之 模块管理
热门文章
- ATL::CPath用法
- 小米4 第三方re奇兔_【搞事】小米上架39元充电器 20W可适配iPhone 12系列
- 初学者需了解的AutoCAD三大基础功能,具体有哪些?
- Android databingding与jetpack的lifecycle使用与比较
- mysql保存不了微信表情符emoji问题解决方案
- 隐私政策与用户协议 Privacy statement and User agreement——《学拼音》
- java k v t_java 中的 t,e,k,v
- 对四大杀毒软件的评价(卡巴、麦咖啡、诺顿、nod32)
- 零基础学习游戏建模先从基础做起?「教程」高级影视肖像《傲慢美女》全流程制作中文教程(保存)
- STM8S105 TIM1 TIM2 定时器的定时时间初始化