• 《深入理解Java虚拟机》笔记3


    垃圾收集算法

    (1)标记清除

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

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

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

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

    (2)标记复制

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

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

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

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

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

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

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

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

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

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

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

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

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

    (3)标记整理算法

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

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

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

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

    (4)分代收集算法

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

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

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

  • 相关阅读:
    MongoDB的Spring-data-mongodb集成(Win10 x64) 第一章
    Linux 环境部署记录(三)
    onsubmit不起作用的原因
    sql server 将时间中的时分秒改为00:00:00
    js文件被浏览器缓存
    Action<>和Func<> 区别
    sql2008 express 实现自动备份
    Centos 7 无法上网的解决办法
    js 中的[] {}是什么意思
    js中var a={}什么意思
  • 原文地址:https://www.cnblogs.com/zwm512327/p/3528950.html
Copyright © 2020-2023  润新知