我们经常碰到一些定时任务卡死或者执行时间很长,这样的问题我们排查手段比较常用的是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#:数据绑定到方法

    在WPF Samples中有一个关于数据绑定到方法的Demo,该Demo结构如下: 运行效果如下所示: 来看看是如何实现的. 先来看下MainWindow.xaml中的内容: <Window.R ...

  2. GIS数据获取:气象数据免费下载网站

      本文对目前主要的气象数据获取网站加以整理与介绍.   本文为"GIS数据获取整理"专栏中第二篇独立博客,因此本文全部标题均由"2"开头.本文对目前主要的气象 ...

  3. 2019银川区域赛BDFGHIKN题解

    B.So Easy 题目大意:给你一个正方形矩阵,初始都是0,题目对这个矩阵做了许多次操作,每次操作把行+1或列+1.其中有一个元素被隐藏了,你需要找出这个被隐藏的元素并判断它在操作之后应该是多少. ...

  4. 在C#中使用RabbitMQ做个简单的发送邮件小项目

    在C#中使用RabbitMQ做个简单的发送邮件小项目 前言 好久没有做项目了,这次做一个发送邮件的小项目.发邮件是一个比较耗时的操作,之前在我的个人博客里面回复评论和友链申请是会通过发送邮件来通知对方 ...

  5. Codeforces Round 955 (Div. 2, with prizes from NEAR!) codeforces div2 955

    A. Soccer ------------------------题解--------------- 给你开始比分和结束比分问你中间两队比分有没有相等过有可能就是YES不可能就是NO 结束时两队比分 ...

  6. Spring Cloud 比较

    Spring Cloud 比较 一.简介 1.SpringCloud:一套微服务架构下的一站式解决方案,理念就是解决我们在微服务架构中遇到的任何问题: 2.SpringCloudAlibaba:阿里实 ...

  7. 【一天一点.NET小知识】运用向量Vector<T>加速求和计算

    随着 .NET 版本的演进,从 .NET Standard 2.0 版本开始,支持 Vector<T> 类型. Vector<T> 类型:表示指定数值类型(适用于并行算法的低级 ...

  8. 教你基于MindSpore用DCGAN生成漫画头像

    本文分享自华为云社区<[昇思25天学习打卡营打卡指南-第二十天]DCGAN生成漫画头像>,作者:JeffDing. DCGAN生成漫画头像 在下面的教程中,我们将通过示例代码说明DCGAN ...

  9. 作业错题集锦(pta英文数据结构)

    A graph with 30 vertices and 40 edges must have at most twenty one connected component(s). 要计算最大连通分量 ...

  10. MongDB 的下载和安装

    1.官网: https://www.mongodb.com/ 2.进入下载链接,选择windows平台版本 https://www.mongodb.com/try/download/community ...