内存泄漏
1、测试代码
Java代码 /***JProfiler内存监控例子**@authoryhye*@-11-9上午09:46:06*/publicclassJProfilerMemMain{privateList<Integer>arr2=null;//方法执行完后无法释放Integer的数据内存publicvoidtest2(){arr2=test();}//方法执行完后释放Integer的数据内存publicList<Integer>test(){List<Integer>arr=newArrayList<Integer>();for(inti=0;i<200000;i++){arr.add(i*100);}returnarr;}publicstaticvoidmain(String[]args)throwsIOException{JProfilerMemMainjp=newJProfilerMemMain();for(inti=1;i<=10;i++){jp.test2();//jp.test();}System.out.println("程序执行完毕");//以下方法为保持程序处于活动状态charch='';while(ch!='n'){ch=ch;}}
2、查看步骤
启动JProfiler,等程序打印出"程序执行完毕" 后查看如下,Integer对象有800264个
点击菜单上的按钮"Run GC" 执行垃圾回收后查看如下,Integer对象还有200270个
说明未完全释放数据,查看对象在堆的快照
从以下视图可以看到该对象的arr2属性有数据未释放
①Heap Walker->Biggest Objects
②Heap Walker->References,JProfilerMemMain对象自身占用空间16bytes,引用其他对象占空间4288kB
③Heap Walker->Data,中arr2属性有数据占用空间
死锁
1、测试代码
Java代码 packagecom.yyh.base.jprofile;/***死锁例子*@authoryhye*@-11-8上午09:12:25*/publicclassDeadlockMainimplementsRunnable{booleanflag;staticObjecto1=newObject();staticObjecto2=newObject();publicvoidrun(){System.out.println(flag);if(flag){synchronized(o1){try{Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}synchronized(o2){System.out.println("AAA");}}}else{synchronized(o2){try{Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}synchronized(o1){System.out.println("BBB");}}}}publicstaticvoidmain(String[]args){DeadlockMainaaa=newDeadlockMain();DeadlockMainbbb=newDeadlockMain();aaa.flag=true;bbb.flag=false;ThreadthA=newThread(aaa);thA.setName("线程AAA");ThreadthB=newThread(bbb);thB.setName("线程BB");thA.start();thB.start();}}
2、查看步骤
启动JProfiler,等程序执行一段时间后查看如下,线程AAA和线程BB出现阻塞
查看Thread Views-> Thread Monitor
①线程AAA的调用方的类和方法
②线程BB的调用方的类和方法
查看ThreadViews-> Thread Dumps
①线程AAA的阻塞的代码位置
②线程BB的阻塞的代码位置