zoukankan      html  css  js  c++  java
  • 《深入理解Java虚拟机》笔记3

    垃圾收集算法

    (1)标记清除

    根据根搜索确定对象是否已死,已死对象标记,然后一起清除。

    这个其实不算什么算法,最正常想法应该就是这样。但是,缺点

    是效率不高,如果有很多不连续的小对象需要回收,会花好多时间

    。另外,造成内存碎片也是问题,分配新的对象和分配大对象不好解决。

    (2)标记复制

    简单的做法,把内存分成两块,内存永远在其中一块上分配。

    垃圾回收时,把存活的对象复制到另一块连续分配,然后把前一块

    内存全清除即可。这种方法是浪费一半内存,代价有点大。

    PS:以后内存大小如果不是问题,不知道会不会用这种算法?

    大多数情况下,对象的存活期应该是朝生夕灭,所以,专门留出

    一半的空间来准备备份是没有必要的。

    hotspot虚拟机的算法是内存分为一块大的eden空间和两块较小

    的survivor空间(注意:只是新生代,不是全部内存,后面会说到新生代)

    其中一块survivor用作备份存活对象,eden和survivor可以用来分配内存。

    这样浪费的空间就只有一个survivor。

    另外一个问题随之而来,并不能保证存活下的对象全能被一个survivor容纳。

    不能容纳的对象必须有别的内存来担保,这个工作是由老生代担当的。

    从名字也可以看出老生代存放的是存活周期比较老的对象。

    (3)标记整理算法

    佩服这个算法的创造者┏ (^ω^)=☞

    老生代没有额外的担保空间,但是又需要垃圾回收,聪明的人想到了办法。

    每次垃圾回收时,把存活的对象向内存的另一侧移动,然后清除回收前的起点到

    另一侧占用的边界之间的内存。

    (4)分代收集算法

    把内存分为新生代和老生代。新生代用的是复制算法,

    老生代用的是标记整理算法。作者把分代算法和前面三种算法

    并列,感觉不是一个层次的东西。计算机书籍,理解即可。

  • 相关阅读:
    Ubuntu下安装git
    curl: (48) An unknown option was passed in to libcurl怎么解决
    python中如何删除列表中的所有元素
    北京游园有感
    keras 实现人工神经网络
    scikit-learn实现简单的决策树
    angularjs实战
    Ajax实战(原生)
    7.DockerCompose 搭建 Redis
    使用element中的el-upload获取本地文件并转为base64码实现预览
  • 原文地址:https://www.cnblogs.com/zwm512327/p/3528950.html
Copyright © 2011-2022 走看看