`

Java的垃圾回收(Garbage Collection)机制

阅读更多

一.谁在做 Garbage Collection <!----> <o:p> </o:p>

       一种流行的说法:在 C++ 里,是系统在做垃圾回收;而在 Java 里,是 Java 自身在做。

C++ 里,释放内存是手动处理的,要用 delete 运算符来释放分配的内存。这是流行的说法。确切地说,是应用认为不需要某实体时,就需用 delete 告诉系统,可以回收这块空间了。这个要求,对编码者来说,是件很麻烦、很难做到的事。随便上哪个 BBS ,在 C/C++ 版块里总是有一大堆关于内存泄漏的话题。

Java 采用一种不同的,很方便的方法: Garbage Collection 。垃圾回收机制放在 JVM 里。 JVM 完全负责垃圾回收事宜,应用只在需要时申请空间,而在抛弃对象时不必关心空间回收问题。

二.对象在啥时被丢弃? <o:p> </o:p>

       C++ 里,当对象离开其作用域时,该对象即被应用抛弃。

是对象的生命期不再与其作用域有关,而仅仅与引用有关。

       Java 的垃圾回收机制一般包含近十种算法。对这些算法中的多数,我们不必予以关心。只有其中最简单的一个:引用计数法,与编码有关。

       一个对象,可以有一个或多个引用变量指向它。当一个对象不再有任何一个引用变量指向它时,这个对象就被应用抛弃了。或者说,这个对象可以被垃圾回收机制回收了。

这就是说,当不存在对某对象的任何引用时,就意味着,应用告诉 JVM :我不要这个对象,你可以回收了。

JVM 的垃圾回收机制对堆空间做实时检测。当发现某对象的引用计数为 0 时,就将该对象列入待回收列表中。但是,并不是马上予以销毁。

三.丢弃就被回收? <o:p> </o:p>

该对象被认定为没有存在的必要了,那么它所占用的内存就可以被释放。被回收的内存可以用于后续的再分配。

但是,并不是对象被抛弃后当即被回收的。 JVM 进程做空间回收有较大的系统开销。如果每当某应用进程丢弃一个对象,就立即回收它的空间,势必会使整个系统的运转效率非常低下。

前面说过, JVM 的垃圾回收机制有多个算法。除了引用计数法是用来判断对象是否已被抛弃外,其它算法是用来确定何时及如何做回收。 JVM 的垃圾回收机制要在时间和空间之间做个平衡。

因此,为了提高系统效率,垃圾回收器通常只在满足两个条件时才运行:即有对象要回收且系统需要回收。切记垃圾回收要占用时间,因此, Java 运行时系统只在需要的时候才使用它。因此你无法知道垃圾回收发生的精确时间。

四.没有引用变量指向的对象有用吗? <o:p> </o:p>

       前面说了,没挂上引用变量的对象是被应用丢弃的,这意味着,它在堆空间里是个垃圾,随时可能被 JVM 回收。

不过,这里有个不是例外的例外。对于一次性使用的对象(有些书称之为临时对象),可以不用引用变量指向它。举个最简单也最常见的例子:

System.out.println(“I am Java!”);

就是创建了一个字符串对象后,直接传递给 println() 方法。

五.应用能干预垃圾回收吗? <o:p> </o:p>

       许多人对 Java 的垃圾回收不放心,希望在应用代码里控制 JVM 的垃圾回收运作。这是不可能的事。对垃圾回收机制来说,应用只有两个途径发消息给 JVM 。第一个前面已经说了,就是将指向某对象的所有引用变量全部移走。这就相当于向 JVM 发了一个消息:这个对象不要了。第二个是调用库方法 System.gc() ,多数书里说调用它让 Java 做垃圾回收。

       第一个是一个告知,而调用 System.gc() 也仅仅是一个请求。 JVM 接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作容易发生,或提早发生,或回收较多而已。

       希望 JVM 及时回收垃圾,是一种需求。其实,还有相反的一种需要:在某段时间内最好不要回收垃圾。要求运行速度最快的实时系统,特别是嵌入式系统,往往希望如此。

       Java 的垃圾回收机制是为所有 Java 应用进程服务的,而不是为某个特定的进程服务的。因此,任何一个进程都不能命令垃圾回收机制做什么、怎么做或做多少。

六.对象被回收时要做的事 <o:p> </o:p>

一个对象在运行时,可能会有一些东西与其关连。因此,当对象即将被销毁时,有时需要做一些善后工作。可以把这些操作写在 finalize() 方法(常称之为终止器)里。

protected void finalize()

{

  // finalization code here

}

这个终止器的用途类似于 C++ 里的析构函数,而且都是自动调用的。但是,两者的调用时机不一样,使两者的表现行为有重大区别。 C++ 的析构函数总是当对象离开作用域时被调用。这就是说, C++ 析构函数的调用时机是确定的,且是可被应用判知的。但是, Java 终止器却是在对象被销毁时。由上所知,被丢弃的对象何时被销毁,应用是无法获知的。而且,对于大多数场合,被丢弃对象在应用终止后仍未销毁。

在编码时,考虑到这一点。譬如,某对象在运作时打开了某个文件,在对象被丢弃时不关闭它,而是把文件关闭语句写在终止器里。这样做对文件操作会造成问题。如果文件是独占打开的,则其它对象将无法访问这个文件。如果文件是共享打开的,则另一访问该文件的对象直至应用终结仍不能读到被丢弃对象写入该文件的新内容。

至少对于文件操作,编码者应认清 Java 终止器与 C++ 析构函数之间的差异。

那么,当应用终止,会不会执行应用中的所有 finalize() 呢?据 Bruce Eckel Thinking in Java 里的观点:“到程序结束的时候,并非所有收尾模块都会得到调用”。这还仅仅是指应用正常终止的场合,非正常终止呢?

因此,哪些收尾操作可以放在 finalize() 里,是需要酌酎的。 

来源:http://dev.csdn.net/author/beepbug/cfda04d9dd5a4409a433f793135e1b8b.html
分享到:
评论

相关推荐

    Java Garbage Collection Study java 垃圾回收学习

    Java Garbage Collection Study java 垃圾回收学习

    JAVA垃圾回收机制

    垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再...

    细述 Java垃圾回收机制→How Java Garbage Collection Works- - Android 1

    细述 Java垃圾回收机制→How Java Garbage Collection Works- - Android 1

    java 垃圾回收 机制详解

    说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物。经过半个世纪的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去...

    细述 Java垃圾回收机制→Java Garbage Collection Introduction - Android 1

    各种类型的Java垃圾回收器Java垃圾回收的监控和分析本文是这个系列的第一篇文章,这篇文章将会介绍一些基本术语,如:JDK,JVM,JRE,HotSpot V

    详细介绍Java垃圾回收机制

    垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再...

    细述 Java垃圾回收机制→Java Garbage Collection Monitoring and Analysis1

    Java VisualVM可以用来 - 生成和分析堆内存的dump - 观察和操作MBeans - 监控垃圾回收 - 内存和CPU性能分析jvisualvm已经

    Java垃圾回收知识,垃圾回收资料

    在Java面试中,垃圾回收(Garbage Collection)是一个非常重要的话题。下面是一份面试分析,以及垃圾回收在面试中的占比和重要性。 面试分析: 知识点覆盖范围:垃圾回收算法、垃圾收集器、GC原理、垃圾回收的优...

    java垃圾回收知识全集

    Java 垃圾回收(Garbage Collection,简称 GC)是现代编程语言中的重要特性,为开发人员提供了自动化内存管理的能力。它通过自动识别和回收不再使用的内存,减轻了程序员手动释放内存的负担,提高了应用程序的稳定性...

    The Garbage Collection Handbook(垃圾回收器手册).7z

    The Garbage Collection Handbook 关于垃圾回收器算法的书籍,非常不错

    Plumbr Handbook Java Garbage Collection-2015-英文版.pdf

    Java 垃圾回收经典手册,讲得特别清楚,非常推荐!

    jvm垃圾回收思维导图

    圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。该思维导图完整的描述了垃圾回收的各个关键点

    Understanding Java Garbage Collection

    Java垃圾回收机制的工作原理,不同JVM使用的GC算法分析

    The-Java-Garbage-Collection-Mini-book.zip

    InfoQ的关于JVM GC的学习资料,对于深入学习JVM的GC机制很有帮助

    Java Garbage Collection 与各种GC算法.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    Java垃圾回收机制

    说到垃圾回收(Garbage Collection,GC),很多人会自然而然地把它和Java联系起来。在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理。顾名思义,垃圾回收是释放垃圾占用的空间...

    Garbage Collection

    深入讲述Java关于垃圾回收的机制,图文并茂,附有代码说明,帮助熟悉Java细节。

    Java垃圾回收调优实战

    这些目标包括延迟、吞吐量和容量,想要了解更多,我推荐看看垃圾回收手册(Garbage Collection Handbook)中相应的章节。让我们看看在实践中如何设定并达到这样的调优目标。为了这个目的,让我们来看一个示例代码: ...

    Java 垃圾回收机制概念梳理

    本文摘自我们几周后即将出版的Garbage Collection Handbook一书的样章。同时也让你能熟悉下垃圾回收的基础知识——这选自该书的第一章。  乍一看,垃圾回收所做的事情应当恰如其名——查找并清除垃圾。事实上却...

Global site tag (gtag.js) - Google Analytics