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

    垃圾收集算法

    (1)标记清除

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

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

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

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

    (2)标记复制

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

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

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

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

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

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

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

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

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

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

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

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

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

    (3)标记整理算法

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

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

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

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

    (4)分代收集算法

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

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

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

  • 相关阅读:
    主机的IOPS需求转换成硬盘实际IOPS负载
    IT安全运维职责
    IT应用运维职责
    存储RAID 选择策略
    交换机接口下错包计数,哪些是属于物理链路(包括本端设备和对端设备硬件问题)引起的
    华为交换机SNMP配置
    c# 位与运算符&简单实现复选框功能【实际应用】
    centos7 安装谷歌浏览器教程
    centos7下 Consul安装
    .netcore3.1 获取请求头header中认证信息并调用其它接口
  • 原文地址:https://www.cnblogs.com/zwm512327/p/3528950.html
Copyright © 2011-2022 走看看