quartz监控日志(三)查看卡死线程堆栈 转
我们经常碰到一些定时任务卡死或者执行时间很长,这样的问题我们排查手段比较常用的是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监控日志(三)查看卡死线程堆栈 转的更多相关文章
- Java问题定位之Java线程堆栈分析
采用Java开发的大型应用系统越来越大,越来越复杂,很多系统集成在一起,整个系统看起来像个黑盒子.系统运行遭遇问题(系统停止响应,运行越来越慢,或者性能低下,甚至系统宕掉),如何速度命中问题的根本原因 ...
- GDB将所有线程堆栈输出到文件
在调试多线程程序时,经常需要查看线程堆栈信息,如果线程数目过多,每次查看一个线程堆栈,繁琐耗时.下面介绍一种一次性将所有线程堆栈输出到文件的方法. 首先,将gdb attach到调试线程 gdb -p ...
- Java并发(三)----创建线程的三种方式及查看进程线程
一.直接使用 Thread // 创建线程对象 Thread t = new Thread() { public void run() { // 要执行的任务 } }; // ...
- 海康威视频监控设备Web查看系统(三):Web篇
声明:本系列文章只提供交流与学习使用.文章中所有涉及到海康威视设备的SDK均可在海康威视官方网站下载得到.文章中所有除官方SDK以为的代码均可随意使用,任何涉及到海康威视公司利益的非正常使用由使用者自 ...
- Java多线程——查看线程堆栈信息
Java多线程——查看线程堆栈信息 摘要:本文主要介绍了查看线程堆栈信息的方法. 使用Thread类的getAllStackTraces()方法 方法定义 可以看到getAllStackTraces( ...
- 查看Linux进程CPU过高具体的线程堆栈(不中断程序)
转自:http://blog.csdn.net/mergerly/article/details/47731305 1.TOP命令,找到占用CPU最高的进程 $ top top - 20:11:45 ...
- 【转载】查看Linux进程CPU过高具体的线程堆栈(不中断程序)
具体的命令经常忘记,毕竟用的不是很多.为了避免去找备份一下 1.TOP命令,找到占用CPU最高的进程 $ top top - 20:11:45 up 850 days, 1:18, 3 users ...
- 笔记常用Linux命令(三) 查看服务器日志
服务器日志 用于记录服务器的运行情况 查看服务器日志 tail:查看后面几行 n 显示行数 f 持续侦测后面的内容,查看服务器日志常用 查看最新的服务日志(静态) 命令格式:tail -n 行数 日志 ...
- Linux查看进程线程个数
1.根据进程号进行查询: # pstree -p 进程号 # top -Hp 进程号 2.根据进程名字进行查询: # pstree -p `ps -e | grep server | awk '{pr ...
- jstack工具查看系统线程问题
背景: 最近在做项目系统的异常测试,项目依赖于nkv,需要模拟依赖组件nkv异常时系统的响应及性能情况.通过tc工具模拟当服务器发送到nkv的请求超时时系统的响应.发现接口返回错误率100%,查看服务 ...
随机推荐
- Android自动化-如何获取视图元素属性?
在做Android自动化时候,我们需要知道视图有哪些元素,元素都有哪些属性,获取到属性我们才能获取到元素从而做自动化控制,所以做Android自动化获取元素属性是必要的第一步 获取视图元素属性最便捷的 ...
- 颠覆传统编程,用ChatGPT十倍提升生产力
我们即将见证一个新的时代!这是最好的时代,也是最坏的时代! 需求背景 背景: 平时会编写博客,并且会把这个博客上传到github上,然后自己买一个域名挂到github上. 我平时编写的博客会有一些图片 ...
- 仓颉语言HelloWorld内测【仅需三步】
2024年6月21日,华为仓颉正式公开发布.还记的19年和王学智的团队做过接触,他们反馈说16年我出版的<自己动手构造编译系统>一书对他们的研发很有帮助,身为作者听到这个消息还是很开心的. ...
- .NET 个人博客-首页排版优化
个人博客-首页排版优化 优化计划 置顶3个且可滚动或切换 推荐改为4个,然后新增历史文章,将推荐的加载更多放入历史文章,按文章发布时间降序排列. 标签功能,可以为文章贴上标签 推荐点赞功能 本篇文章优 ...
- 高通mm-camera平台 Camera移植
高通Cam-X平台 Camera移植 注:此文档以在高通8916平台移植OV5648为例,给大家讲解Android SOC的底层Camera. Reference: https://blog.csdn ...
- Xilinx XCZU7EV评估板规格书(四核ARM Cortex-A53 + 双核ARM Cortex-R5 + FPGA,主频1.5GHz)
1 评估板简介 创龙科技TLZU-EVM是一款基于Xilinx UltraScale+ MPSoC系列XCZU7EV高性能处理器设计的高端异构多核SoC评估板,处理器集成PS端(四核ARM Corte ...
- hadoop集群配置文件
配置文件与功能对应: 修改core-site.xml文件 <property> <name>fs.defaultFS</name> <!--配置hdfs系统的 ...
- html2canvas 页面截屏
$(document).ready(function () { $(".example1").on("click", function (event) { va ...
- yb课堂 新版VueCli 4.3创建vue项目,Vue基础语法入门 《二十九》
Vue模版语法开发起步 基于HTML的模版语法,允许声明式地将DOM绑定至底层Vue实例的数据 用简洁的模版语法来声明式的将数据渲染进DOM的系统 结合响应系统,在应用状态改变时,Vue能够智能地计算 ...
- git 怎么将某个开发分支最近几次的提交合并成一次提交
1. 切换到开发分支: git checkout dev 2. 运行交互式 rebase 命令,并指定要合并的提交数量(在这个例子中是最近的3次提交): git rebase -i HEAD~3 3. ...