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%,查看服务 ...
随机推荐
- spring数据验证
一般情况下,我们并不推荐在服务端做基础的数据校验,因为这有一个很主要的问题:它加重了服务器的负载,如果并发多,这种负载就更加明显. 如果我们跟踪一个简单的Controller方法执行过程,就会发现Sp ...
- 05-CentOS防火墙
概述 CentOS中的防火墙有很多,如SELinux.Firewall.TCP Wrappers.iptables/netfilter. 每种防火墙都有各自擅长的地方. 这里主要讲两种:SELinux ...
- 实验10.3层vlan互通实验
# 实验10.三层Vlan互通实验 本实验是跨vlan路由的第二种形式,比第一种形式更常见常用一些. 需要用到三层交换机. 实验组 交换机配置 不同于以往,本次的交换机使用了三层交换的功能 SW vl ...
- 01-前端开发Vscode插件配置
01 自动保存配置 02 空格渲染方式 配置好以后,可以看到代码的空格有几个,以点的方式呈现,1个点表示1个空格 03 图标插件 VSCode Great Icons 04 缩进 推荐使用2 05 v ...
- .NET6 个人博客-推荐文章加载优化
个人博客-推荐文章加载优化 前言 随着博客文章越来越多,那么推荐的文章也是越来越多,之前推荐文章是只推荐8篇,但是我感觉有点少,然后也是决定加一个加载按钮,也是类似与分页的效果,点击按钮可以继续加载8 ...
- (要做的事情)利用MNIST识别自己创建的手写数据
(要做的事情)利用MNIST识别自己创建的手写数据 看懂MNIST 进阶教程,了解CNN
- RabbitMQ 3.7.9版本中,Create Channel超时的常见原因及排查方法
在RabbitMQ 3.7.9版本中,Create Channel超时的常见原因及排查方法如下: 常见原因 网络问题: 网络延迟或不稳定可能导致通信超时. 网络分区(network partition ...
- 【Error】mysql的error.log中ranges: 268 max_threads: 4 split: 268 depth: 2是什么意思?
2021-12-08T09:36:39.612332+08:00 44213799 [Note] [MY-011825] [InnoDB] Parallel scan: 4 2021-12-08T09 ...
- VulnHub-Narak靶机渗透流程
VulnHub-Narak Description Narak is the Hindu equivalent of Hell. You are in the pit with the Lord of ...
- MySql 数据库、数据表操作
数据库操作 创建数据库 语法 语法一:create database 数据库名 语法二:create database 数据库名 character set 字符集; 查看数据库 语法 查看数据库服务 ...