Java的内存泄漏和垃圾回收机制
2015-12-21 19:14
357 查看
JAVA会产生内存泄露吗?首先,答案是肯定的。
Java尽管有垃圾回收器,但依旧存在泄漏。
Java内存泄漏跟C/C++内存泄漏的概念不一样:C/C++的内存泄漏是指Malloc了一些资源。最后没有free掉,内存没有回收,这个是真正意义上的内存黑洞;而Java的泄漏指,Java对象的存在对程序已经没有意义,可是对象在程序周期内一直存在。这个可能会导致Java的内存泄漏。
总结原因,大概有以下几个方面:
(1)Java的某个对象被一个生命周期非常长的类不当持有,这个是Java内存泄漏最基本的原因,对象在某个Task中没有主动清除。其宿主在工作时会不断添加该对象的引用数,也就会吃掉很多其它的内存,从而导致内存泄漏;当程序猿疏忽大意地忘记解除一个对象不应该有的引用的时候。内存泄漏仍然不可避免.
(2)在Runtime Exception的时候。没实用finally{}来释放某些资源;
(3)变量范围的扩大,比方说一个方法的局部变量被定义成类的变量,这样导致变量的生命期变长。有可能导致泄漏(这个和第一点还是有点像的)。
Java尽管有垃圾回收器,但依旧存在泄漏。
Java内存泄漏跟C/C++内存泄漏的概念不一样:C/C++的内存泄漏是指Malloc了一些资源。最后没有free掉,内存没有回收,这个是真正意义上的内存黑洞;而Java的泄漏指,Java对象的存在对程序已经没有意义,可是对象在程序周期内一直存在。这个可能会导致Java的内存泄漏。
总结原因,大概有以下几个方面:
(1)Java的某个对象被一个生命周期非常长的类不当持有,这个是Java内存泄漏最基本的原因,对象在某个Task中没有主动清除。其宿主在工作时会不断添加该对象的引用数,也就会吃掉很多其它的内存,从而导致内存泄漏;当程序猿疏忽大意地忘记解除一个对象不应该有的引用的时候。内存泄漏仍然不可避免.
(2)在Runtime Exception的时候。没实用finally{}来释放某些资源;
(3)变量范围的扩大,比方说一个方法的局部变量被定义成类的变量,这样导致变量的生命期变长。有可能导致泄漏(这个和第一点还是有点像的)。
相关文章推荐
- 20151221留言本程序------struts2和Hibernate的应用总结
- Iterator错误:java.util.NoSuchElementException
- JAVA同步容器使用心得
- JAVA timer的基本知识
- java设计模式--六大设计原则
- Java开发配置虚拟主机即更改我的项目域名
- Spring基础学习总结
- Log4j 配置最全说明
- 贝叶斯算法Java实现
- jar文件在无java环境的机器上运行
- spring的长处 ioc aop
- 关于spring框架中的注解驱动
- Java图形化界面设计——布局管理器之GridLayout(网格布局)
- Java图形化界面设计——布局管理器之BorderLayout(边界布局)
- Java图形化界面设计——布局管理器之FlowLayout(流式布局)
- java中利用泛型构建的collection集合
- Java图形化界面设计——中间容器(Jpanel)
- Java图形化界面设计——容器(JFrame)
- Eclipse之设置字体大小
- myeclipse激活码生成器+代码自动提醒