Jprofiler監控工具(內存泄漏)

 

  • 內存泄漏

    一、測試代碼測試

 

Java代碼   收藏代碼
  1. /** 
  2.  * JProfiler內存監控例子 
  3.  *  
  4.  * @author yhye 
  5.  * @2011-11-9上午09:46:06 
  6.  */  
  7. public class JProfilerMemMain {  
  8.       
  9.     private List<Integer> arr2 = null;  
  10.   
  11.     // 方法執行完後沒法釋放Integer的數據內存  
  12.     public void test2() {  
  13.         arr2 = test();  
  14.     }  
  15.   
  16.     // 方法執行完後釋放Integer的數據內存  
  17.     public List<Integer> test() {  
  18.         List<Integer> arr = new ArrayList<Integer>();  
  19.         for (int i = 0; i < 200000; i++) {  
  20.             arr.add(i * 100);  
  21.         }  
  22.         return arr;  
  23.     }  
  24.   
  25.     public static void main(String[] args) throws IOException {  
  26.         JProfilerMemMain jp = new JProfilerMemMain();  
  27.         for (int i = 1; i <= 10; i++) {  
  28.             jp.test2();  
  29.             // jp.test();  
  30.         }  
  31.         System.out.println("程序執行完畢");  
  32.         // 如下方法爲保持程序處於活動狀態  
  33.         char ch = ' ';  
  34.         while (ch != 'n') {  
  35.             ch = ch;  
  36.         }  
  37.     }  
  38.       

 

 

 

  二、查看步驟  spa

 

    啓動JProfiler,等程序打印出"程序執行完畢" 後查看以下,Integer對象有800264線程

 

    

 

 

   點擊菜單上的按鈕"Run GC" 執行垃圾回收後查看以下,Integer對象還有200270orm

 

 

   說明未徹底釋放數據,查看對象在堆的快照對象


從如下視圖能夠看到該對象的arr2屬性有數據未釋放內存

 

 ①Heap Walker->Biggest Objectsstring


 

②Heap Walker->References,JProfilerMemMain對象自身佔用空間16bytes,引用其餘對象佔空間4288kBit

 

③Heap Walker->Data,中arr2屬性有數據佔用空間io


 

 

  • 死鎖

 

 一、測試代碼class

 

 

Java代碼   收藏代碼
  1. package com.yyh.base.jprofile;  
  2.   
  3. /** 
  4.  * 死鎖例子 
  5.  * @author yhye 
  6.  * @2011-11-8上午09:12:25 
  7.  */  
  8. public class DeadlockMain  implements Runnable {  
  9.     boolean flag;  
  10.     static Object o1 = new Object();  
  11.     static Object o2 = new Object();  
  12.   
  13.     public void run() {  
  14.         System.out.println(flag);  
  15.         if (flag) {  
  16.             synchronized (o1) {  
  17.                 try {  
  18.                     Thread.sleep(500);  
  19.                 } catch (InterruptedException e) {  
  20.                     e.printStackTrace();  
  21.                 }  
  22.                 synchronized (o2) {  
  23.                     System.out.println("AAA");  
  24.                 }  
  25.             }  
  26.   
  27.         } else {  
  28.             synchronized (o2) {  
  29.                 try {  
  30.                     Thread.sleep(500);  
  31.                 } catch (InterruptedException e) {  
  32.                     e.printStackTrace();  
  33.                 }  
  34.                 synchronized (o1) {  
  35.                     System.out.println("BBB");  
  36.                 }  
  37.             }  
  38.   
  39.         }  
  40.   
  41.     }  
  42.       
  43.     public static void main(String[] args) {  
  44.         DeadlockMain aaa = new DeadlockMain();  
  45.         DeadlockMain bbb = new DeadlockMain();  
  46.         aaa.flag = true;  
  47.         bbb.flag = false;  
  48.         Thread thA = new Thread(aaa);  
  49.         thA.setName("線程AAA");  
  50.           
  51.         Thread thB = new Thread(bbb);  
  52.         thB.setName("線程BB");  
  53.           
  54.         thA.start();  
  55.         thB.start();  
  56.     }  
  57. }  

   

 

 二、查看步驟  

 

啓動JProfiler,等程序執行一段時間後查看以下,線程AAA和線程BB出現阻塞

 


 

查看Thread Views-> Thread  Monitor

 

①線程AAA的調用方的類和方法


②線程BB的調用方的類和方法

查看Thread Views-> Thread  Dumps

 

①線程AAA的阻塞的代碼位置

②線程BB的阻塞的代碼位置


相關文章
相關標籤/搜索