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. 【JavaScript&jQuery】$.ajax()

    $(function(){ $('#send').click(function(){ $.ajax({ type: "GET", url: "test.json" ...

  2. Seek the Name, Seek the Fame POJ - 2752(拓展kmp || kmp)

    题意: 就是求前缀和后缀相同的那个子串的长度  然后从小到大输出 解析: emm...网上都用kmp...我..用拓展kmp做的  这就是拓展kmp板题嘛... 求出extend数组后  把exten ...

  3. 常州day5

    Task 1 小 W 和小 M 一起玩拼图游戏啦~ 小 M 给小 M 一张 N 个点的图,有 M 条可选无向边,每条边有一个甜蜜值,小 W 要选 K条边,使得任意两点间最多有一条路径,并且选择的 K条 ...

  4. BZOJ3524 & LOJ2432:[POI2014]代理商Couriers——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3524 https://loj.ac/problem/2432 给一个长度为n的序列a.1≤a[i] ...

  5. MySQL 5.5 主从复制

    MySQL 5.5 主从复制的原理.过程   分为同步复制和异步复制,实际复制架构中大部分为异步复制.复制的基本过程如下:  1).Slave上面的IO进程连接上Master,并请求从指定日志文件的指 ...

  6. git用户名和邮箱配置

    1. 设置全局用户名和邮箱 git config --global user.name "xxx" git config --global user.email "xxx ...

  7. 手把手教你如何玩转Activiti工作流

    手把手教你如何玩转Activiti工作流 置顶 2018年01月30日 19:51:36 Cs_hnu_scw 阅读数:24023   版权声明:本文为博主原创文章,未经博主允许不得转载. https ...

  8. SpringMVC 重定向

    在返回视图名字的字符串前面加forword:或redirect:前缀是就会对他们做特殊处理,它们分别是转发和重定向 我们测试一个重定向操作把 Java代码 @RequestMapping(" ...

  9. Codeforces 25.E Test

    E. Test time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...

  10. lua和C++的交互(1)

    /* 以前听的一个故事,当年Java的创造者讲课的时候,一开始先拿一个简单的不能简单的小例子, 不断的扩展,最后成为一个复杂而完美的程序. 一个重要之重要的概念,就是栈.Lua与别的语言交互以及交换数 ...