zoukankan      html  css  js  c++  java
  • 垃圾回收算法简单介绍——JVM读书笔记<二>

    垃圾回收的过程主要包含两部分:找出已死去的对象、移除已死去的对象。

    确定哪些对象存活有两种方式:引用计数算法、可达性分析算法。

    方案一:引用计数算法

    给对象中加入一个引用计数器。每当有一个地方引用它时。计数器值加1;当引用失效时,计数器值减1;计数器的值为0时即表明对象已经死去(可被回收)。

    长处:实现简单。判定效率高。

    缺点:难解决对象之间互相引用的问题。

    如:对象objA和objB都有字段instance,令objA.instance=objB,objB.instance=objA;除此之外。objA和objB再无其它引用,理论上objA和objB能够被回收(无法被訪问),但由于计数器变为0,所以导致内存泄露。

    方案二:可达性分析算法

    通过“GC Roots”对象作为起始点,从这些节点開始向下搜索。被搜索到的对象marked,堆中未被maked的对象表明不可达(可被回收)。

    在Java语言中。课作为GC Roots的对象包含例如以下四种:

    1.虚拟机栈(栈帧中的本地变量表)中引用的对象

    2.方法区中类静态属性引用的对象

    3.方法区中常量引用的对象

    4.本地方法栈中JNI(即一般说的Native方法)引用的对象


    垃圾收集算法:

    1.标记-清除(Mark-Sweep):用上面描写叙述的方法标记出须要回收的对象。标记后统一回收全部被标记的对象。

    2. 复制算法: 为了解决上述算法清除造成可用空间碎片化的问题,复制算法将内存空间分成大小相等的两部分。当一部分使用完时,将存活的对象移至还有一部分。

    3. 标记-整理(Mark-Compact):上述算法造成实际使用空间仅仅占了分配空间的一半,标记-整理算法在标记后,将全部存活对象向一端移动,然后直接清理掉端边界以外的内存。

    4.分代收集算法:研究表明新生代中的对象98%是“朝生夕死”的。所以将对象加入年龄属性,依据不同的年龄决定对象存放位置。详细可參考Java垃圾回收


    说明:本文的内容參考书籍《深入理解Java虚拟机(第2版)

  • 相关阅读:
    小M和天平(简单DP)
    前缀查询(维护字典树前缀和)
    假的字符串( trie树 + 拓扑)
    E. Two Teams(线段树+链表)
    B. Ugly Pairs(简单dfs)
    回文(牛客 https://ac.nowcoder.com/acm/problem/17062)
    Dubbo中CompletableFuture异步调用
    Dubbo消费者异步调用Future使用
    Dubbo消费者异步调用Future使用
    Dubbo服务暴露延迟
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5207896.html
Copyright © 2011-2022 走看看