我们经常碰到一些定时任务卡死或者执行时间很长,这样的问题我们排查手段比较常用的是jstack命令

来查看线程堆栈,然后根据我们监控中的threadId或者threadName来查找线程详细堆栈看卡在哪个方法。

常用命令如下:

jstack pid >jstack.log

现在我们可以提供界面查看卡死线程堆栈

controller代码

@RequestMapping("/getStackTrace")
@ResponseBody
public String getStackStace(HttpServletRequest request, HttpServletResponse response) {
logger.debug("执行选择的Job对象 queryQuartzLog quartzLog:");
try {
String threadId=request.getParameter("threadId");
if(StringUtils.isBlank(threadId)){
return "";
} ThreadInfo info = ThreadUtilities.getExtendThreadInfo(Long.valueOf(threadId));
List<String> list=new ArrayList<String>();
StackTraceElement[] st=info.getStackTrace();
int index=0;
MonitorInfo[] monitors=info.getLockedMonitors();
for(StackTraceElement e:st){
StringBuffer sb=new StringBuffer();
if(index>0){
sb.append(" <- ");
sb.append(System.getProperty("line.separator"));
}
sb.append(e.toString()+ "\n");
list.add(sb.toString());
if (monitors != null) {
for (MonitorInfo mi : monitors) {
if (mi.getLockedStackDepth() == index) {
list.add(" <- - locked "+mi.toString());
}
}
}
index++;
}
return generateHtml("vm/getStackTrace.vm", list);
} catch (Exception e) {
logger.error("doRunQuartzJob 执行选择的Job对象出错", e);
return "fail";
}
}

ThreadUtilities.getExtendThreadInfo

public static ThreadInfo getExtendThreadInfo(final long threadID) {
ThreadInfo ti = null;
final ThreadMXBean threadMBean = ManagementFactory.getThreadMXBean();
if (threadMBean.isObjectMonitorUsageSupported()) {
// VMs that support the monitor usage monitoring
ThreadInfo[] infos = threadMBean.dumpAllThreads(true, false);
for (ThreadInfo info : infos) {
if (info.getThreadId() == threadID) {
ti = info;
break;
}
}
} else {
// VM doesn't support monitor usage monitoring
ti = threadMBean.getThreadInfo(threadID, Integer.MAX_VALUE);
}
return ti;
}

然后通过vm代码将堆栈展示在页面上

getStackTrace.vm

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="description" content="" />
<meta name="Keywords" content="" />
<title>job logs</title>
</head>
<body>
<div>
#foreach($element in $data)
$element<br/>
#end
</div>
</body>
</html>
public class BaseController {
private static final VelocityEngine ve = new VelocityEngine();
private static final Logger logger = LoggerFactory.getLogger(QuartzController.class); static{
// 初始化Velocity引擎
InputStream is = BaseController.class.getResourceAsStream("/velocity.properties");
Properties properties = new Properties();
try {
properties.load(is);
} catch (IOException e) {
e.printStackTrace();
}
ve.init(properties);
}
public String generateHtml(String vmTemplate,Object obj){
StringWriter sw = new StringWriter();
try {
VelocityContext ctx = new VelocityContext();
ctx.put("data", obj);
ve.getTemplate(vmTemplate,"UTF-8").merge(ctx, sw);
} catch (Exception e) {
logger.error("转化vm模板出错",e);
}finally{
if(sw!=null){
try {
sw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sw.toString(); }
}

quartz监控日志(三)查看卡死线程堆栈 转的更多相关文章

  1. Java问题定位之Java线程堆栈分析

    采用Java开发的大型应用系统越来越大,越来越复杂,很多系统集成在一起,整个系统看起来像个黑盒子.系统运行遭遇问题(系统停止响应,运行越来越慢,或者性能低下,甚至系统宕掉),如何速度命中问题的根本原因 ...

  2. GDB将所有线程堆栈输出到文件

    在调试多线程程序时,经常需要查看线程堆栈信息,如果线程数目过多,每次查看一个线程堆栈,繁琐耗时.下面介绍一种一次性将所有线程堆栈输出到文件的方法. 首先,将gdb attach到调试线程 gdb -p ...

  3. Java并发(三)----创建线程的三种方式及查看进程线程

    一.直接使用 Thread // 创建线程对象 Thread t = new Thread() {    public void run() {        // 要执行的任务   } }; // ...

  4. 海康威视频监控设备Web查看系统(三):Web篇

    声明:本系列文章只提供交流与学习使用.文章中所有涉及到海康威视设备的SDK均可在海康威视官方网站下载得到.文章中所有除官方SDK以为的代码均可随意使用,任何涉及到海康威视公司利益的非正常使用由使用者自 ...

  5. Java多线程——查看线程堆栈信息

    Java多线程——查看线程堆栈信息 摘要:本文主要介绍了查看线程堆栈信息的方法. 使用Thread类的getAllStackTraces()方法 方法定义 可以看到getAllStackTraces( ...

  6. 查看Linux进程CPU过高具体的线程堆栈(不中断程序)

    转自:http://blog.csdn.net/mergerly/article/details/47731305 1.TOP命令,找到占用CPU最高的进程 $ top top - 20:11:45  ...

  7. 【转载】查看Linux进程CPU过高具体的线程堆栈(不中断程序)

    具体的命令经常忘记,毕竟用的不是很多.为了避免去找备份一下 1.TOP命令,找到占用CPU最高的进程 $ top top - 20:11:45 up 850 days,  1:18,  3 users ...

  8. 笔记常用Linux命令(三) 查看服务器日志

    服务器日志 用于记录服务器的运行情况 查看服务器日志 tail:查看后面几行 n 显示行数 f 持续侦测后面的内容,查看服务器日志常用 查看最新的服务日志(静态) 命令格式:tail -n 行数 日志 ...

  9. Linux查看进程线程个数

    1.根据进程号进行查询: # pstree -p 进程号 # top -Hp 进程号 2.根据进程名字进行查询: # pstree -p `ps -e | grep server | awk '{pr ...

  10. jstack工具查看系统线程问题

    背景: 最近在做项目系统的异常测试,项目依赖于nkv,需要模拟依赖组件nkv异常时系统的响应及性能情况.通过tc工具模拟当服务器发送到nkv的请求超时时系统的响应.发现接口返回错误率100%,查看服务 ...

随机推荐

  1. WPF/C#:在DataGrid中显示选择框

    前言 在使用WPF的过程中可能会经常遇到在DataGrid的最前或者最后添加一列选择框的需求,今天跟大家分享一下,在自己的项目中是如何实现的. 整体实现效果如下: 如果对此感兴趣,可以接下来看具体实现 ...

  2. 让matplotlib在绘图时显示中文

    让matplotlib绘图时显示中文. 安装中文字体 apt install fonts-wqy-microhei 清除matplotlib的缓存    rm -rf ~/.cache/matplot ...

  3. 详解Web应用安全系列(6)安全配置错误

    Web攻击中的安全配置错误漏洞是一个重要的安全问题,它涉及到对应用程序.框架.应用程序服务器.Web服务器.数据库服务器等组件的安全配置不当.这类漏洞往往由于配置过程中的疏忽或错误,使得攻击者能够未经 ...

  4. Windows批处理文件(.bat和.cmd)

    cmd文件和bat文件的区别 从文件描述中的区别是,cmd文件叫做:Windows命令脚本,bat文件叫:批处理文件,两者都可以使用任意一款文本编辑器进行创建.编辑和修改,只是在cmd中支持的命令要多 ...

  5. ARP协议介绍与投毒攻击

    目录 ARP是什么? ARP协议工作原理 ARP攻击原理 攻击软件 防范 Reference ARP是什么? ARP是通过网络地址(IP)来定位机器MAC地址的协议,它通过解析网络层地址(IP)来找寻 ...

  6. 高程读后感(三)— JS对象实现继承的6种模式及其优缺点

    目录 1.原型链 1.1.默认的原型 1.2.原型和实例的关系 1.3.原型链的问题 2.借用构造函数 2.1.传递参数 2.2.借用构造函数的问题 3.组合继承 4.原型式继承 5.寄生式继承 6. ...

  7. [oeasy]python0022_ python虚拟机_反编译_cpu架构_二进制字节码_汇编语言

    ​ 程序本质 回忆上次内容 ​python3​​ 的程序是一个 5.3M 的可执行文件 我们通过which命令找到这个python3.8的位置 将这个python3.8复制到我们的用户目录下 这个文件 ...

  8. ArchLinux Vmware安装指北

    ArchLinux Vmware安装指北 在本文开始之前,首先允许我提前声明一点,Arch Linux的安装并不算难,但是绝对也算不上简单,中间的安装可能会遇到很多问题,本篇文章不能保证完全贴合你的真 ...

  9. 靶机: AdmX_new

    靶机: AdmX_new 准备阶段 靶机:https://download.vulnhub.com/admx/AdmX_new.7z 下载后进行 MD5:2948034da23a8acc1285fd4 ...

  10. ABC350

    A link 把最后三位取成数字,判断是否小于\(349\),大于\(1\),不等于\(316\). 点击查看代码 #include<bits/stdc++.h> using namesp ...