在最近的工作中,通過jprofiler解決了乙個記憶體洩漏的問題,現將檢測的步驟和一些分析記錄下來,已備今後遇到相似問題時可以作為參考。
tomcat6,jdk6,jprofiler8
1. 在伺服器中執行某些批量操作的時候,發現記憶體只公升不降;就算gc後,記憶體也不能被完全釋放;
2. 除非重啟tomcat伺服器,記憶體永遠不會被釋放,反覆執行這些操作,會導致無可用記憶體,tomcat死掉;
切換到「live memory-->all objects」標籤,可以看到當前tomcat中的物件情況,注意jprofiler其他版本可能位置不一樣.
在執行操作前,需要先f4,執行「run gc」,使jvm進行記憶體**清理無效的物件.為了便於比較記憶體的增長情況,可以點選右鍵--->"mark current",
來將當前記憶體使用情況作為參照;點選後會顯示「difference」列,該列會列出物件數量的變化和變化比率
點選「start recordings」按鈕,開始記錄。執行這步的主要目的是為下面「heap walker」設定乙個監控區間;如果不記錄的話「heap walker」將分析jvm虛擬機器的所有記憶體,即耗時又不能準確的發現記憶體洩漏的原因。
使用壓力工具訪問被測應用,執行完之後再次f4進行gc----這樣是為了消除可以**的物件。執行記憶體**後,仍然存在於記憶體中的物件有可能是洩漏的物件。如下圖instance count中紅色的部門為不能**的物件,difference列列出了增加的物件數量和增。以string為例,在該操作中增加了31751個物件增幅達到了14%,隨後會在heapwalker中觀察這些物件,分析哪些物件是洩漏的。一般引起洩漏的物件包括:string、char、hashmap、concurrenthashmap等,這類物件需要重點關注下;
點選「stop recordings」關閉記憶體記錄,告訴jprofiler把這段記錄作為分析物件;
在檢視中找到增長快速的物件型別,本例concurrenthashmap的增長速度很快。在memory檢視中找到concurrenthashmap---點右鍵----選擇「show selectiion in heap walker」,切換到heapwarker 檢視;切換前會彈出選項頁面,注意一定要選擇「select recorded objects」,這樣heap walker會在剛剛的那段記錄中進行分析;否則,會分析tomcat的所有記憶體物件,這樣既耗時又不準確;
heapwarker 會分析記憶體中的所有物件,包括物件的引用、建立、大小和數量;
heapwarker檢視下方可以進行頁面切換:
通過切換到references頁籤,可以看到這個類的具體物件例項。
為了在這些記憶體物件中,找到洩漏的物件(應該被**),可以在該物件上點選右鍵,選擇「use selected instances」縮小物件範圍;
單擊ok按鈕
在references引用頁籤中,可以看到該物件的的引用關係,可以切換incoming/outcoming,顯示引用的型別:
incoming 表示顯示這個物件被誰引用;
outcoming 表示顯示這個物件引用的其他物件;
選擇「show in graph」將引用關係使用圖形方式展現;
選中該物件,點選「show paths to gc root」,會找到引用的根節點;
在上圖中,我們可以發現,這個hashmap segment物件最終的引用是在concurrenthashmap和reentranlock物件中;
如果第7步還不能定位記憶體洩露的地方,我們可以嘗試使用allocations頁籤,該頁籤顯示物件是如何建立出來的;
我們可以從建立方法開始檢查,檢查所有用到該物件的地方,直到找到洩漏位置;
python 怎樣進行記憶體管理
從三個方面來說,主要有方面的措施 物件的引用計數機制 垃圾 機制 記憶體池機制。一 物件的引用計數機制 python內部程式設計客棧使用引用計數,來保持追蹤記憶體中的物件所有物件都有引用計數。引用計數增加的情況 1 乙個物件分配乙個新名稱 2 將其放入乙個容器中 如列表 元組或字典 引用計數減少的情...
使用frp進行內網穿透
環境 公網機器 關閉防火牆 systemctl disable firewalld chkconfig iptables off解壓 tar zxvf frp 0.28.2 linux amd64.tar.gz進入目錄 cd frp 0.28.2 linux amd64移動位置 mv frps us...
使用Frp進行內網穿透
這幾天在折騰電腦的遠端,因為總怕突然單位有啥突發的事兒嘛,然後自己電腦上又沒有環境,然後就惦著直接能夠遙控給主機板上電直接開機並且遠端。這個主機板上電直接開機倒是挺好辦的,主機板設定裡就有,設定乙個上電自動開機,然後 買乙個智慧型插座就全搞定了。但是我發現乙個問題,開機了是開機了,但是向日葵之類的遠...