简单谈谈Java垃圾回收

好久没看关于java的书了,最近,看了James Gosling的<<Java程序设计语言>>,做了一些读书笔记。这部分是关于垃圾回收的。

一. 垃圾回收

对象是使用new创建的,但是并没有与之相对应的delete操作来回收对象占用的内存。当我们完成对某个对象的使用时,只需停止该对象的引用:

->将引用改变为指向其他对象
->将引用指向null
->从方法中返回, 使得该方法的局部变量不复存在

要点:

->当我们从任何可执行代码都无法到达某个对象时,它所占用的空间就可以被回收。
->垃圾回收意味着我们永远不用担心出现虚悬引用(dangling reference)。虚悬引用,指得是引用已经被删除的内存空间。在那些程序员可以直接控制何时删除对象的系统中,会存在这样的问题。
->垃圾回收器模型:引用计数器法(不能解决循环引用),标记-清除(mark-and-sweep)。

二. 总结

finalize方法

->在垃圾回收器确定该对象是不可达的且该对象的空间将被回收之后,垃圾回收器就会调用这个方法。
->这个方法可以清除该对象所使用的所有非内存资源,对每一个对象最多只能调用一次,即使在这个方法的执行使得该对象重新变为可达之后又马上会再次变为不可达的情况下,该方法也只能调用一次。
->finalize方法可以在任何特定的时间段内被调用,它也可能永远不会被调用(java虚拟机结束)。

覆写finalize方法

->当一个对象变成垃圾时,它所引用的其他对象也很有可能会变成垃圾。这些垃圾可能在调用我们编写的finalize方法之前就已经被终结了,因此它们可能处于不可预知的状态。
->覆写finalize方法是,加上super.finalize方法。最好加在finally字句里面。保证其超类中声明的部分内容也可以被终结。

三. 与垃圾回收器交互的相关类和方法

类:Runtime.getRuntime(), System
方法:gc(), runFinalization(), freeMemory(), totalMemory(), maxMemory()
System类支持静态的gc()和runFinalization()方法,它们将调用当前Runtime对象上的相应方法。

四. 可达性状态和引用对象

对象只有在没有任何引用指定它的时候才可以被当作垃圾回收,但有时我们可能希望在仍旧有选定引用指向对象时,将该对象作为垃圾回收掉。

引用对象的唯一用途就是维护对另一个被称为指称物(referent)的对象的引用。通常我们通过字段或者局部变量来维护对对象的引用,但是现在我们可以维护对引用对象的直接引用,而该引用对象包装了我们实际需要的对象。垃圾回收器可能判断出对某个对象的残留引用是否都是经由引用对象面引用到该对象的,因此它可以决定是否要回收该对象。引用对象的强度将决定垃圾回收器的行为,普通的引用都是强度最大的引用。

Reference类

->包:java.lang.ref
->典型方法: get(), clear(), enqueue(), isEnqueued()

引用和可达性强度

->对象是强可达的(strongly reachable):普通的引用
->对象是软可达的(softly reachable):SoftReference
->对象是弱可达的(weakly reachable):WeakReference
->对象是虚可达的(phantom reachable):PhantomReference
->对象是不可达的:没有引用链接
一旦对象变为弱可达的(或者列弱),它就可以被终结。如果在终结之后该对象是不可达的,那么它就可以被回收了。

对象可达性阶段会触发垃圾回收器对相关的引用对象类型做出适当的行为:

->软可达对象可能会任凭垃圾回收器去回收。我们可确定的是所有对软可达对象的SoftReference都会在抛出outofMemoryError错误这前被清除。
->弱可达对象将会被垃圾回收器回收。
->虚可达对象并不是真正意义上的可达,因为无法通过PhantomReference访问其指称对象,其get方法总是返回null。但是虚引用的存在可以防止对象在显式清除虚引用之前被回收。虚引用使我们可以处理那些finalize方法已经被调用过的对象,从而可以安全地认为它们是"死"的。

(0)

相关推荐

  • 关于Java垃圾回收开销降低的几条建议

    保持GC低开销的窍门有哪些? 随着一再拖延而即将发布的 Java9,G1("Garbage First")垃圾回收器将被成为 HotSpot 虚拟机默认的垃圾回收器.从 serial 垃圾回收器到CMS 收集器, JVM 见证了许多 GC 实现,而 G1 将成为其下一代垃圾回收器. 随着垃圾收集器的发展,每一代 GC 与其上一代相比,都带来了巨大的进步和改善.parallel GC 与 serial GC 相比,它让垃圾收集器以多线程的方式工作,充分利用了多核计算机的计算能力.CMS(

  • 浅析Java内存模型与垃圾回收

    1.Java内存模型 Java虚拟机在执行程序时把它管理的内存分为若干数据区域,这些数据区域分布情况如下图所示: 程序计数器:一块较小内存区域,指向当前所执行的字节码.如果线程正在执行一个Java方法,这个计数器记录正在执行的虚拟机字节码指令的地址,如果执行的是Native方法,这个计算器值为空. Java虚拟机栈:线程私有的,其生命周期和线程一致,每个方法执行时都会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口等信息. 本地方法栈:与虚拟机栈功能类似,只不过虚拟机栈为虚拟机执行J

  • Java垃圾回收器的方法和原理总结

    什么是Java垃圾回收器 Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)之一,为应用程序提供内存的自动分配(Memory Allocation).自动回收(Garbage Collect)功能,这两个操作都发生在Java堆上(一段内存快).某一个时点,一个对象如果有一个以上的引用(Rreference)指向它,那么该对象就为活着的(Live),否则死亡(Dead),视为垃圾,可被垃圾回收器回收再利用.垃圾回收操作需要消耗CPU.线程.时间等资源,所以容

  • Java 详解垃圾回收与对象生命周期

    Java 垃圾回收与对象生命周期详解 Java中的垃圾回收与对象生命周期 1. 垃圾回收 垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制. 一个对象创建后被放置在JVM的堆内存中,当永远不再引用这个对象时,它将被JVM在堆内存中回收.被创建的对象不能再生,同时也没有办法通过程序语句释放它们.即当对象在JVM运行空间中无法通过根集合到达(找到)时,这个对象被称为垃圾对象.根集合是由类中的静态引用域与本地引用域组成的.JVM通过根集合索引对象. 在做Java应

  • 理解Java垃圾回收

    当程序创建对象.数组等引用类型的实体时,系统会在堆内存中为这一对象分配一块内存,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存就变成垃圾,等待垃圾回收机制进行回收.垃圾回收机制具有三个特征: 垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(例如数据库连接,打开的文件资源等),也不会回收以某种创建对象的方式以外的方式为该对像分配的内存,(例如对象调用本地方法中malloc的方式申请的内存) 程序无法精确控制垃圾回收的运行,只可以建议垃圾回收进行,建议的方式有两种S

  • Java 垃圾回收机制详解(动力节点Java学院整理)

    1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的一个系统级线程会自动释放该内存块.垃圾回收意味着程序不再需要的对象是"无用信息",这些信息将被丢弃.当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用.事实上,除了释放没用的对象,垃圾回收也可以清除内存记录碎片.由于创建对象和垃圾回收器释放丢弃对象所占的内存空间,

  • Java文件流关闭和垃圾回收机制

    1.先看以下一段代码 import java.io.FileInputStream; public class TTT { public static void main(String[] args) throws Exception { for (int i = 0; i < 10; i++) { final String threadId = "thread_" + i; Thread thread = new Thread(new Runnable() { public v

  • Java 垃圾回收机制详解及实例代码

     Java 垃圾回收机制详解 乍一看,垃圾回收所做的事情应当恰如其名--查找并清除垃圾.事实上却恰恰相反.垃圾回收会跟踪所有仍在使用的对象,然后将剩余的对象标记为垃圾.牢记了这点之后,我们再来深入地了解下这个被称为"垃圾回收"的自动化内存回收在JVM中到底是如何实现的. 手动管理内存 在介绍现代版的垃圾回收之前,我们先来简单地回顾下需要手动地显式分配及释放内存的那些日子.如果你忘了去释放内存,那么这块内存就无法重用了.这块内存被占有了却没被使用.这种场景被称之为内存泄露. 下面是用C写

  • 深入理解Java垃圾回收机制以及内存泄漏

    前言 在segmentfault上看到一个问题:java有完善的GC机制,那么在java中是否会出现内存泄漏的问题,以及能否给出一个内存泄漏的案例.本问题视图给出此问题的完整答案. 垃圾回收机制简介 在程序运行过程中,每创建一个对象都会被分配一定的内存用以存储对象数据.如果只是不停的分配内存,那么程序迟早面临内存不足的问题.所以在任何语言中,都会有一个内存回收机制来释放过期对象的内存,以保证内存能够被重复利用. 内存回收机制按照实现角色的不同可以分为两种,一种是程序员手动实现内存的释放(比如C语

  • 老生常谈java垃圾回收算法(必看篇)

    1.引用计数法(Reference Counting Collector) 1.1算法分析 引用计数是垃圾收集器中的早期策略.在这种方法中,堆中每个对象实例都有一个引用计数.当一个对象被创建时,且将该对象实例分配给一个变量,该变量计数设置为1.当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象实例的计数器+1),但当一个对象实例的某个引用超过了生命周期或者被设置为一个新值时,对象实例的引用计数器减1.任何引用计数器为0的对象实例可以被当作垃圾收集.当一个对象实例被垃圾收

随机推荐