show-busy-java-threads.sh(摘自:https://github.com/oldratlee/useful-scripts/blob/master/show-busy-java-threads.sh)
#!/bin/bash | |
# @Function | |
# Find out the highest cpu consumed threads of java, and print the stack of these threads. | |
# | |
# @Usage | |
# $ ./show-busy-java-threads.sh | |
# | |
# @author Jerry Lee | |
readonly PROG=`basename $0` | |
readonly -a COMMAND_LINE=("$0" "$@") | |
usage() { | |
cat <<EOF | |
Usage: ${PROG} [OPTION]... | |
Find out the highest cpu consumed threads of java, and print the stack of these threads. | |
Example: ${PROG} -c 10 | |
Options: | |
-p, --pid find out the highest cpu consumed threads from the specifed java process, | |
default from all java process. | |
-c, --count set the thread count to show, default is 5 | |
-h, --help display this help and exit | |
EOF | |
exit $1 | |
} | |
readonly ARGS=`getopt -n "$PROG" -a -o c:p:h -l count:,pid:,help -- "$@"` | |
[ $? -ne 0 ] && usage 1 | |
eval set -- "${ARGS}" | |
while true; do | |
case "$1" in | |
-c|--count) | |
count="$2" | |
shift 2 | |
;; | |
-p|--pid) | |
pid="$2" | |
shift 2 | |
;; | |
-h|--help) | |
usage | |
;; | |
--) | |
shift | |
break | |
;; | |
esac | |
done | |
count=${count:-5} | |
redEcho() { | |
[ -c /dev/stdout ] && { | |
# if stdout is console, turn on color output. | |
echo -ne "\033[1;31m" | |
echo -n "$@" | |
echo -e "\033[0m" | |
} || echo "$@" | |
} | |
yellowEcho() { | |
[ -c /dev/stdout ] && { | |
# if stdout is console, turn on color output. | |
echo -ne "\033[1;33m" | |
echo -n "$@" | |
echo -e "\033[0m" | |
} || echo "$@" | |
} | |
blueEcho() { | |
[ -c /dev/stdout ] && { | |
# if stdout is console, turn on color output. | |
echo -ne "\033[1;36m" | |
echo -n "$@" | |
echo -e "\033[0m" | |
} || echo "$@" | |
} | |
# Check the existence of jstack command! | |
if ! which jstack &> /dev/null; then | |
[ -z "$JAVA_HOME" ] && { | |
redEcho "Error: jstack not found on PATH!" | |
exit 1 | |
} | |
! [ -f "$JAVA_HOME/bin/jstack" ] && { | |
redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack file does NOT exists!" | |
exit 1 | |
} | |
! [ -x "$JAVA_HOME/bin/jstack" ] && { | |
redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack is NOT executalbe!" | |
exit 1 | |
} | |
export PATH="$JAVA_HOME/bin:$PATH" | |
fi | |
readonly uuid=`date +%s`_${RANDOM}_$$ | |
cleanupWhenExit() { | |
rm /tmp/${uuid}_* &> /dev/null | |
} | |
trap "cleanupWhenExit" EXIT | |
printStackOfThreads() { | |
local line | |
local count=1 | |
while IFS=" " read -a line ; do | |
local pid=${line[0]} | |
local threadId=${line[1]} | |
local threadId0x="0x`printf %x ${threadId}`" | |
local user=${line[2]} | |
local pcpu=${line[4]} | |
local jstackFile=/tmp/${uuid}_${pid} | |
[ ! -f "${jstackFile}" ] && { | |
{ | |
if [ "${user}" == "${USER}" ]; then | |
jstack ${pid} > ${jstackFile} | |
else | |
if [ $UID == 0 ]; then | |
sudo -u ${user} jstack ${pid} > ${jstackFile} | |
else | |
redEcho "[$((count++))] Fail to jstack Busy(${pcpu}%) thread(${threadId}/${threadId0x}) stack of java process(${pid}) under user(${user})." | |
redEcho "User of java process($user) is not current user($USER), need sudo to run again:" | |
yellowEcho " sudo ${COMMAND_LINE[@]}" | |
echo | |
continue | |
fi | |
fi | |
} || { | |
redEcho "[$((count++))] Fail to jstack Busy(${pcpu}%) thread(${threadId}/${threadId0x}) stack of java process(${pid}) under user(${user})." | |
echo | |
rm ${jstackFile} | |
continue | |
} | |
} | |
blueEcho "[$((count++))] Busy(${pcpu}%) thread(${threadId}/${threadId0x}) stack of java process(${pid}) under user(${user}):" | |
sed "/nid=${threadId0x} /,/^$/p" -n ${jstackFile} | |
done | |
} | |
ps -Leo pid,lwp,user,comm,pcpu --no-headers | { | |
[ -z "${pid}" ] && | |
awk '$4=="java"{print $0}' || | |
awk -v "pid=${pid}" '$1==pid,$4=="java"{print $0}' | |
} | sort -k5 -r -n | head --lines "${count}" | printStackOfThreads |
相关推荐
监控脚本可以实时收集CPU利用率数据,帮助我们发现可能的性能瓶颈,如CPU密集型任务、资源争抢等,并及时调整应用配置或优化代码。 3. **网络性能检查**: 网络是应用通信的基础,其性能直接影响到服务的可用性和...
3. **Android游戏框架**:许多Java游戏开发使用特定的游戏框架,如LibGDX、Unity(支持Java脚本)等,这些框架提供了图形渲染、物理引擎、音频处理等功能,简化游戏开发流程。 4. **图形和动画**:游戏中的视觉元素...
6. **错误处理和重试机制**:为了增加脚本的健壮性,可能会包含错误处理代码,如果启动失败,脚本可能会有重试机制或者发送报警通知。 "描述"中提到的"说明文档.docx"是一个重要的参考资料,它详细解释了如何使用和...
总结来说,面对Java IBM WebSphere的内存溢出问题,我们需要结合`javacore`和`deapdump`等诊断工具,通过分析脚本和相关库文件,理解内存管理原理,调整JVM配置,并优化代码,才能有效地排查和解决问题。
运维脚本主要用于执行日常的系统管理任务,如监控、备份、更新、故障排查等,通过编写脚本,我们可以将一系列命令组合在一起,形成一个可重复执行的任务流程。 一、脚本语言基础 运维脚本通常使用Shell(如bash、sh...
`show-busy-java-threads.sh`脚本就是为了帮助开发者快速定位和排查这类性能问题而设计的。这个脚本主要用于监控并展示Java应用程序中的繁忙线程,从而帮助我们理解程序的执行状态,找出可能导致高CPU负载的原因。 ...
本文将深入探讨如何计算Java对象所占内存,并通过提供的代码示例进行详细解析。 首先,我们需要理解Java对象内存占用的基本原理。每个Java对象都由三部分组成:对象头(Object Header)、实例数据(Instance Data)...
开发者可以通过异步加载资源、减少不必要的DOM操作等方式优化JavaScript代码,同时,定期调用`WebView.clearCache()`和`WebView.clearHistory()`可以清理缓存,提升性能。 7. **调试工具**: 使用Chrome开发者工具...
【Myeclipse Patch Java 资源文件】是针对Myeclipse集成开发环境的一个优化工具集合,配合Java环境和Tomcat服务器的安装包,旨在帮助用户更高效地管理和使用Myeclipse。在这个压缩包中,虽然没有包含完整的Myeclipse...
3. **资源管理**:合理配置JVM参数,避免内存泄漏或资源占用过高。 4. **权限设置**:确保服务运行时具有必要的文件读写和网络访问权限。 5. **守护进程**:在Linux系统中,可以使用`nohup`或`screen`命令确保程序...
`show-busy-java-threads.sh` 文件提供了一个实用的脚本,帮助我们查看那些导致Linux系统CPU占用率升高的Java线程。 首先,让我们了解什么是JVM。JVM(Java Virtual Machine)是Java程序的运行环境,它负责解释和...
- `console`命令:打开一个交互式的脚本执行环境,可以直接运行Java代码。 - ` watch`, `update`, `execute`等命令:用于动态修改运行中的类或者方法。 Arthas的灵活性和强大功能使其成为Java开发者必备的工具之一...
总结,`jps`和`jstack`是Java开发和运维中的有力工具,结合Shell脚本实现定时收集,可以有效监控和排查Java应用的问题。通过深入了解并熟练运用这些工具,开发者可以更好地理解和管理他们的Java应用程序。
7. **防止内存泄漏**:合理的对象生命周期管理和内存回收策略,防止恶意代码占用过多系统资源。 8. **日志和审计**:记录程序运行时的关键事件,便于分析和排查安全问题。 9. **使用最新版本的Java**:及时更新...
在标题和描述中提到的问题,即"Linux下buff/cache占用过高",这是一个常见的系统性能优化问题,尤其是对于运行Java应用或者其他资源密集型服务的云服务器而言。这里我们将深入探讨buff/cache的作用、为何会占用过多...
在项目中,包含了源代码和编译后的jar文件,使得用户不仅可以直接使用预编译的二进制版本,也可以根据需要修改源码并重新构建。 Sync项目的核心特性包括: 1. **双向同步**:Sync支持双向同步,这意味着它可以同时...
JMeter是Apache项目的一个开源工具,主要用于负载和性能测试,可以用于测试静态和动态资源,如静态文件、Java Servlets、CGI脚本、Java对象、数据库和FTP服务器等。在Linux环境中,监控资源对于优化应用性能和排查...
1. **CPU占用过高问题排查**:当遇到Java应用(如Tomcat)CPU占用过高时,通常会使用`jps`找到JVM进程,`jstack`分析线程状态,`jstat`监控JVM内存和垃圾收集情况。 2. **log4j死锁问题**:log4j 1.x版本可能存在...
Java是一种广泛使用的高级编程语言,由Sun Microsystems(现在是Oracle公司的一部分)开发,以其“一次...解决这些问题通常需要深入理解Java内存模型、线程同步机制、SQL优化等,并利用各种调试工具进行排查和优化。
线上Java应用,在业务高峰期的时候经常出现CPU跑高,需要查看实时的线程占用cpu情况,下面是一个很好用的脚本,可以快速导出每个线程的占用CPU情况,结合jstack日志,排查到具体的线程类名。 一、首先获得jvm的进程...