Java如何定位占用CPU比较高的问题 如何定位cpu占用率高的java线程

Java\u5f00\u53d1\u5982\u4f55\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u5360\u7528\u5185\u5b58\u6216CPU\u6700\u9ad8\u7684\u4e00\u884c\u4ee3\u7801

\u8981\u5b9a\u4f4d\u5230\u884c\uff0c\u4ee3\u7801\u8981debug\u7f16\u8bd1\uff0c\u81f3\u5c11\u8981\u5e26\u4e0a\u884c\u4fe1\u606f\u3002
\u7ebf\u7a0b\u5360\u7528\u5185\u5b58\u9ad8\u4f4e\uff0c\u53ef\u4ee5\u7528jmap\u505aheap dump\u51fa\u6765\u7ed9MomoryAnalysis\u5206\u6790\u4ed6\u53ef\u4ee5\u6309\u7ebf\u7a0b\u7edf\u8ba1\uff0c\u4e00\u822c\u4e5f\u53ef\u4ee5\u7528\u5b83\u6765\u627e\u51fa\u9020\u6210OOM\u7684\u539f\u56e0\u3002
\u7ebf\u7a0b\u5360\u7528CPU\uff0c\u4e0a\u8ff0\u5185\u5b58\u7684\u95ee\u9898\u662f\u4e00\u4e2a\u65b9\u9762\uff0c\u53e6\u5916\u4e5f\u53ef\u4ee5jstack\u6253\u7ebf\u7a0b\u6808\u6765\u5206\u6790\u3002Linux\u4e0aps -T -p\u53ef\u4ee5\u770b\u5e95\u5c42\u7ebf\u7a0b\u7684CPU\u5360\u7528\uff08Windows\u4e0a\u9700\u8981\u989d\u5916\u6309\u5de5\u5177\uff09\uff0c\u8bb0\u5f97\u7ebf\u7a0b\u7f16\u53f7\u53ef\u4ee5\u5728jstack\u6253\u51fa\u6765\u7684\u7ebf\u7a0b\u6808\u4e2d\u68c0\u67e5\u3002

\u548c\u8fd9\u7bc7\u535a\u5ba2\u662f\u4e00\u4e2a\u601d\u8def\uff1a
http://www.sojson.com/blog/194.html

一、确定消耗CPU的Java进程

从上图可以看到Java进程 27459 消耗的CPU比较高。

二、查找 27459 Java进程消耗CPU线程ID

方式一: top -p [pid] 或 top -H -p [pid]

执行命令后按shift + h (显示进程各线程运行情况)

1)、top -p 27459

2)、shift + h

如下图:

方式二: ps -mp [pid] -o THREAD,tid,time

ps -mp 27459 -o THREAD,tid,time

方式三: pidstat -p [pid] -t 1

pidstat -p 27459 -t 1

备注:pidstat命令需要安装sysstat软件包。

从上面三种方式都可以看出PID是 27460的线程占用CPU比较高。

三、根据Java进程堆栈信息找到对应线程ID

3.1、对应线程ID转换成16进程 printf '%x
' [tid]

27460 = 0x6b44

3.2、jstack [pid] 或 jstack [pid] |grep [tid] -A 30

jstack 27460 >> 27460.log

在27460.log文件中查找0x6b44对应的线程,如下图:

备注:

1、jstack 输出的堆栈信息,线程id对应的16进制为小写,查找时要统一按照小写方式查找

2、jstack输出为当前瞬间的堆栈信息,如果遇到间断性出现CPU高的问题时,需要多输出几次

从上面方式定位到代码Test.main(Test.java:4)处导致了CPU偏高的问题,那我们查看下代码具体如何实现的?

代码实现:

public class Test {
public static void main(String[] args) {
while(true) {

}
}
}

从代码层面看该处实现了一个死循环,所以导致了线程占用CPU偏高的问题。



  • 濡備綍娴嬮噺java绋嬪簭鐨cpu鍗犵敤鎯呭喌
    绛旓細鍦↗DK鐨刡in鐩綍鏈変竴涓伐鍏,鍙玧console.exe锛屽弻鍑绘墦寮鍚庯紝杩炴帴浣犻渶瑕佺洃鎺х殑JVM锛岀劧鍚庡氨鍙互鏉ユ煡鐪CPU銆佸唴瀛鍗犵敤鎯呭喌銆傝繕鏈塉DK鎻愪緵鐨 jvisualvm.exe锛屽姛鑳芥洿寮哄ぇ銆
  • 鎬庝箞鑳界敤JAVA瀵硅繘绋CPU,鍐呭瓨绛夎繘琛岀洃鎺с
    绛旓細TOP鍛戒护锛屼笉鑳藉彧鐩戞帶杩涚▼鐨CPU鍜屽唴瀛樼殑浣跨敤閲忥紝骞朵笖涔熶笉鑳界湅鍒颁娇鐢ㄩ噺鎬诲拰锛岃繕鏄敤鑴氭湰鍚э紝绫诲瀷杩欐牱锛歱s -aux|grep java|awk ''|awk 'BEGIN END'灏卞彲浠ワ紝CPU鍚屾牱銆
  • 璇烽棶鎬庝箞娴嬭瘯涓涓java绋嬪簭鍗犵敤鐨勫唴瀛樺拰cpu娑堣?
    绛旓細鍙兘鏌ョ湅JAVA 铏氭嫙鏈鍗犵敤鐨勫唴瀛楻untime.getRuntime().maxMemory() 杩斿洖 Java 铏氭嫙鏈鸿瘯鍥句娇鐢ㄧ殑鏈澶у唴瀛橀噺銆俁untime.getRuntime().freeMemory() 杩斿洖 Java 铏氭嫙鏈轰腑鐨勭┖闂插唴瀛橀噺銆俁untime.getRuntime().totalMemory() 杩斿洖 Java 铏氭嫙鏈轰腑鐨勫唴瀛樻婚噺銆
  • 濡備綍鐩戣璁$畻鏈虹殑CPU,鍐呭瓨鍜岀鐩樹娇鐢ㄦ儏鍐靛湪Java涓
    绛旓細System.out.println("JVM鍙互浣跨敤鐨澶勭悊鍣涓暟: " + r.availableProcessors()); System.out.println("Java鐨杩愯鐜鐗堟湰: " + props.getProperty("java.version")); System.out.println("Java鐨勮繍琛岀幆澧冧緵搴斿晢: " + props.getProperty("java.vendor")); System.out.println("Java渚涘簲鍟嗙殑URL: " + props....
  • java鎬庢牱鑾峰彇CPU鍗犵敤鐜囧拰纭洏鍗犵敤鐜
    绛旓細閫氳繃jmx鍙互鐩戞帶vm鍐呭瓨浣跨敤,绯荤粺鍐呭瓨浣跨敤绛夛紝浠ヤ笅鏄綉涓婃煇鍗氬浠g爜锛岀壒鐐规槸閫氳繃window鍜宭inux鍛戒护鑾峰緱CPU浣跨敤鐜囥傚埄鐢java绋嬪簭瀹炵幇鑾峰彇璁$畻鏈cpu鍒╃敤鐜囧拰鍐呭瓨浣跨敤淇℃伅銆俻ackage com.amgkaka.performance; /** *//** * 鐩戣淇℃伅鐨凧avaBean绫. * @author amg * @version 1.0 * Creation...
  • 缁忚繃top鍜宩stack纭畾鍝簺绾跨▼鑰楀敖浜CPU
    绛旓細鑳屾櫙鏈夋椂锛岀嚎涓婇泦缇oad浼氱獊鐒堕鍗囷紝鏃犳硶鍝嶅簲姝e父璇锋眰銆傞偅涔堝紩璧穕oad椋欏崌鐨勭嚎绋嬬┒绔熷湪鍋氫粈涔堬紵鍝簺绾跨▼闇稿崰浜咰PU锛熷彲浠ラ氳繃top鍜宩stack鍛戒护杩涜瀹氫綅銆2. 瀹氫綅姝ラ1. 浣跨敤缁堢1杩涘叆鐩爣鏈哄櫒锛屾墽琛宼op鍛戒护锛岄粯璁ゆ槸杩涚▼瑙嗗浘锛屽叾涓璓ID鏄繘绋嬪彿锛屾埅鍥惧涓嬶細鍦ㄨ繖閲岋紝鎴戜滑鍙兘鐪嬪埌java杩涚▼鍗犵敤CPU杈惧埌115%锛岄偅涔堢┒绔熸槸...
  • Java涓瑿PU鍗犵敤杩囬珮闂濡備綍瑙e喅
    绛旓細4.echo 鈥渙base=16; PID鈥 | bc 灏嗙嚎绋嬬殑PID杞崲涓16杩涘埗,澶у啓杞崲涓哄皬鍐欍5.鍦ㄧ浜屾瀵煎嚭鐨Java.txt涓煡鎵捐浆鎹㈡垚涓16杩涘埗鐨勭嚎绋婸ID銆傛壘鍒板搴旂殑绾跨▼鏍堛6.鍒嗘瀽璐熻浇楂樼殑绾跨▼鏍堥兘鏄粈涔堜笟鍔℃搷浣溿備紭鍖栫▼搴忓苟澶勭悊闂銆傛柟娉2 1.浣跨敤top 瀹氫綅鍒鍗犵敤CPU楂樼殑杩涚▼PID top 閫氳繃ps aux | grep PID鍛戒护...
  • java鑾峰彇cpu浣跨敤鐜囩殑鏂规硶娑堣CPU杩囧
    绛旓細Java杩愯鏈韩鏄娑堣CPU鐨勶紝濡傛灉浣犳兂鎺掗櫎杩欎釜鍥犵礌锛岄偅涔堜綘鍙互璁¦indows鐨勭粍浠惰幏鍙栫劧鍚庤緭鍑哄埌鏂囦欢閲岄潰锛岃孞ava鍦ㄨ繖娈垫椂闂翠竴鐩磗leep灏卞ソ浜嗘垜璁板緱鏈変釜宸ュ叿鍙玴slist鐨
  • 鎬庝箞閫氳繃java绋嬪簭鏌ョ湅java绋嬪簭鑷韩鐨CPU浣跨敤鐜囧拰鍐呭瓨浣跨敤鎯呭喌?
    绛旓細鍙栧緱杩涚▼ID锛岃皟鐢ㄧ郴缁烝PI鍙栧緱鐩稿叧鍊硷紙Windows鍜孡inux鏄笉涓鏍风殑鐨勶級銆
  • java鏈嶅姟鍣ㄦ煇娈垫椂闂cpu楂鎬庝箞鎷垮埌鏃ュ織
    绛旓細3.浣跨敤宸ュ叿杩涜鍒嗘瀽锛屽彲浠ヤ娇鐢ㄩ潪甯告祦琛岀殑鍚勭鍒嗘瀽宸ュ叿锛屼緥濡倂isualVm銆丣Profiler銆丣MC銆乯console绛夛紝鍏朵腑visualVm鍜孞Profiler姣旇緝甯哥敤锛屽彲浠ラ氳繃杩欎簺宸ュ叿瀹炴椂鐩戞帶绋嬪簭鐨勮繍琛岀姸鎬侊紝鎵惧埌骞惰В鍐抽棶棰樸傛讳箣锛屽綋Java鏈嶅姟鍣CPU楂樼殑鎯呭喌鍑虹幇鏃讹紝闇瑕侀拡瀵规у湴鍒嗘瀽鍚勭鏃ュ織淇℃伅锛屾壘鍑虹▼搴忚繍琛屾椂鐨勯棶棰樼偣锛屽苟杩涜璋冩暣浼樺寲锛...
  • 扩展阅读:哪里看dx12 ... java cpu占用过高 ... 怎样电脑判断32位64位 ... dx12支持的显卡目录 ... java编程入门 ... 主板和cpu对照一览表 ... 中国有主根服务器吗 ... 一张图看懂cpu参数 ... 服务器cpu为什么便宜 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网