简单谈谈Java垃圾回收_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方法已经被调用过的对象,从而可以安全地认为它们是"死"的。

时间: 2025-01-27 08:40:01

简单谈谈Java垃圾回收_java的相关文章

理解Java垃圾回收_java

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

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

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

Java垃圾回收finalize()作用详解_java

finalize 方法使用案例 package test; class TestGC { private String str = "hello"; TestGC(String str) { this.str = str; } public void finalize() { System.out.println(str); } } public class Hello { /** * @param args */ public static void main(String[] ar

[JVM]成为JavaGC专家(1)—深入浅出Java垃圾回收机制

对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何工作可以帮你写出更好的Java应用. 这仅仅代表我个人的意见,但我坚信一个精通GC的人往往是一个好的Java开发者.如果你对GC的处理过程感兴趣,说明你已经具备较大规模应用的开发经验.如果你曾经想过如何正确的选择GC算法,那意味着你已经完全理解你所开发的应用的特点.当然,我们不能以偏概全,这不能作为评价一个好的开发人员的共通标准.但是,我要说的是,深入理解GC是成为一名伟

关于Java垃圾回收被误解的7件事

对Java垃圾回收最大的误解是什么?它实际又是什么样的呢? 当 我还是小孩的时候,父母常说如果你不好好学习,就只能去扫大街了.但他们不知道的是,清理垃圾实际上是很棒的一件事.可能这也是即使在Java的世界中, 同样有很多开发者对GC算法产生误解的原因--包括它们怎样工作.GC是如何影响程序运行和你能对它做些什么.因此我们找到了Java性能调优专家Haim Yadid,并把名为Java performance tuning guide的文章发表在Takipi的博客上. 带着对性能调优指南浓厚的兴趣

细述 Java垃圾回收机制→How Java Garbage Collection Works?

这是垃圾回收机制系列文章的第二篇.希望您已经读过了第一部分Java垃圾回收简介. Java垃圾回收是一个自动运行的管理程序运行时使用的内存的进程.通过GC的自动执行JVM将程序员从申请和释放内存的繁重操作中解放出来. Java垃圾回收GC初始化 作为一个自动执行的进程,程序员不需要在代码中主动初始化GC.Java提供了System.gc()和Runtime.gc()这两个hook来请求JVM调用GC进程. 尽管要求系统机制给程序员提供调用GC的机会,但是实际上这是由JVM负责决定的.JVM可以选

细述 Java垃圾回收机制→Types of Java Garbage Collectors

本文将会介绍各种不同类型的Java垃圾回收器.垃圾回收是Java用来将程序员从分配和释放内存的琐事中解放出来的自动过程. Java有四种类型的垃圾回收器, Serial Garbage Collector Parallel Garbage Collector CMS Garbage Collector G1 Garbage Collector 这四种类型的垃圾回收器都有各自的优点和缺点.最重要的是程序员可以选择JVM使用哪种类型的垃圾回收器.我们可以通过传递不同的JVM参数来设置使用哪一个.各个

Java垃圾回收调优实战

Java 垃圾回收调优不同于任何其它性能优化活动. 首先你要确保自己足够了解整个应用的情况以及调优预期的结果,而不是单单满足于应用的某一部分调优.一般情况下,遵循以下过程比较容易: 明确自己的性能目标. 测试. 测量调优结果. 与目标进行比较. 改变方法并再次测试. 性能调优目标要是可确定且可测量的,这非常重要.这些目标包括延迟.吞吐量和容量,想要了解更多,我推荐看看垃圾回收手册(Garbage Collection Handbook)中相应的章节.让我们看看在实践中如何设定并达到这样的调优目标

Java垃圾回收调优教程及实例

Java 垃圾回收调优和其它性能优化活动相比,首先你要确保自己足够了解整个应用的情况以及调优预期的结果,而不是单单满足于应用的某一部分调优.一般情况下,遵循以下过程比较容易:     明确自己的性能目标.    测试.    测量调优结果.    与目标进行比较.    改变方法并再次测试. 性能调优目标要是可确定且可测量的,这非常重要.这些目标包括延迟.吞吐量和容量,想要了解更多,我推荐看看垃圾回收手册(Garbage Collection Handbook)中相应的章节.让我们看看在实践中如