阅读《垃圾回收的算法与实现》时记录的一些笔记。

  1. 对象

    在GC的世界中,对象表示的是"通过应用程序利用的数据的集合"

  2. 我们将对象中保存对象本身信息的部分称为头。头主要含有一下信息

    • 对象的大小
    • 对象的种类
  3. 我们把对象使用者在对象中可访问的部分称为“域”

    域的数据类型大致分为以下2中:

    • 指针
    • 非指针
  4. 指针

    GC是根据对象的指针指向去搜索其他对象的。另一方面,GC对非指针不进行任何操作。

    • GC在一般情况下无法严谨地判断寄存器和调用栈中的值是指针还是非指针。
  5. mutator

    非GC的部分(例如说应用自身的代码)是mutator,换言之它的实体就是"应用程序"

    • mutator实际进行的操作有以下两种。

      • 生成对象
      • 更新指针
  6. collector

    GC自身就是collector

  7. 分配

    分配指的是在内存空间中分配对象。当mutator需要新对象时,就会向分配器)(allocator)申请一个大小合适的空间。分配器则在堆的可用空间中找寻满足要求的空间返回mutator

  8. 堆指的是用于动态(也就是执行程序时)存放对象的内存空间。当mutator申请存放对象时,所需的内存空间就会从这个堆中被分配给mutator。

    为了简化问题

    • 我们把$heap_start定为指向堆首地址的指针。
    • $heap_end定为指向堆末尾下一个地址的指针。
    • 堆大小固定为常量HEAP_SIZE
    • $heap_end = $heap_start + HEAP_SIZE
  9. 活动对象/非活动对象

    我们将分配到内存空间中(也就是堆)的对象里能通过mutator引用的对象称为活动对象,
    反之,把分配到堆中那些不能通过程序引用的对象称为“非活动对象”。

    • 非活动对象无法直接转为活动对象,必须要经过销毁重分配的过程。
  10. 分块

    分块(chunk) 在GC的世界里指的是为利用对象而事先准备出来的空间。

  11. 在GC的世界里,根是指向对象的指针的"起点"部分。

    GC把可以直接或间接从全局变量空间中引用的对象视为活动对象。与全局变量相同,我们也可以通过mutator直接引用调用栈(call stack)和寄存器。也就是说,调用栈、寄存器以及全局变量空间都是根。

  12. 评价标准

    评价GC算法的性能时,一般采用以下4个标准。

    • 吞吐量

      吞吐量(throughput)指的是“在单位时间内的处理能力"

    • 最大暂停时间

      最大暂停时间指的是“因执行GC而暂停执行mutator的最长时间”

    • 堆使用效率

      影响使用效率的因素有两个

      1. 头的大小,头一般是越小越好。
      2. 堆的用法,可用的堆越大,GC运行越快;相反,越想有效地利用有限的堆,GC花费的时间就越长。
    • 访问的局部性

      具有引用引用关系的对象之间通常很可能存在连续访问的情况。被称为“访问的局部性”。

      考虑到访问的局部性,把具有引用关系的对象安排在堆中较近的位置,就能提高在缓存中土去到想利用的数据的概率,令mutator高速运行。

0. GC 前置知识的更多相关文章

  1. Java安全之Commons Collections1分析前置知识

    Java安全之Commons Collections1分析前置知识 0x00 前言 Commons Collections的利用链也被称为cc链,在学习反序列化漏洞必不可少的一个部分.Apache C ...

  2. Fastjsonfan反序列链学习前置知识

    Fastjson前置知识 Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象. Fastjson 可以操作任何 ...

  3. 学golang之前都需要哪些前置知识?

    我学golang,感觉前面基础语法部分都很快能学会,但是到了goroutine,channel等后面的部分就看不懂了,是不是我学这个之前还得学习其他什么知识啊?(我有C语言基础,对于C语言里面的指针, ...

  4. webpack前置知识1(模块化开发)

    webpack前置知识1(模块化开发) 新建 模板 小书匠  在开始对模块化开发进行讲解之前,我们需要有这么一个认识,即 在没有过多第三方干扰时,成本低收益高的事物更容易获得推广和信赖. 模块化开发就 ...

  5. JavaWeb前置知识 : 动态和静态的区别、两种架构、常见状态码

    JavaWeb程序设计(一) : 前置知识 1.动态网页与静态网页的区别: a.不要和是否有"动感"混为一谈. b.是否随着时间.地点.用户操作的改变而改变 (例如 : 在百度上搜 ...

  6. Java GC相关知识

    Java堆的分类 分为两类:YoungGen和OldGen.其中,YoungGen分为三部分:eden,from survivor和to survivor,比例默认是:8:1:1 PermGen不属于 ...

  7. WebAPI前置知识:HTTP与RestfulAPI

    对HTTP协议的基本了解是能理解并使用RestFul风格API的基础,在了解了这些基础之后,使用各种RestFul的开发框架才能得心应手.我一开始使用WebApi的时候就因为对这些知识缺乏了解,觉得用 ...

  8. Vue 2.0入门基础知识之全局API

    3.全局API 3-1. Vue.directive 自定义指令 Vue.directive用于自定义全局的指令 实例如下: <body> <div id="app&quo ...

  9. three.js基础前置知识

    这一节是纯理论知识,用于介绍three.js的入门概念,也就是开发前需要准备的理论基础. 一,三剑客 当然就是scene,camera,renderer这三个基本要素. scene是一个用于容纳三维空 ...

随机推荐

  1. HDU 4699 Editor(模拟 对顶栈)

    题目大意: 给定一个整数序列 维护5种操作 次数<1e6 I x: 光标位置插入x 然后光标位于x之后 D: 删除光标前一个数 L: 光标左移 R: 光标右移 Q k: 询问位置k之前的最大前缀 ...

  2. Update(Stage4):scala补充知识

    1.惰性加载: 在企业的大数据开发中,有时候会编写非常复杂的SQL语句,这些SQL语句可能有几百行甚至上千行.这些SQL语句,如果直接加载到JVM中,会有很大的内存开销.如何解决? 当有一些变量保存的 ...

  3. vjudge Trailing Zeroes (III) (二分答案 && 数论)

    嗯... 题目链接:https://vjudge.net/contest/318956#problem/E 这道题是二分答案+数论,但首先是数论,否则你不知如何二分... 首先关于一个阶乘的结果最后会 ...

  4. 洛谷 CF798C Mike and gcd problem

    嗯... 题目链接:https://www.luogu.org/problemnew/show/CF798C 这道题首先要会写gcd..也类似一种找规律吧... 问题的操作是在两个数的基础上进行的: ...

  5. Fedora26同步仓库缓存失败问题实记

    虽然目前的linux已经能自动选择最快的源,但是官方提供的镜像列表仍然较少,速度虽有所提升但是整体依然较慢,阿里的源作为国内最快的源却没有被纳入官方提供的源中 国内常使用的源有阿里,中科大,清华,网易 ...

  6. C++11常用特性介绍——列表初始化

    一.列表初始化 1)C++11以前,定义初始化的几种不同形式,如下: int data = 0;   //赋值初始化 int data = {0};   //花括号初始化 int data(0); / ...

  7. idea隐藏配置文件

  8. A letter for NW RDMA configuration

    Dear : If you have to use EMC NW NDMA to backup oracle database and want to see what happen when bac ...

  9. redhat 7.6 网络配置

    网卡配置目录 /etc/sysconfig/network-scripts/ 关闭网卡 $$ 打开网卡 ifdown ensp8 && ifup ensp8 重启网卡服务 servic ...

  10. Kubernetes 1.17.2 高可用部署

    20.0.0.200    10.0.0.200 bs-k8s-master01 管理节点 2c2g 20.0.0.201    10.0.0.201 bs-k8s-master02 管理节点 2c2 ...