zoukankan      html  css  js  c++  java
  • GC--垃圾收集器

    把周末的文章放在现在才来写,是自己太忙了?还是堕落了?

    好吧直接进入主题吧,简单干脆的理解会让自己记忆深刻:

    首先说明:GC垃圾收集器关注两件事情:

    第一件:查找所有存活对象。

    第二件:抛弃死对象(不再使用的对象)。

    然后再分步骤解释这个过程:

    第一步, 记录所有的存活对象, 在垃圾收集中有一个叫做 标记(Marking) 的过程专门干这件事。

    GC遍历内存中整体的对象关系图(object graph),从GC根元素开始扫描, 到直接引用,以及其他对象(通过对象的属性域)。所有GC访问到的对象都被标记(marked)为存活对象。

    注意:在标记阶段,需要暂停所有应用线程, 以遍历所有对象的引用关系。因为不暂停就没法跟踪一直在变化的引用关系图。这叫做 Stop The World pause (全线停顿)。

    第二步,GC删除不可达对象。

    GC算法在删除不可达对象时略有不同,总结如下:

    1、标记-清除算法:直接忽略所有的垃圾。也就是说在标记阶段完成后, 所有不可达对象占用的内存空间, 都被认为是空闲的, 因此可以用来分配新对象。

    优点:非常简单。

    缺点:容易导致内存分配失败。

     

    2、标记-清除-整理算法:将所有被标记的对象(存活对象), 迁移到内存空间的起始处, 消除了标记-清除算法的缺点。

    优点:解决了内存分配失败。

    缺点:GC暂停的时间增长,需要将所有的存活对象移动到另一个地方。

    3、标记-清除-复制算法:将将所有被标记的对象(存活对象)移动到另外一个空间: 存活区。

    优点:标记和复制可以同时进行。

    缺点:需要一个额外的内存区间来存放所有的存活对象。

  • 相关阅读:
    Servlet的PrintWriter out = response.getWriter()使用
    Java Performance Optimization Tools and Techniques for Turbocharged Apps--reference
    Scrum介绍——续
    Scrum介绍
    CMM能力成熟度模型
    自定义Spark Partitioner提升es-hadoop Bulk效率——续
    $digest already in progress 解决办法——续
    $digest already in progress 解决办法
    linux tcpdump 抓包
    Asterisk——part 1
  • 原文地址:https://www.cnblogs.com/xubiao/p/6557307.html
Copyright © 2011-2022 走看看