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

0 0
原创粉丝点击