zoukankan      html  css  js  c++  java
  • 深入理解java虚拟机系列二——垃圾收集算法

    在主流的商用程序语言中大多都是用根搜索算法(GC Roots Tracing)判断对象是否存活,比如java,c#等。当从GC Roots到某个对象不可达,则证明此对象是不可用的,将要被回收。

    商业虚拟机都采用分代收集算法,根据对象的存活周期的不同将内存分为几块:新生代,老年代。

    新生代,每次垃圾收集都会有大批量对象死去,只有少量存活,所以适合采用“复制算法”;

    老年代,对象存活率比较高,没有额外的分配担保,所以一般采用“标记-清理”活着“标记-整理”算法;

    1.标记-清除

    缺点:

      效率低下,标记和清除的过程效率都不高;

      空间问题,标记清除之后会产生大量不连续的内存碎片;

    2.复制算法

    它可以将内存按照容量分为大小相等的两块,当其中一块快要用完的时候,就将还活着的对象复制到另外一块上面,然后再把已用过的内存空间一次清理掉。

    现代虚拟机都采用这种收集算法来回收新生代。但是并不需要按照1:1的比例划分内存,而是分为一块较大的Eden空间和两块较小的Survivor空间,每次使用凉快Survivor中的一块和Eden空间,当回收的时候将还活着的对象copy到另一块Survivor上,最后清理掉已经使用过的Survivor和Eden空间。HotSpot默认比例是8:1:1.如果Survivor上的空间不够,则会从其他内存(老年代)进行分配担保。

    3.标记-整理

    与标记-清除算法相似,在标记之后会将仍然活着的对象都像一端移动。然后清理掉边界以外的内存。

  • 相关阅读:
    os.environ的详解
    request.headers.get头部获取内容的缺失
    mysql根据逗号分割的字符串去关联查询另外一个表的数据
    Flask路由中使用正则表达式匹配
    Mac OS下安装mysqlclient遇到的一些坑
    【uWSGI】 listen queue of socket (fd: 3) 错误分析
    redis zset底层实现原理
    计算机网络05 传输层
    计算机网络04 网络层
    计算机网络03 数据链路层
  • 原文地址:https://www.cnblogs.com/fuxinci/p/3188041.html
Copyright © 2011-2022 走看看