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
内存泄漏形象的比喻是“操作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以“内存泄漏”是从操作系统的角度来看的。这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。由程序申请的一块内存,如果没有任何一个指针指向它,那么这块内存就泄漏了。
其实说白了就是该内存空间使用完毕之后未回收,在Java 中即引用没有释放,导致垃圾回收无法进行。我们这里简单回顾下 Java垃圾回收机制:Java语言没有显式的提供分配内存和删除内存的方法,我们所能做的最多也就是将引用对象设置为null或者调用System.gc()(不提倡这种做法)来告诉虚拟机,如果真的有必要的话,就找一个适当的时间,清理掉那些不会再被引用到的对象进而释放掉他们所占用的内存。
许多Java 程序员的认知就是自己的程序不存在内存泄漏问题,虚拟机的垃圾回收机制会搞定它的,甚至有些会人都没有想过程序和内存之间的关系。我们看下面一段代码。
感兴趣的同学可以把上面程序修改一下,随着时间的推移不停的往 List 里面添加对象,你会看到内存会一点一点增长,最终把内存榨干导致程序发生异常终止运行。这只是一个简单的小程序,停止也就到达了演示目的,但如果这是线上运行的项目,造成的损失可就不是一点两点了。而且实际上大多数内存泄漏反映的还是程序的
Bug。正如上面程序所演示的一样,大多数内存泄漏也都是由于没有正确释放掉集合中的引用造成的,在游戏服务器中尤是,因为游戏服务器中使用了很多集合类来做缓存。
当然,我们不能通过服务器是否宕机来判断我们是否发生了内存泄漏。一般来说我们观察服务器内存属性,随着时间推移总是增高的(某些特殊业务除外),那么我们就有理由查看一下内存信息了,如果有实例的数量(或者所占用的内存大小)远远超出我们的预期,就意味着我们得好好审视下我们得程序看看是否存在内存泄漏问题。JDK
有提供相应的关于内存信息的命令(jps,jmap)和查找内存泄漏的工具(jvisual VM)给我们,关于这些命令和工具的使用方法和技巧将在下一章《Java内存泄漏--如何定位内存泄漏》教给大家。
代码附件:http://download.csdn.net/detail/sinat_25141403/9531113
相关文章推荐
- ROC曲线判别线性回归,java实现。
- JAVA多线程(五)用lock、synchronized、阻塞队列三种方法实现生产者消费者模式
- 大力推荐的超牛GitHub top 100的Java开源库
- 关于this关键字的用法
- javaIOzongji
- JAVA 三大GC(java6.0)
- Spring下jdbcTemplate增删改查总结
- java设计模式-工厂方法模式
- 二分法查找-Java
- 关于Ubuntu中java的安装
- Java 多态的扩展示例 数据库操作
- 修改eclipse android 默认debug 签名
- SpringMVC_HelloWorld
- JavaEE系列学习1.1-软件工程开发思想之解耦
- 将java源码打成jar包
- Java实现选择排序、插入排序、希尔排序算法
- JSP+Servlet制作Java Web登录功能的全流程解析
- 彻底理解Java中this 关键字
- zookeeper基本讲解(Java版,真心不错)
- javamail发送邮件的简单实例