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. Java NIO中的Buffer

    简介 Buffer缓冲区,首先要弄明白的是,缓冲区是怎样一个概念.它其实是缓存的一种,我们常说的缓存,包括保存在硬盘上的浏览器缓存,保存在内存中的缓存(比如Redis.memcached).Buffe ...

  2. MySQL配置文件简单解析

    [mysqld] basedir = /data/mysql datadir = /data/mysqldata tmpdir = /data/mysqltmpdata //mysql的查询临时目录, ...

  3. Luogu 4917 天守阁的地板(莫比乌斯反演+线性筛)

    既然已经学傻了,这个题当然是上反演辣. 对于求积的式子,考虑把[gcd=1]放到指数上.一通套路后可以得到∏D∏d∏i∏j (ijd2)μ(d) (D=1~n,d|D,i,j=1~n/D). 冷静分析 ...

  4. 【BZOJ4654】【NOI2016】国王饮水记(动态规划,斜率优化)

    [BZOJ4654][NOI2016]国王饮水记(动态规划,斜率优化) 题面 BZOJ 洛谷 题解 首先肯定是找性质. 明确一点,比\(h_1\)小的没有任何意义. 所以我们按照\(h\)排序,那么\ ...

  5. python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数

    1.函数的定义: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  6. 弄清楚CSS的匹配原理让你写出高效的CSS

    用了这么多年的CSS,现在才明白CSS的真正匹配原理,不知道你是否也跟我一样?看1个简单的CSS: DIV#divBox p span.red{color:red;} 按习惯我们对这个CSS 的理解是 ...

  7. “Spring.Context.Support.ContextRegistry”的类型初始值设定项引发异常。-解决方法

    注释掉web/app.config中的:

  8. Spring Swagger URL传参问题(转)

    代码例子: @ApiOperation(value="获取用户详细信息", notes="根据url的id来获取用户详细信息") @ApiImplicitPar ...

  9. AndroidManifest.xml 权限 中英对照表

    声明: 1.本文转载自:http://www.52pojie.cn/thread-304613-1-1.html 2.如有转载请复制上面连接声明,尊重原创 常用权限对照表 android.permis ...

  10. 3.6 scikit-learn:Python中的机器学习

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...