您的位置:首页 > 编程语言 > Java开发

Java内存泄漏--程序和内存的关系

2016-05-25 17:40 330 查看
内存泄漏百度百科的定义是:内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。
内存泄漏形象的比喻是“操作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以“内存泄漏”是从操作系统的角度来看的。这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。由程序申请的一块内存,如果没有任何一个指针指向它,那么这块内存就泄漏了。

其实说白了就是该内存空间使用完毕之后未回收,在Java 中即引用没有释放,导致垃圾回收无法进行。我们这里简单回顾下 Java垃圾回收机制:Java语言没有显式的提供分配内存和删除内存的方法,我们所能做的最多也就是将引用对象设置为null或者调用System.gc()(不提倡这种做法)来告诉虚拟机,如果真的有必要的话,就找一个适当的时间,清理掉那些不会再被引用到的对象进而释放掉他们所占用的内存。

许多Java 程序员的认知就是自己的程序不存在内存泄漏问题,虚拟机的垃圾回收机制会搞定它的,甚至有些会人都没有想过程序和内存之间的关系。我们看下面一段代码。







感兴趣的同学可以把上面程序修改一下,随着时间的推移不停的往 List 里面添加对象,你会看到内存会一点一点增长,最终把内存榨干导致程序发生异常终止运行。这只是一个简单的小程序,停止也就到达了演示目的,但如果这是线上运行的项目,造成的损失可就不是一点两点了。而且实际上大多数内存泄漏反映的还是程序的
Bug。正如上面程序所演示的一样,大多数内存泄漏也都是由于没有正确释放掉集合中的引用造成的,在游戏服务器中尤是,因为游戏服务器中使用了很多集合类来做缓存。





当然,我们不能通过服务器是否宕机来判断我们是否发生了内存泄漏。一般来说我们观察服务器内存属性,随着时间推移总是增高的(某些特殊业务除外),那么我们就有理由查看一下内存信息了,如果有实例的数量(或者所占用的内存大小)远远超出我们的预期,就意味着我们得好好审视下我们得程序看看是否存在内存泄漏问题。JDK
有提供相应的关于内存信息的命令(jps,jmap)和查找内存泄漏的工具(jvisual VM)给我们,关于这些命令和工具的使用方法和技巧将在下一章《Java内存泄漏--如何定位内存泄漏》教给大家。

代码附件:http://download.csdn.net/detail/sinat_25141403/9531113
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: