为什么会内存泄漏和内存溢出?理解这一篇足以闯世界
1个回答
展开全部
java 最牛逼的一个特性就是垃圾回收机制,最为java程序员很幸福,只管new就行了,反正jvm会帮我们回收。
既然jvm自动管理了,那怎么会出现内存泄漏的?难不成他们有BUG?不要着急,听我慢慢道来。
内存溢出:程序在申请内存的时候没有足够内存空间给他。
内存泄漏:jvm给了1024M内存,其中一个对象用了512M内存,但是由于某些程序原因,导致这512M内存一直没有被释放,这就叫内存泄漏。内存泄漏堆积会导致内存溢出的,无论你又多大,迟早会被耗干净的。也就是站着茅坑不拉屎
内存泄漏会导致内存溢出,但是内存溢出不一定是因为内存泄漏。
1.长的生命周期对象引用短的生命周期对象。当短的生命周期结束的时候,依然被引用着不能被回收。
2.静态集合类引起的内存泄漏,因为静态集合的生命周期和JVM一致,所以静态集合不会被回收,他所引用的对象不能被释放。
3.单例模式,他和静态集合导致的内存泄漏原因类似,因为单例模式的生命周期和JVM的生命周期一样长,所以单例对象如果引用外部的对象,那么这个对象也不会被释放。
4.数据连接,JDBC,IO,Socket等,我们在用他们的时候都会在尾加上close,意思就是释放他,否则不会被GC回收。
5.加载数据量过大,这个比较常见,也是容易造成程序直接崩溃的常见原因
既然jvm自动管理了,那怎么会出现内存泄漏的?难不成他们有BUG?不要着急,听我慢慢道来。
内存溢出:程序在申请内存的时候没有足够内存空间给他。
内存泄漏:jvm给了1024M内存,其中一个对象用了512M内存,但是由于某些程序原因,导致这512M内存一直没有被释放,这就叫内存泄漏。内存泄漏堆积会导致内存溢出的,无论你又多大,迟早会被耗干净的。也就是站着茅坑不拉屎
内存泄漏会导致内存溢出,但是内存溢出不一定是因为内存泄漏。
1.长的生命周期对象引用短的生命周期对象。当短的生命周期结束的时候,依然被引用着不能被回收。
2.静态集合类引起的内存泄漏,因为静态集合的生命周期和JVM一致,所以静态集合不会被回收,他所引用的对象不能被释放。
3.单例模式,他和静态集合导致的内存泄漏原因类似,因为单例模式的生命周期和JVM的生命周期一样长,所以单例对象如果引用外部的对象,那么这个对象也不会被释放。
4.数据连接,JDBC,IO,Socket等,我们在用他们的时候都会在尾加上close,意思就是释放他,否则不会被GC回收。
5.加载数据量过大,这个比较常见,也是容易造成程序直接崩溃的常见原因
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询