Java中内存泄露及垃圾回收机制
来源:互联网 发布:php源代码加密 原理 编辑:程序博客网 时间:2024/05/20 07:14
内存泄漏指由于错误的设计造成程序未能释放已经不再使用的内存,造成资源浪费。
在程序的运行时环境中,java虚拟机提供了一个系统级的垃圾回收(GC,Carbage Collection)线程,它负责回收失去引用的对象占用的内存。当一个对象没有任何引用的时候,Java的自动垃圾回收机制就发挥作用,自动删除这个对象所占用的空间,释放内存以避免内存泄漏。但是内存泄漏并不是就此而完全避免了,当程序员疏忽大意地忘记解除一个对象不应该有的引用的时候,内存泄漏仍然不可避免。
垃圾,内存中的垃圾,即内存中已无效但又无法自动释放的空间。产生垃圾的情况有很多,主要有以下3种:
(1)超出对象的引用句柄的作用域。
(2)没有超出对象的引用句柄的作用域时,给这个引用句柄赋值为空时。
(3)创建匿名对象时,匿名对象用完以后即成垃圾。
垃圾回收器的回收无规律可循。
垃圾回收会给系统资源带来额外的负担和时空开销。
垃圾回收器的回收策略:
(1)复制式回收策略:先将正在运行中的程序暂停,然后把正在被使用的所有对象从它们所在的堆内存A里复制到另一块堆内存B,再释放堆内存A中的所有空间。这种方式需要维护所需内存数量的至少两倍的内存空间,适合垃圾比较多的情况。当程序只产生了少量垃圾或者没有垃圾时,这种回收策略的效率就非常低。
(2)自省式回收策略:首先检测所有正在使用的对象,并为它们标注,比如用1来标注正在使用的对象,用0来标注不再被使用的对象,然后将所有标注为0的内存空间一次释放。因为标注会增大系统的开销,因此这种方式的速度仍然很慢,尤其是在垃圾比较多的情况下,效率会很低。这种方法适合垃圾比较少的情况。
垃圾回收机制不是一个很可靠的机制。Java提供一个System.gc()方法,可以强制启动垃圾回收器来回收垃圾,以减少内存泄露发生的概率。System.gc()有一个特点,就是在对象被当成垃圾从内存中释放前要调用finalize()方法,而且释放一个对象调用一次finalize()方法。
垃圾收集线程的优先级比较低,System.gc()方法只是一种“建议”。
几种方法可以在一定程度上避免Java中的内存泄露。
(1)尽量少用匿名对象,慎用内部类。
(2)在使用System.gc()方法的程序中,尽量少用finalize()方法。
(3)慎用System.gc()方法,减少线程的个数。
参考:http://blog.sina.com.cn/s/blog_538b279a0100098d.html
- Java中内存泄露及垃圾回收机制
- Java中内存泄露及垃圾回收机制
- php垃圾回收机制及内存泄露
- php垃圾回收机制及内存泄露
- JAVA垃圾回收机制与内存泄露
- java垃圾回收机制、内存泄露
- Java垃圾回收机制以及内存泄露
- Java垃圾回收机制以及内存泄露
- java垃圾回收机制和内存泄露
- Java内存模型及垃圾回收机制
- Java内存分配及垃圾回收机制
- JAVA垃圾回收机制与内存泄露问题
- Java垃圾回收机制与内存泄露问题
- JAVA垃圾回收机制与内存泄露问题
- JAVA垃圾回收机制与内存泄露问题
- Java基础之垃圾回收机制以及内存泄露
- AS3垃圾回收及内存泄露处理
- JAVA内存垃圾回收机制
- 一些数学小思维Tips长期更新积累
- 计算字符串最后一个单词的长度,单词以空格隔开。
- 090 Subsets II [Leetcode]
- 树莓派安装TP-link wn725n网卡驱动
- sqlplus无法退格 (backspace)
- Java中内存泄露及垃圾回收机制
- 327 亲和串【kmp】
- Unity优化大全(三)之CPU-Physics
- 向量 规范化
- [leetcode] 16.3Sum Closest
- Android 界面滑动卡顿分析与解决方案(入门)
- Linux下Tomcat+Maven+Jenkins搭建
- 总结对Docker这个东西的想法
- 实现一个小的hover下拉列表_不算完整