1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。
Java的垃圾收集(Garbage Collection)主要关注堆和方法区的内存回收。
在GC堆进行回收前,第一件事情就是要确定哪些对象还活着,哪些对象已经死亡,需要被回收。
判断对象是否存活的算法
  1)引用计数器(Reference Counting)【Java的GC不使用此算法】:
      给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值减1,计数器为0的对象就是不可能再被使用的。
      使用者:微软COM技术、使用ActionScript3的FlashPlayer、Python、Squirrel、……
      缺陷:很难解决对象之间的互相循环引用问题。
  2)根搜索算法(GC Roots Tracing)【Java的GC使用此算法】:
      通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所有走过的路径成为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
      使用者:Java、C#、Lisp、……
      在Java语言里,可以作为GC Roots的对象包括:
          a)虚拟机栈中的引用对象。
          b)方法区中的类静态属性引用的对象。
          c)方法区中的常量引用的对象。
          d)本地方法栈中JNI的引用的对象。
 
引用类型(Reference):
    引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference) 、虚引用(Phanton Reference),引用强度依次逐渐减弱。
    强引用:普遍存在的引用,GC永远不会回收强引用的对象。
    软引用:还有用,但并非必须的对象,在系统将要发生内存溢出时将此类对象列进回收范围并进行第二次回收。
    弱引用:非必须的对象,只能生存到下一次垃圾收集发生之前。
    虚引用:无法通过虚引用获取到对象,为一个对象设置虚引用关联的唯一目的就是希望能在这个对象被收集器回收时收到一个系统通知。
 
  要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行根搜索后发现没有与GC Roots相连的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。如果对象被判断为有必要执行finalize()方法,那么这个对象将会被放置在一个名为F-Queue的队列中,并在稍后由一条由虚拟机自动建立的、低优先级的finalizer线程去执行。
 
垃圾收集算法:
    a)标记-清除算法(Mark-Sweep)是最基础的收集算法,分“标记”和“清除”两个阶段。
        缺点:效率问题,标记和清除过程的效率都不高;空间问题,标记清除后会产生大量不连续的内存碎片。
    b)复制算法(Copying)将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活的对象复制到另外一块上面,然后把已使用过的内存空间一次清理掉。
        内存代价太高。商业虚拟机都采用这种收集算法,IBM研究表明,新生代中的对象98%是朝生夕死的,所以并不需要安装1:1的比例来划分内存空间。
    c)标记-整理算法(Mark-Compact)让所以存活的对象都向一端移动,然后直接清理掉端边界意外的内存。
    d)分代收集算法(Generational Collection)根据对象的存活周期不同将内存划分为几块,一般是把Java堆分为新生代和老年代,根据各个年代的特点采用最适当的收集算法。
垃圾收集器(基于Sun HotSpot_1.6_u22):
    如果说垃圾收集算法是内存回收的方法论,而垃圾收集器就是内容回收的具体实现。
    Young Generation:Serial、ParNew、Parallel Scavenge。
    Tenured Generation:CMS、Serial Old(MSC)、Parallel Old。
    Both:G1。
 
内存分配与回收策略:
    对象优先在Eden区分配。
    大对象直接进入老年代。
    长期存活的对象将进入老年代。

《深入理解Java虚拟机》笔记--第三章 、垃圾收集器与内存分配策略的更多相关文章

  1. 《深入理解java虚拟机》第三章 垃圾收集器与内存分配策略

    第三章 垃圾收集器与内存分配策略 3.1 概述 哪些内存需要回收 何时回收 如何回收 程序计数器.虚拟机栈.本地方法栈3个区域随线程而生灭. java堆和方法区的内存需要回收.   3.2 对象已死吗 ...

  2. 《深入理解JAVA虚拟机》----------第三章 垃圾收集器与内存分配策略,笔记(下)

    1.垃圾收集器 1.1 Serial收集器 这个收集器是一个单线程的收集器,它在进行垃圾收集时,必须暂停其他所有的工作线程. 它是虚拟机运行在Client模式下的默认新生代收集器,它简单而高效. 1. ...

  3. 《深入理解Java虚拟机》(三)垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 详解 3.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第三章 ,为了整理思路,简单记录一下,方便后期查阅. 3.2 对象已死吗 在垃圾收集器进行回收 ...

  4. 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这 ...

  5. JVM学习笔记-第三章-垃圾收集器与内存分配策略

    JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...

  6. 读书笔记,《深入理解java虚拟机》,第三章 垃圾收集器与内存分配策略

    要实现虚拟机,其实人们主要考虑完成三件事情: 第一,哪些内存需要回收: 第二,什么时候回收: 第三,如何回收. 第二节,对象已死吗    垃圾收集其实主要是针对java堆里面的数据来说的,传统的垃圾收 ...

  7. <<深入Java虚拟机>>-第三章-垃圾收集器与内存分配策略-学习笔记

    垃圾收集 垃圾收集(Garbage Collection,GC),垃圾收集需要完成的三件事情. 哪些对象需要回收 什么时候回收 如何回收 如何确定对象已死(即不可能在被任何途径引用的对象) 引用计数算 ...

  8. [Note][深入理解Java虚拟机] 第三章 垃圾收集器与内存分配策略笔记

    书上关于GCTimeRatio的讲解有点难以理解,查看Oracle的文档后重新理解了下 -XX:GCTimeRatio 运行时间 / GC时间 当GCTimeRatio为19时,运行时间是GC时间的1 ...

  9. 深入理解Java虚拟机学习笔记(二)-----垃圾收集器与内存分配策略

    写在前面 本节常见面试题: 如何判断对象是否死亡(两种方法). 简单的介绍一下强引用.软引用.弱引用.虚引用(虚引用与软引用和弱引用的区别.使用软引用能带来的好处). 如何判断一个常量是废弃常量 如何 ...

  10. [深入理解JVM虚拟机]第3章-垃圾收集器、内存分配策略

    垃圾收集器 判断对象是否需存活 回收堆 判断对象是否存活: 方法一:引用计数法.对象被引用一次就+1,当为0时回收对象.缺点:无法解决循环引用问题. 方法二:可达性分析算法.记录当前对象是否有和GC ...

随机推荐

  1. (转)REST无状态的理解

    转至http://lelglin.iteye.com/blog/1852092 Representational State Transfer的缩写.我对这个词组的翻译是"表现层状态转化&q ...

  2. P2762 太空飞行计划问题(网络流24题之一)

    题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的 ...

  3. BZOJ3527:[ZJOI2014]力——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3527 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. 参考:https://ww ...

  4. SQL通用优化方案(where优化、索引优化、分页优化、事务优化、临时表优化)

    SQL通用优化方案:1. 使用参数化查询:防止SQL注入,预编译SQL命令提高效率2. 去掉不必要的查询和搜索字段:其实在项目的实际应用中,很多查询条件是可有可无的,能从源头上避免的多余功能尽量砍掉, ...

  5. Spark集群基础概念 与 spark架构原理

    一.Spark集群基础概念 将DAG划分为多个stage阶段,遵循以下原则: 1.将尽可能多的窄依赖关系的RDD划为同一个stage阶段. 2.当遇到shuffle操作,就意味着上一个stage阶段结 ...

  6. 用dom4j修改xml(增加修改节点)

    用dom4j修改xml(增加修改节点) 博客分类: Java XMLJavaMyeclipseServlet  使用dom4j修改解析xml,xml文件的位置是配置在xml.properties文件中 ...

  7. vs2003一查找就卡死了

    Visual Studio 2003一查找就卡死了.解决办法如下: win7 32位下 解决方法:找到VS2003的安装目录,修改"...\Microsoft Visual Studio . ...

  8. bzoj 2795 [Poi2012]A Horrible Poem hash+数论

    2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 640  Solved: 322[Subm ...

  9. poj 1696 (计算几何基础)

    poj 1696 Space Ant 链接:http://poj.org/problem?id=1696 题意:在坐标轴上,给定n个点的 id 以及点的坐标(xi, yi),让你以最底端点开始,从右依 ...

  10. .Net并行编程系列之一:并行基础

    现在普通PC平台上面多核处理器的普及,让我们领教了能够利用多核进行并行计算的软件的处理能力,同时继承更多地核心正是当前处理器发展的趋势. 但是作为一个.NET开发人员,是否有时候会发现你的程序占用了其 ...