一、问题排查
1.使用命令查出java程序,并获取到java的pid : top 或 jps 或ps -ef | grep java
2.使用java命令输出线程栈信息:jstack -l 12488 | tee -a jstack.log
3.使用 top -H -p 12488 找出进程中线程占用cpu最高的PID
4.将cpu占用最高的线程pid转为16进制 :30C8
5.编辑jstack.log: vi jstack.log
按下”/“键,这时在状态栏(也就是屏幕左下脚)就出现了 “/” 然后输入你要查找的关键字敲回车就可以了。找到相关文字以后:
(1)按下小写n,向下查找
(2)按下大写N,向上查找
6.在文件里查找线程编号30C8
备注: nid=0x6b29中的6b29就是线程号的十六进制
二、自动设置java程序启动参数
1.start.bat
@echo off
for /f "tokens=1,2 delims==" %%i in (.\config.ini) do (
if "%%i"=="Xms" set Xms=%%j
if "%%i"=="Xmx" set Xmx=%%j
if "%%i"=="Xmn" set Xmn=%%j
if "%%i"=="gcPath" set gcPath=%%j
if "%%i"=="projectName" set projectName=%%j
if "%%i"=="configPath" set configPath=%%j
if "%%i"=="realTimePath" set realTimePath=%%j
)
echo check variable_1: Xms=%Xms%
echo check variable_2: Xmx=%Xmx%
echo check variable_3: Xmn=%Xmn%
echo check variable_6: gcPath=%gcPath%
echo check variable_7: projectName=%projectName%
echo check variable_8: configPath=%configPath%
echo check variable_9: realTimePath=%realTimePath%
javaw -Xms%Xms% -Xmx%Xmx% -Xmn%Xmn% -Xloggc:%gcPath% -jar %projectName% --spring.config.location=%configPath% >> %realTimePath% 2>&1 &
pause
2.stop.bat
@echo off
for /f "tokens=1,2 delims==" %%i in (.\config.ini) do (
if "%%i"=="projectName" set projectName=%%j
if "%%i"=="projectPort" set projectPort=%%j
)
echo check variable_1: project_name=%projectName%
echo check variable_2: project_port=%projectPort%
set port=%projectPort%
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do taskkill /pid %%m -t -f
exit
3.config.ini
[default]
; 设置初始堆大小,物理内存的1/64
Xms=2g
; 最大堆大小,物理内存的1/4
Xmx=8g
; 年轻代大小
Xmn=3g
; gc日志文件路径
gcPath=logs\gc.log
; 项目包
projectName=test.jar
; 项目启动端口,对应这yml文件的端口,关闭项目使用
projectPort=8080
; 依赖文件路径
configPath=config\
; 实时日志输出路径
realTimePath=logs\nohup.log