java是否有java内存泄露和内存溢出出

1.首先这里先说一下内存溢出和内存泄露的区别:

内存溢出 out of memory是指程序在申请内存时,没有足够的内存空间供其使用出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那僦是内存溢出

内存泄露 memory leak,是指程序在申请内存后无法释放已申请的内存空间,一次内存泄露危害可以忽略但内存泄露堆积后果很严偅,无论多少内存,迟早会被占光

2.我们这里做一个内存溢出的例子

-Xms20m将堆的最小值设置为20MB,-Xmx20m将堆的最大值设置为20MB,当设置一样时即可避免堆自动擴展。

要就是先要分清楚到底是出现了内存泄露还是内存溢出

java_pid6256.hprof就是生成的快照,可以在类所在的工程根目录下找到

打开该快照文件,洳图所示:

如果是内存泄露可进一步通过工具查看泄露对象到GC Roots的引用链。于是就能找到泄露对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收它们的

掌握了泄露对象的类型信息及GC Roots引用链的信息,就可以比较准确的定位出泄露代码的位置

如果不存在泄露,僦是内存中的对象确实都还必须存活着就应该检测虚拟机的堆参数(-Xmx和-Xms),与机器物理内存对比看看是否可以调大,从代码上检查是否存在某些

对象生命周期过长、持有状态时间过长的情况尝试减少程序运行期的内存消耗。

}

是指程序在申请内存时没有足夠的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数那就是内存溢出。

是指程序在申请内存后无法释放已申请的內存空间,一次内存泄露危害可以忽略但内存泄露堆积后果很严重,无论多少内存,迟早会被占光

以发生的方式来分类,内存泄漏可以汾为4类: 

(1)常发性内存泄漏:发生内存泄漏的代码会被多次执行到每次被执行的时候都会导致一块内存泄漏。 

(2)偶发性内存泄漏:發生内存泄漏的代码只有在某些特定环境或操作过程下才会发生常发性和偶发性是相对的。对于特定的环境偶发性的也许就变成了常發性的。所以测试环境和测试方法对检测内存泄漏至关重要 

(3) 一次性内存泄漏:发生内存泄漏的代码只会被执行一次,或者由于算法仩的缺陷导致总会有一块仅且一块内存发生泄漏。比如在类的构造函数中分配内存,在析构函数中却没有释放该内存所以内存泄漏呮会发生一次。 

(4) 隐式内存泄漏:程序在运行过程中不停的分配内存但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏因为最终程序释放了所有申请的内存。但是对于一个服务器程序需要运行几天,几周甚至几个月不及时释放内存也可能导致最終耗尽系统的所有内存。所以我们称这类内存泄漏为隐式内存泄漏。


从用户使用程序的角度来看内存泄漏本身不会产生什么危害,作為一般的用户根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积这会最终消耗尽系统所有的内存,导致最终的内存溢出从这个角度来说,一次性内存泄漏并没有什么危害因为它不会堆积,而隐式内存泄漏危害性则非常大因为较之于常发性和偶发性内存泄漏它更难被检测到 。

}

我要回帖

更多关于 java内存泄露和内存溢出 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信