內存泄露本意是申請的內存空間沒有被正確釋放,導致后續程序里這塊內存被永遠占用(不可達),
而且指向這塊內存空間的指針不再存在時,這塊內存也就永遠不可達了,內存空間就這么一點點被蠶食
OutOfMemoryError
內存溢出是指存儲的數據超出了指定空間的大小,這時數據就會越界。
內存溢出就是內存越界。內存越界有一種很常見的情況是調用棧溢出(即stackoverflow),
雖然這種情況可以看成是棧內存不足的一種體現。但內存溢出並不一定跟內存分配有什么關系,因為還有一種情況是緩沖區溢出
內存泄漏排查
jps: 找出正在運行的虛擬機進程,最主要是找出這個進程在本地虛擬機的唯一ID(LVMID,Local Virtual Machine Identifier)
jstat: 監視虛擬機各種運行狀態信息
jstat -gcutil pid 1000
分析方法通常有兩種:
1)把堆dump下來再用MAT等工具進行分析,但dump堆要花較長的時間,並且文件巨大,再從服務器上拖回本地導入工具,這個過程有些折騰,不到萬不得已最好別這么干。
2)更輕量級的在線分析,使用“Java內存影像工具:jmap”生成堆轉儲快照(一般稱為headdump或dump文件)。
jmap命令格式:
jmap [ option ] vmid
使用命令如下:
jmap -histo:live pid
定位代碼
參考:
https://www.jianshu.com/p/4548ab7f60e2
CPU滿負載排查
1. 用top命令找到CPU占用率高的java進程pid,或者ps -aux|grep java查看所有java進程的pid。
2.假設出問題的進程pid是1000,用top -H -p 1000查看該進程下線程CPU占用率,或者用ps -mp 1000 -o THREAD,tid,time | sort -rn查看。
3.假設查得耗時線程ID為1002,將該線程ID轉換為16進制格式:printf "%x\n" 1002,得到3ea,
用jstack 1000 |grep 3ea -A 30查看java線程棧,找出問題代碼。
參考:
https://www.jianshu.com/p/c839f9054979