================================================ ==== ===================
2. 运行pstack命令.
示例: pstack 9499并将输出重定向到文件.
如果您在Solaris中使用常规线程库(即LD_LIBRARY_PATH中没有/ usr / lib / lwp),
LWP不会直接映射到操作系统线程,因此您必须从进程中执行pstack(因此请检查是否正在使用备用线程库).
上面的示例显示“ java / 8”进程位于prstat的顶部.
3. 在pstack的输出中检查“ lwp#8”.
您会发现,“ lwp#8”从pstack输出映射到“线程#76”,如下所示.
================================================ ==== =================
----------------- lwp#8 /线程#76 --------------------
ff29d190民意调查(e2e81548、0,bb8)
ff24d154 select(0,0,0,e2e81548,ff2bf1b4,e2e81548)+ 348
ff36b134选择(0,bb8,7fffffff,fe4c8000,0,bb8)+ 34
fe0f62e4 __1cCosFsleep6FpnGThread_xl_i_(0,bb8,fe4c8000,1,0,1e2fd8)+ 234
fe23f050 JVM_Sleep(2,0,bb8,fe4de978,fe4c8000,1e2fd8)+ 22c
fe5324e8 __1cMStubRoutinesG_code1_(e2e819d8,e2e81c10,a,f6cb5000、4,e2e818f0)+ 3ec
fe0cbe94 __1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_(e2e81c08,fe4c8000,e2e81b54、1e2fd8、8e764,e2e81c10)+308
fe1f6dbc __1cJJavaCallsMcall_virtual6FpnJJavaValue_nLKlassHandle_nMsymbolHandlee81c08,e2e81b54)+ 150pnGThread__v_(f6cb64b8,e2e81b40,e2e81b44,fe4c8000,e2d8)+ 60e_5pnGThread__v_(e2e81c08,e2e81c04,e2e81c00,e2e81bf4,e2e81bec,1e2f8000,e2e81d10,1E,E)+ 120FpnKJavaThread_pnGThread__v_(f6817ff8,1e2fd8,fe4c
7fd70)+ 3d8cKJavaThreadDrun6M_v_(e2e02000,fe4d3e34,fe4c8000、7fd70、1e2fd8,
fe213ec8 _start(fe4c8000,fe625d10,0,5,1,fe401000)+ 20
ff36b728 _thread_start(1e2fd8,0,0,0,0,0)+ 40
================================================ ==== =====================
4. 通过在Java进程中执行以下命令来对服务器进行线程转储:
杀死-3
5. 由于lwp#8映射到线程#76,因此您可以将76转换为十六进制值4c.

此值映射到JVM线程转储中的nid = 0x4c:
================================================ ==== ================
“ Thread-6” prio = 5 tid = 0x1e2fd8 nid = 0x4c等待监视器[0xe2e81000..0xe2e819d8]
在java.lang.Thread.sleep(本机方法)
在weblogic.management.deploy.GenericAppPoller.run(GenericAppPoller.java:139)
================================================ ==== ======================
在此示例中,使用最多CPU资源的线程实际上正在休眠. 应用程序轮询程序在以开发模式启动的服务器上运行.
由于它每30秒运行一次,因此显然无法及时捕获线程转储以了解该线程中的活动.
理想情况下,所有三个步骤都应快速且连续地完成,以尽可能快地捕获数据. 可以使用类似于以下内容的简单shell脚本来完成此操作.
================================================ ==== =========================
#
#接受一个参数(WLS进程的PID)并循环3次.
#这会将prstat信息附加到名为dump_high_cpu.txt的文件中.
#线程转储信息将在重定向stdout的文件中或在屏幕上显示.
#
用于1 2 3中的循环数
做
prstat -L -p $ 1 1 1 >> dump_high_cpu.txt
pstack $ 1 >> dump_high_cpu.txt
杀死-3 $ 1
echo“ prstat,pstack和线程转储完成. #” $ loopnum
睡觉1
回声“睡着了. ”
完成
================================================ ==== ====================
6. 然后,您可以检查线程以确定它正在执行什么任务以及是否存在问题.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>> >>>>>>>>>>>>>>>>
AIX
>>>>>>>>>>>>>>>>>>>>
1. 执行: ps -mp
您应检查“ CP”列(指示CPU使用情况),以查看这些线程中哪个具有较高的值,然后选择一个线程.
2. 通过执行以下命令来线程转储服务器:
杀死-3
3. 运行: dbx -a
4. 在dbx中,运行dbx thread命令(列出所有线程).
5. 找到与ps -mp 此行中的数字应采用“ $ t 6. 在dbx中,运行dbx命令info 7. 在步骤3的输出中,在“常规”下找到“ pthread_t”并记录十六进制数. 8. 非常重要的注意事项: 完成后,在dbx提示符下,需要在dbx命令行中键入“ detach”,否则,如果仅在连接到进程时退出,则dbx将终止该进程! 9. 在“ p_thread_t”的输出中记下十六进制值,并搜索线程的“本机ID”等于该值的“线程转储”. 这将揭示导致CPU使用率高的问题的线程.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-207043-2.html
来宣示霸权的美国军舰
先是中国进入美国十二海里