高cpu占用
1、top命令:Linux命令。可以查看實時的CPU使用情況。也可以查看最近一段時間的CPU使用情況。
2、PS命令:Linux命令。強大的進程狀態監控命令。可以查看進程以及進程中線程的當前CPU使用情況。屬於當前狀態的采樣數據。
ps -mp pid -o THREAD,tid,time
printf "%x\n" tid
3、jstack:Java提供的命令。可以查看某個進程的當前線程棧運行情況。根據這個命令的輸出可以定位某個進程的所有線程的當前運行狀態、運行代碼,以及是否死鎖等等。
jstack pid |grep tid -A 30
1,使用jps查找出java進程的pid,如3707
2,使用top -p 14292 -H觀察該進程中所有線程的CPU占用。
3,找出CPU消耗較多的線程id,如15844,將15844轉換為16進制0x3de4,注意是小寫哦
4,使用jstack 14292|grep -A 10 0x3de4來查詢出具體的線程狀態。
高內存占用
搞Java開發的,經常會碰到下面兩種異常:
1、java.lang.OutOfMemoryError: PermGen space
2、java.lang.OutOfMemoryError: Java heap space
Java內存模型是描述Java程序中各變量(實例域、靜態域和數組元素)之間的關系,以及在實際計算機系統中將變量存儲到內存和從內存取出變量這樣的低層細節。
在Java虛擬機中,內存分為三個代:新生代(New)、老生代(Old)、永久代(Perm)。
(1)新生代New:新建的對象都存放這里
(2)老生代Old:存放從新生代New中遷移過來的生命周期較久的對象。新生代New和老生代Old共同組成了堆內存。
(3)永久代Perm:是非堆內存的組成部分。主要存放加載的Class類級對象如class本身,method,field等等。
如果出現java.lang.OutOfMemoryError: Java heap space異常,說明Java虛擬機的堆內存不夠。原因有二:
(1)Java虛擬機的堆內存設置不夠,可以通過參數-Xms、-Xmx來調整。
(2)代碼中創建了大量大對象,並且長時間不能被垃圾收集器收集(存在被引用)。
如果出現java.lang.OutOfMemoryError: PermGen space,說明是Java虛擬機對永久代Perm內存設置不夠。
一般出現這種情況,都是程序啟動需要加載大量的第三方jar包。例如:在一個Tomcat下部署了太多的應用。
ps -mp 9004 -o THREAD,tid,time,rss,size,%mem
遺憾的是,發現PS命令可以查到具體進程的CPU占用情況,但是不能查到一個進程下具體線程的內存占用情況。
只好尋求其他方法了,幸好Java提供了一個很好的內存監控工具:jmap命令
jmap命令有下面幾種常用的用法:
•jmap [pid]
•jmap -histo:live [pid] >a.log
•jmap -dump:live,format=b,file=xxx.xxx [pid]
用得最多是后面兩個。其中,jmap -histo:live [pid] 可以查看當前Java進程創建的活躍對象數目和占用內存大小。
jmap -dump:live,format=b,file=xxx.xxx [pid] 則可以將當前Java進程的內存占用情況導出來,方便用專門的內存分析工具(例如:MAT)來分析。