一. 概述 说起垃圾收集(Garbage Collection, GC), 大部分人都把这项技术当做Java语言的伴随生产物. 事实上, GC的历史远远比Java久远, 1960年 诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言. 当Lisp还在胚胎时期时,人们就在思考GC需要完成的三件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 现在内存的动态分配与内存回收技术已经相当成熟, 那为什么我们还要去了解GC和内存分配呢? 答案很简单: 当需要排查各种内存溢出, 内…
1. 垃圾收集算法       JVM的垃圾收集算法在不同的JVM实现中有所不同,且在平时工作中一般不会深入到收集算法,因此只对算法做较为简单的介绍.       1.1 标记-清除算法           这种算法是非常直观的,也是最为基础的收集算法(Mark-Sweep)算法,这种算法将回收分为两个阶段:首先标记所有需要回收的对象,然后在完成标记后统一回收掉被标记的对象.这种算法是如此的基础,以至于后面的算法都是基于该思路,并对其确定进行改进所得的.           这种算法的缺点主要有…
  通过前面的介绍我们了解了对象创建和销毁的过程.那么JVM中垃圾收集器具体对对象回收采用的是什么算法呢?本文主要记录下JVM中垃圾收集的几种算法. JVM的垃圾回收的算法 标记-清除算法(Mark-Sweep)   标记清除算法是最基础的回收算法,该算法分为两个阶段,即标记阶段和清除阶段. |阶段|说明 | |--|:--| | 标记阶段|先根据可达性分析算法找出需要回收的对象进行标记 | | 清除阶段| 统一回收被标记的对象| 参考<深入理解java虚拟机>: 从可达性分析算法角度看标记-…
前言 很多人将垃圾收集(Garbage Collection)视为Java的伴生产物,实际1960年诞生的Lisp是第一门真正使用内存动态分配与垃圾手机技术的语言.在目前看来,内存的动态分配与内存回收已经相当成熟,但了解GC与内存分配还是非常有必要的,当排查内存溢出.内存泄漏问题,当垃圾手机称为系统高并发的瓶颈时,就需要我们对其实施必要的监控与调节. 在前面的篇章中我们了解到Java的运行时区域中的程序计数器.虚拟机栈.本地方法栈的内存分配与回收具有确定性,但Java堆不同,这部分内存的分配与回…
1. 一些概念 1.1 垃圾&垃圾收集 垃圾:在 JVM 语境下,"垃圾"指的是死亡的对象所占据的堆空间. 垃圾收集:所谓"垃圾收集",就是将已分配出去.但不再使用的内存回收回来,以便能再次分配. 1.2 对象是否死亡 如何判断一个对象是否死亡(即不可能再被任何途径使用)?通常有以下两种方法: 1.2.1 引用计数法 引用计数法(Reference Counting):为每个对象添加一个引用计数器,用来统计指向该对象的引用个数.当有地方引用它时,计数器加一:…
1.垃圾收集对象 垃圾收集主要是针对堆和方法区进行. 程序计数器.虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收. 哪些内存需要回收? 死亡的对象-->对象存活判定算法(引用计数.可达性分析.finalize()方法). 什么时候回收? 垃圾收集算法. 如何回收? 垃圾收集器. 1.1.堆中对象存活判定算法 1. 引用计数算法 给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1.引用…
Java虚拟机的内存模型分为五个部分.各自是:程序计数器.Java虚拟机栈.本地方法栈.堆.方法区. 这五个区域既然是存储空间,那么为了避免Java虚拟机在执行期间内存存满的情况,就必须得有一个垃圾收集者的角色.不定期地回收一些无效内存,以保障Java虚拟机可以健康地持续执行. 这个垃圾收集者就是寻常我们所说的"垃圾收集器".那么垃圾收集器在何时清扫内存?清扫哪些数据?这就是接下来我们要解决的问题. 程序计数器.Java虚拟机栈.本地方法栈都是线程私有的,也就是每条线程都拥有这三块区域…
判断哪些对象需要被回收 引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的. 但是JVM没有使用此方法,因为此方法无法解决2个对象相互循环引用的问题. 可达性分析算法: 这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象…
3.1 关于垃圾收集和内存分配 垃圾收集和内存分配主要针对的区域是Java虚拟机中的堆和方法区: 3.2 如何判断对象是否“存活”(存活判定算法) 垃圾收集器在回收对象前判断其是否“存活”的两个算法: 1.引用计数算法:一个对象在被引用之后这个计数器就加1,不被引用之后则减1,如果是0,那么就被回收,这个一般不被主流Java虚拟机所使用,原因:对象的循环引用会导致计数器始终不为0,那么就无法回收. 2.可达性分析算法:通过GC roots对象作为起点,向下搜索和它进行有效链接的对象,如果对象最终…
一.判断对象是否可进行回收 1.引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的.但是主流的Java虚拟机里面没有选用引用计数算法来管理内存,最主要的原因是它很难解决对象之间相互循环引用的问题.代码示例如下: public class JVMTest { private JVMTest jvmTest = null; public static void main(String[] arg…