關於jvm分析的指令以及jprofiler的初體驗

介紹:
初步學習了一下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

這裏主要是剛接觸的 學習的過程  可是有不少問題還沒搞清  後續實際用到這些知識解決問題 會更新博客

相關文章
相關標籤/搜索