介紹:
初步學習了一下linux相關獲取jvm運行狀況以及內存的對象情況的和獲取dump文件的命令,以及利用jprofiler打開dump文件,利用jprofiler啓動項目實時監控內存。可是隻是模擬了一下,實際運用場景仍是有待說明,感受主要靠經驗。html
第一點,top命令
top命令先查出 佔用cpu最高或者內存最高的java進程java
這裏能夠看出pid爲2142的java進程的cpu佔用率以及 只用內存比較大linux
第二點,jmap -heap 2142
針對這個進程id顯示他的內存信息 和配置信息
app
這裏看出對內存的配置信息 以及下面的對內存的使用狀況 包括eden區 拷貝的from 以及to區 以及jvm
ps old 年老代 這些的使用狀況 結合fullgc的週期性 和大小 younggc 能夠分析項目的健康情況ide
能夠適當優化jvm參數 不過通常不須要 都是代碼的問題
第三點, jmap -histo 2142學習
顯示對象的實例的個數 以及所佔字節的圖表優化
這裏看出哪些對象的實例特別多 方便查詢問題idea
第四點, jmap -dump:live,format=b,file=2.log 2142.net
生成dump文件
生成dump文件的過程
第五點,利用jprofiler打開dump文件
預覽效果dump文件打開的效果
第六點,利用jprofiler實時監控項目運行狀況 並模擬內存溢出的情況
利用jprofiler idea安裝jprofiler的插件 啓動以後 實時監控 內存 ,gc的頻率, 對象的生成
線程的比例 有記錄到線程的具體的 是否阻塞 多少阻塞 等 以及cpu使用率 的一系列圖表 另外觀察內存 還能夠具體切換觀察到eden psold 和整個heap區域的實際狀況
模擬代碼
@RequestMapping(value = "/test.rest") @ResponseBody public void test() { int a=5000000; //模擬內存溢出的場景 for(int i=0;i<a;i++){ ThreadPoolExecutor thread= new ThreadPoolExecutor(20, Integer.MAX_VALUE, 30l, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); final int s = i; thread.execute(new Runnable() { @Override public void run() { System.out.println(s); } }); } }
這裏循環建立 線程池 可是資源未釋放 致使內存溢出。
訪問以後 能夠看出大量建立線程
而且大量threadpoolExecutor的資源沒有被釋放
另外jprofiler 的下載地址:http://www.ej-technologies.com/products/jprofiler/overview.html
以及註冊方式:http://blog.csdn.net/attilax/article/details/17077857
這裏主要是剛接觸的 學習的過程 可是有不少問題還沒搞清 後續實際用到這些知識解決問題 會更新博客