浅谈Java编程中的内存泄露情况
必须先要了解的 Java内存泄露情况 outOfMemoryError:java heap space 2、方法区内存溢出(outOfMemoryError:permgem space) outOfMemoryError:permgem space 3、线程栈溢出(java。lang。StackOverflowError) java。lang。StackOverflowError 内存泄露的几种场景:
public class Stack { private Object[] elements=new Object[10]; private int size = 0; public void push(Object e){ ensureCapacity(); elements[size++] = e; } public Object pop(){ if( size == 0) throw new EmptyStackException(); return elements[--size]; } private void ensureCapacity(){ if(elements。length == size){ Object[] oldElements = elements; elements = new Object[2 * elements。length+1]; System。arraycopy(oldElements,elements,size); } } } 上面的原理应该很简单,假如堆栈加了10个元素,然后全部弹出来,虽然堆栈 但是就是存在这样的东西也不一定会导致什么样的后果,如果这个堆栈用的比较少, public class Bad{ public static Stack s=Stack(); static{ s。push(new Object()); s。pop(); //这里有一个对象发生内存泄露 s。push(new Object()); //上面的对象可以被回收了,等于是自愈了 } }
public class NotTooBad{ public void doSomething(){ Stack s=new Stack(); s。push(new Object()); //other code s。pop();//这里同样导致对象无法回收,内存泄露。 }//退出方法,s自动无效,s可以被回收,Stack内部的引用自然没了,所以 //这里也可以自愈,而且可以说这个方法不存在内存泄露问题,不过是晚一点 //交给GC而已,因为它是封闭的,对外不开放,可以说上面的代码99。9999%的 //情况是不会造成任何影响的,当然你写这样的代码不会有什么坏的影响,但是 //绝对可以说是垃圾代码!没有矛盾吧,我在里面加一个空的for循环也不会有 //什么太大的影响吧,你会这么做吗? } 为了避免内存泄露,在编写代码的过程中可以参考下面的建议: (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – 有没有办法将.ICO文件解码为大于16×16的分辨率?
- java自带的MessageDigest实现文本的md5加密算法
- Java编程枚举类实战代码分享
- java.lang.ClassNotFoundException:org.apache.commons.la
- java – 如何为包中的所有类共用一个常量变量?
- java – 基于知识库/规则的推理引擎可以选择实时的Runway入
- 将ImageView中的图片保存到本地相册
- java – Mockito:如何测试构造函数被调用?
- java-是否有一种简单的方法来使Apache Tomcat在部署后自动重
- java – 无法从静态上下文引用非静态字段 – 主方法