Java如何测试内存泄漏
我们知道JVM有自动回收机制,那么我们该怎么去测试程序中发生的内存泄漏呢,那首先是让程序不要运行完,我们可以让其sleep一会儿;
以一个顺序表为例,代码如下:
public class Sequence {private Object[] elem;private int usedSize;private static int FAULT_SIZE=10;public Sequence(){this.elem=new Object[FAULT_SIZE];this.usedSize=0;}private boolean isFull(){return this.usedSize==this.elem.length;}private boolean isEmpty(){return this.usedSize==0;}boolean add(int pos,Object data) {//如果pos<0,或者不连续,则不能插入数据if ( pos < 0 || pos > this.usedSize) {return false;}//扩容,2倍扩容//拷贝数组:System.arraycopy(),本地方法if (isFull()){this.elem=Arrays.copyOf(this.elem,2*this.elem.length);}for (int i=this.usedSize-1;i>=pos;i--){this.elem[i+1]=this.elem[i];}elem[pos]=data;this.usedSize++;return true;}void clear(){for (int i=0;i
这里我们添加了3个Perosn类对象作为测试,首先,不执行clear操作(这是自己写的清空顺序表操作,防止内存泄漏);
测试内存泄漏的步骤如下:
1、在Thread.sleep(1000)处打断点,让程序先不执行结束,运行调试;
2、在cmd窗口下执行jps命令,查看java程序的进程号,可以看到我们的测试的Java程序的进程号为1964;

3、执行jmap -histo:live 1964 > D:log.txt,可以看到,光标一直在闪,没有结束

4、我们点击调试到下一步,可以发现cmd命令执行结束


5、这时,打开D:LOG.TXT文件,可以看到如下界面,我们点击查找,我们这里泄漏的应该是Person对象,输入Person,查找对应的Person,左边显示个数为实例对象个数,也就是我们的泄漏对象个数;如果没找到,说明没有发生该对象的内存泄漏


6、我们将clear()操作放开,再次执行上面步骤,发现这时找不到Person了,也就是说我们的clear操作很好的防止了内存泄漏,检测结束;

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
