内存溢出与内存泄漏的区别
内存溢出:
是指程序在申请内存时,没有足够的内存空间供其使用。简单的来说程序本来需要1G内存空间来运行,但是电脑只有600兆的内存了。程序申请内存空间时候不够用了。
内存泄漏:
是指程序在申请内存后,无法释放已经申请到的内存。一次内存泄露可以忽略,但是内存泄漏堆积后果很严重,无论多少内存,迟早会被占光。
注:大家都知道java有自动的垃圾回收机制,解决了c语言程序员最头疼的问题。但是逻辑错误这些内存是无法回收的,最终也会导致内存溢出。
内存溢出的方式比较多。但是内存泄漏可以分为四种
- 常发性内存泄漏 发生内存泄漏的代码会被多次执行到,每次被执行都会导致内存泄漏
- 偶发性内存泄漏 发生内存泄露的代码只有在特定的环境下才会发生,它和常
- 一次性内存泄漏 发生内存泄漏的代码指挥被执行一次,或者由于算法的缺陷导致总会有一块仅且一块内存发生泄漏。
- 隐式内存泄漏 程序在运行时不停的分配内存,但是知道结束的时候才释放内存。严格的说这个不算是内存泄漏,但是程序运行时间比较长不释放会导致内存耗尽。
总结:
内存泄漏大多数是因为程序的逻辑不严谨,但是又可以跑通顺,然后导致的。内存溢出是不会报错。如果不看日志是不会发现的。但是一但内存泄漏最终程序都会挂掉。
有了内存泄漏才会有垃圾回收机制
垃圾回收是java语言的核心技术,在java中程序员不用关系内存的动态分配和垃圾回收的问题把这一切的工作都交给JVM来处理。
一般情况java会自动回收,程序员也可以手动释放内存但是自己手动释放垃圾,不一定会去释放垃圾必须等JVM判定为垃圾才可以释放
什么是自动垃圾收集机制
自动垃圾收集机制是查看堆内存,区分在使用的对象和未使用的对象。然后删除未使用的对象的一个过程。对于适用对象或者引用对象,值的是你程序持有一个指向那个对象的引用。对于未使用的对象或者无引用的对象,则不被你程序的任何部分持有引用。所以无引用对象使用的内存是可以被重新收回利用的。
在c语言中内存分配回收都是手动的,在java中内存的回收是由垃圾回收器自动处理的。
静态对象什么时候变成垃圾被回收
在说垃圾回收前,先说一个题外话,我上面所说的垃圾对象,其实是指一般的对象,因为静态对象有些不同.
我经常听人说:静态方法随着类的加载而加载,随着类的消失而消失.但是,现在在我看来,这种说法是有问题的.
因为,静态对象要成为垃圾被回收,要满足三个条件: - 这个类的对象变成了垃圾
- 加载这个类的类加载器变成了垃圾
- 关于这个对象的class对象也变成了垃圾
只有满足这三个条件,静态对象才会变成垃圾被回收,要不然静态对象会一直存在于永久带中.
本文总结:这里是在别人论坛的基础上加上自己的理解。希望大家看到哪里有不对的地方请及时的批评指正,谢谢!
Eva love