java的内存泄露是如何发生的,如何避免和发现?
2014-11-21 16:57
309 查看
java的垃圾回收与内存泄露的关系:【新手可忽略不影响继续学习】
马克-to-win:上一节讲了,(i)对象被置成null.(ii)局部对象(无需置成null)当程序运行到右大括号.(iii)匿名对象刚用完,垃圾回收线程就早早晚晚都能把它过去占的内存给回收了。这么说,java中难道就没有c++的内存泄露的问题了吗?(内存泄露的定义就是:咱自己程序不用的内存,系统本应回收但由于各种原因却没有回收成功)马克-to-win:答案:错,java中有内存泄露。下面我们就通过一个例子来说明。下面的例子中,Mark_to_win m作为实例是占有内存空间的。即使后来m=null;把它置为null,垃圾回收线程也回收不了它占有的空间。因为等我们后面集合框架学习了Vector以后,你就会知道:Vectorv是一个类似数组的东西。马克-to-win:任何通过v.add(m);加到Vector里的东西,Vector都会保留一个对它的引用。正因为有这个引用,垃圾回收系统当中的有向图会认为,这个对象还是可达的,所以不会回收它的内存空间。因为size_Make_to_win非常大,(是maxMemory的0.8倍),所以系统最后就崩溃了。马克-to-win:用专业术语讲,就是开始时是内存泄漏,泄露多了就造成内存溢出了,所以就曝出OutOfMemoryError的错误了。
例2.1.5
import java.util.Vector;
class Mark_to_win {
long data;
}
public class Test {
static Vector v = new Vector(10);
public static void main(String[] args) throws InterruptedException{
int size_Make_to_win = (int) (Runtime.getRuntime().maxMemory() *0.8);
for (int i = 1; i < size_Make_to_win; i++) {
Mark_to_win m = new Mark_to_win();
v.add(m);
。。。。。。。。。。。。。。。。。
详情请进:http://www.mark-to-win.com/JavaBeginner/JavaBeginner3_web.html#MemoryLeak
马克-to-win:上一节讲了,(i)对象被置成null.(ii)局部对象(无需置成null)当程序运行到右大括号.(iii)匿名对象刚用完,垃圾回收线程就早早晚晚都能把它过去占的内存给回收了。这么说,java中难道就没有c++的内存泄露的问题了吗?(内存泄露的定义就是:咱自己程序不用的内存,系统本应回收但由于各种原因却没有回收成功)马克-to-win:答案:错,java中有内存泄露。下面我们就通过一个例子来说明。下面的例子中,Mark_to_win m作为实例是占有内存空间的。即使后来m=null;把它置为null,垃圾回收线程也回收不了它占有的空间。因为等我们后面集合框架学习了Vector以后,你就会知道:Vectorv是一个类似数组的东西。马克-to-win:任何通过v.add(m);加到Vector里的东西,Vector都会保留一个对它的引用。正因为有这个引用,垃圾回收系统当中的有向图会认为,这个对象还是可达的,所以不会回收它的内存空间。因为size_Make_to_win非常大,(是maxMemory的0.8倍),所以系统最后就崩溃了。马克-to-win:用专业术语讲,就是开始时是内存泄漏,泄露多了就造成内存溢出了,所以就曝出OutOfMemoryError的错误了。
例2.1.5
import java.util.Vector;
class Mark_to_win {
long data;
}
public class Test {
static Vector v = new Vector(10);
public static void main(String[] args) throws InterruptedException{
int size_Make_to_win = (int) (Runtime.getRuntime().maxMemory() *0.8);
for (int i = 1; i < size_Make_to_win; i++) {
Mark_to_win m = new Mark_to_win();
v.add(m);
。。。。。。。。。。。。。。。。。
详情请进:http://www.mark-to-win.com/JavaBeginner/JavaBeginner3_web.html#MemoryLeak
相关文章推荐
- Java学习疑点(5)--使用多线程的时候如何注意避免死锁发生?
- 如何避免在Java中使用Checked Exception
- 如何在IBM JDK 1.4.2的环境中避免Java堆空间的碎片问题
- 如何在你的C/C++代码中避免、发现(修复)内存错误
- java中,“避免出现空指针”和“如何快速定位空指针”
- 【转】JAVA读写文件,如何避免中文乱码
- 如何避免Java程序的数据脏读问题?
- 如何在Java中避免equals方法的隐藏陷阱
- 如何在C/C++代码中避免,发现(以及修复)内存错误
- 【转】如何在Java中避免equals方法的隐藏陷阱
- androi开发中,如何避免内存泄露
- 如何避免Java程序的数据脏读问题?
- 如何在Java中避免equals方法的隐藏陷阱
- 如何在Java中避免equals方法的隐藏陷阱
- 在编写PL/SQL代码中使用SELECT语句时如何避免例外发生
- 如何避免 WebSphere Application Server 总是自动产生heapdumps和javacores
- 编写多线程的 Java 应用程序 如何避免当前编程中最常见的问题
- 编写多线程的Java应用程序-如何避免当前编程中最常见的问题
- Java在编写文件下载的代码中如何避免文件名乱码情况
- 如何在.net应用中发现和避免内存和资源泄露