转载自html
https://blog.csdn.net/goodlixueyong/article/details/40716779 java
https://blog.csdn.net/vshuang/article/details/39647167android
上面的几个参数是与虚拟机的内存分配相关的,虚拟机的内存分配过程是下面这样的:程序员
1 首先判断一下须要申请的size是否是过大,若是申请的size超过了堆的最大限制,则转入步骤6数据库
2 尝试分配,若是成功则返回,失败则转入步骤3数组
3 判断是否gc正在进行垃圾回收,若是正在进行则等待回收完成以后,尝试分配。若是成功则返回,失败则转入步骤4缓存
4 本身启动gc进行垃圾回收,这里gcForMalloc的参数是false。因此不会回收软引用,回收完成后尝试分配,若是成功则返回,失败则转入步骤5安全
5 调用dvmHeapSourceAllocAndGrow尝试分配,这个函数会扩张堆。因此heap startup的时候能够给一个比较小的初始堆,实在不够用再调用它进行扩张网络
6 进入回收软引用阶段,这里gcForMalloc的参数是ture,因此须要回收软引用。而后调用dvmHeapSourceAllocAndGrow尝试分配,若是失败则抛出OOM。框架
1.静态集合类像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,全部的对象Object也不能被释放,由于他们也将一直被Vector等应用着。
Static Vector v = new Vector(); for (int i = 1; i<100; i++) { Object o = new Object(); v.add(o); o = null; }
在这个例子中,代码栈中存在Vector 对象的引用 v 和 Object 对象的引用 o 。在 For 循环中,咱们不断的生成新的对象,而后将其添加到 Vector 对象中,以后将 o 引用置空。问题是当 o 引用被置空后,若是发生 GC,咱们建立的 Object 对象是否可以被 GC 回收呢?答案是否认的。由于, GC 在跟踪代码栈中的引用时,会发现 v 引用,而继续往下跟踪,就会发现 v 引用指向的内存空间中又存在指向 Object 对象的引用。也就是说尽管o 引用已经被置空,可是 Object 对象仍然存在其余的引用,是能够被访问到的,因此 GC 没法将其释放掉。若是在此循环以后, Object 对象对程序已经没有任何做用,那么咱们就认为此 Java 程序发生了内存泄漏。
2.各类链接,数据库链接,网络链接,IO链接等没有显示调用close关闭,不被GC回收致使内存泄露。
3.监听器的使用,在释放对象的同时没有相应删除监听器的时候也可能致使内存泄露。