关于垃圾回收的一些知识

转载 2006年06月19日 12:48:00

为什么要进行垃圾回收?因为JVM本身就实现内存堆里的,它不可能有象C++的自动变量(临时变量),所以所有的对象都要被会收.我们先来看一下C++:

ClassType varname;//自动变量,在内存的栈中创建,随作用域的消失而自动消失.

ClassType varname = new ClassType();//在内存堆中创建,要程序员手工释放,如:
delete varname;相当于C中的free.
由于JVM本身就是在内存堆中实现,所以它不可能创建自动变量,所有的对象都有手工释放,这个"手工"是指要程序实现,并不一定非要程序员编程,JVM自己就实现了"常规"对象的释放,这就是JVM的垃圾回收器.

但对于非"常规"的对象,比如直接或间接调用本地资源.(有人把图象擦除认为不是本地方法调用,其实它只是AWT在间接调用本地方法而已),就是程序员自己编程来释放资源.


一个对象是如何被标记垃圾(可回收对象)?以前有些实现采用"引用计数",就是一个对象在被引用的时候,引用计数加1,当引用句柄消失时引用计数减速1,当引用计数为0,就可被回收了.
那有人说刚new的对象不也被回收了吗?

一个对象的生存期分为新生代,旧生代,新生代又分为Eden 和两片生存空间其中保证有一片空间在任何时间是空的,对象刚被new的时候在Eden 中,垃圾回收器不会对Eden中对象回收,
只有Eden中对象满的时候,被复制到下一片生存空间.当生存空间满的时候,才会发生一次小回收.当对象在生存空间太久达到一个"老化"的值时就被复制到了旧生代,旧生代满的时候就发生大回收了.

但java并不是采用引用计数来标记一个对象是否可以回收的.因为JAVA中对象很可能被直接或间接循环引用,就是对象A中引用到对象B的一个属性,而对象B又引用了A中一个属性,这样可能造成引用记数永远不会为0.

JAVA中是采用"由根遍历"来标记对象,就是从句柄开始对一个句柄引用的对象进行查找,然后对这个对象引用的对象再进行查找,这样递归好象从树根往沿枝条找到叶子,如果一个对象没有被这样查找到说明它已经没有对象对它引用了.




如何释放非JAVA对象?我们已经说过常规的JAVA对象会被JVM的垃圾回收器来回收,但对于本地资源(一般来说本地方法大都调用了本地资源),就要我们手工释放了.
一般来说我们可以在finalize() 中定义释放本地资源的代码,但是这个方法不是肯定会被执行的,finalize() 不是在对象退出的时候运行,而是在对象被作为垃圾回收时才调用.有可能JVM一直不需要回收,所以这个方法就一直不会被调用,同样如果要求对象在退出前一定要稍许对象,你一定要把释放对象的代码写在try{}finally{}的finally块中,这就是我再三强调释放数据数连结一定要写在这儿的原因,在java1.1中还有个方法是System.runFinalizersOnExit(),但它不如finally来得更有效.

同样System.gc()方法并不能保证垃圾回收的发生,它只是"建议",而垃圾回到到底什么时候发生?小回收是生存空间满,大回收是旧生代满,这只是前提.因为垃圾回收是低优先级的方式运行,只有当其他线程都挂起等待内存释放的情况出现时,它才开始释放对象的内存.

相关文章推荐

.net重点知识复习(内存管理、垃圾回收、反射)

垃圾回收机制 反射机制

finalize关键字和垃圾回收的一些知识

1.finalize()方法 1)finalize()的工作原理:假定一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收时候做一些重要的清理工作。...

jvm基础知识五----分代垃圾回收详细

为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对 象可以采取不同的收集方式,以便提高回收效率。 在Java程序运行的过程中,会产生大量的...

java垃圾回收的一些简单知识

第一章  垃圾回收算法 1.1 标记-清除(Mark-Sweep)算法 概述:最基础的垃圾收集算法,后续的垃圾收集算法都是改进此算法的结果。 过程:先标记,后清除。 不足:(1)效率问题,标记和清除两...

Java内存和垃圾回收的知识学习

Java内存和垃圾回收的知识学习 昨天看了Java内存和垃圾回收方面的知识,所以今天打算写博客记录一下昨天学的知识,同时也可以将所学的知识整理一下,形成一个体系结构。Java内存分配方面 ...

【知识点】垃圾回收之引用计数之循环引用

原文地址关于引用计数法,我们可以先看一段wiki上的描述:As a collection algorithm, reference counting tracks, for each object, ...

jvm基础知识三-----基本垃圾回收算法

可以从不同的的角度去划分垃圾回收算法: 按照基本回收策略分 引用计数(Reference Counting): 比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。...

Java知识整理——垃圾回收

Java中垃圾回收的目的是什么, 它什么时候被使用 ? 垃圾回收用于识别和丢弃程序不再需要的对象, 以便回收和复用资源. System.gc() 和Runtime.gc()方法用途? 这些方法...

Java虚拟机对象创建管理与垃圾回收知识整理与分析--Jvm虚拟机篇

一.Java framwork基础面试笔试知识整理–java基础篇(1)内存模型以及分区,需要详细到每个区放什么。堆:Java虚拟机管理内存中最大的一块,线程共享区域。所有对象实例和数组都在堆上分配内...

C#基础知识复习2:值和引用-接口-类型转换-异常-函数返回值-对象相等-重载-字符串-垃圾回收-集合

1、值类型引用类型(1)值类型均隐式派生自System.ValueType数值类型、bool、结构、枚举查看IL,隐式继承自ValueType(2)引用类型派生自System.Object字符串、数组...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)