JVM管理的堆内存中,几乎存放了所有的对象实例,如果一个对象已经使用完毕(没有任何引用指向它),那么,该对象所占用的内存应该被回收利用,而这些工作就是JVM垃圾收集器的工作
垃圾收集器在对堆内存进行回收之前,第一件事情就是要确定哪些对象还“存活”,哪些已经“死去”,其内存将要被回收,下面就来讲——根搜索算法
在讲根搜索算法之前,因为一个对象在没有任何引用指向它的时候,其所占内存才具备回...
分类:
编程语言 时间:
2015-05-05 22:02:17
阅读次数:
130
引用计数算法:
Python使用的
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。
缺点:很难解决对象之间的相互循环引用的问题。
互相引用着对方,导致它们的计数都不为0,于是引用计数算法无法通知GC收集器回收它们。
根搜索算法:
Java,C#,Lisp用的是这个。
通过一系...
分类:
编程语言 时间:
2015-05-04 22:11:09
阅读次数:
183
一、关于Java垃圾回收的简介(1)Java 内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。(2)每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由 JIT 编译器进行一些优化),因此这几个区域的内存分配和回收都具备确定性.在这几个区域内不需要过多考虑回收的问题,...
分类:
编程语言 时间:
2015-04-16 17:36:04
阅读次数:
182
1.java的垃圾回收过程使用根搜索算法(GC Roots Tracing)判定对象是否存活的。这个算法的基本思路就是通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链...
分类:
编程语言 时间:
2015-03-09 00:17:25
阅读次数:
309
在主流的商用程序语言中(Java和C#)都是使用根搜索算法(GCRootsTracing)判断对象是否存活的。这个算法的基本思路:通过一系列的名为“GCRoots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(ReferenceChain),当一个对象到GCRoots没有任何引用链相..
分类:
其他好文 时间:
2014-07-29 16:00:20
阅读次数:
187
无论通过引用计数算法判断对象的引用数量,还是通过根搜索算法判断对象的引用链是否可达,判定对象是否存活都与“引用”有关。在JDK1.2之前,Java中的引用的定义很传统:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。这种..
分类:
编程语言 时间:
2014-07-29 15:58:33
阅读次数:
221
在根搜索算法中不可达的对象,也并非是“非死不可”的,这个时候他们暂时处于"缓刑"阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行根搜索后发现没有与GCRoots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是对象是否有必要执行fi..
分类:
编程语言 时间:
2014-07-29 15:43:29
阅读次数:
258