0. GC 前置知识
阅读《垃圾回收的算法与实现》时记录的一些笔记。
对象
在GC的世界中,对象表示的是"通过应用程序利用的数据的集合"
头
我们将对象中保存对象本身信息的部分称为头。头主要含有一下信息
- 对象的大小
- 对象的种类
域
我们把对象使用者在对象中可访问的部分称为“域”
域的数据类型大致分为以下2中:
- 指针
- 非指针
指针
GC是根据对象的指针指向去搜索其他对象的。另一方面,GC对非指针不进行任何操作。
- GC在一般情况下无法严谨地判断寄存器和调用栈中的值是指针还是非指针。
mutator
非GC的部分(例如说应用自身的代码)是mutator,换言之它的实体就是"应用程序"
mutator实际进行的操作有以下两种。
- 生成对象
- 更新指针
collector
GC自身就是collector
分配
分配指的是在内存空间中分配对象。当mutator需要新对象时,就会向分配器)(allocator)申请一个大小合适的空间。分配器则在堆的可用空间中找寻满足要求的空间返回mutator
堆
堆指的是用于动态(也就是执行程序时)存放对象的内存空间。当mutator申请存放对象时,所需的内存空间就会从这个堆中被分配给mutator。
为了简化问题
- 我们把
$heap_start定为指向堆首地址的指针。 - 把
$heap_end定为指向堆末尾下一个地址的指针。 - 堆大小固定为常量
HEAP_SIZE $heap_end = $heap_start + HEAP_SIZE
- 我们把
活动对象/非活动对象
我们将分配到内存空间中(也就是堆)的对象里能通过mutator引用的对象称为活动对象,
反之,把分配到堆中那些不能通过程序引用的对象称为“非活动对象”。- 非活动对象无法直接转为活动对象,必须要经过销毁重分配的过程。
分块
分块(chunk) 在GC的世界里指的是为利用对象而事先准备出来的空间。
根
在GC的世界里,根是指向对象的指针的"起点"部分。
GC把可以直接或间接从全局变量空间中引用的对象视为活动对象。与全局变量相同,我们也可以通过mutator直接引用调用栈(call stack)和寄存器。也就是说,调用栈、寄存器以及全局变量空间都是根。

评价标准
评价GC算法的性能时,一般采用以下4个标准。
吞吐量
吞吐量(throughput)指的是“在单位时间内的处理能力"
最大暂停时间
最大暂停时间指的是“因执行GC而暂停执行mutator的最长时间”
堆使用效率
影响使用效率的因素有两个
- 头的大小,头一般是越小越好。
- 堆的用法,可用的堆越大,GC运行越快;相反,越想有效地利用有限的堆,GC花费的时间就越长。
访问的局部性
具有引用引用关系的对象之间通常很可能存在连续访问的情况。被称为“访问的局部性”。
考虑到访问的局部性,把具有引用关系的对象安排在堆中较近的位置,就能提高在缓存中土去到想利用的数据的概率,令mutator高速运行。
0. GC 前置知识的更多相关文章
- Java安全之Commons Collections1分析前置知识
Java安全之Commons Collections1分析前置知识 0x00 前言 Commons Collections的利用链也被称为cc链,在学习反序列化漏洞必不可少的一个部分.Apache C ...
- Fastjsonfan反序列链学习前置知识
Fastjson前置知识 Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象. Fastjson 可以操作任何 ...
- 学golang之前都需要哪些前置知识?
我学golang,感觉前面基础语法部分都很快能学会,但是到了goroutine,channel等后面的部分就看不懂了,是不是我学这个之前还得学习其他什么知识啊?(我有C语言基础,对于C语言里面的指针, ...
- webpack前置知识1(模块化开发)
webpack前置知识1(模块化开发) 新建 模板 小书匠 在开始对模块化开发进行讲解之前,我们需要有这么一个认识,即 在没有过多第三方干扰时,成本低收益高的事物更容易获得推广和信赖. 模块化开发就 ...
- JavaWeb前置知识 : 动态和静态的区别、两种架构、常见状态码
JavaWeb程序设计(一) : 前置知识 1.动态网页与静态网页的区别: a.不要和是否有"动感"混为一谈. b.是否随着时间.地点.用户操作的改变而改变 (例如 : 在百度上搜 ...
- Java GC相关知识
Java堆的分类 分为两类:YoungGen和OldGen.其中,YoungGen分为三部分:eden,from survivor和to survivor,比例默认是:8:1:1 PermGen不属于 ...
- WebAPI前置知识:HTTP与RestfulAPI
对HTTP协议的基本了解是能理解并使用RestFul风格API的基础,在了解了这些基础之后,使用各种RestFul的开发框架才能得心应手.我一开始使用WebApi的时候就因为对这些知识缺乏了解,觉得用 ...
- Vue 2.0入门基础知识之全局API
3.全局API 3-1. Vue.directive 自定义指令 Vue.directive用于自定义全局的指令 实例如下: <body> <div id="app&quo ...
- three.js基础前置知识
这一节是纯理论知识,用于介绍three.js的入门概念,也就是开发前需要准备的理论基础. 一,三剑客 当然就是scene,camera,renderer这三个基本要素. scene是一个用于容纳三维空 ...
随机推荐
- AOP统一日志打印处理
在日常开发工作中,我们免不了要打印很多log.而大部分需要输出的log又是重复的(例如传入参数,返回值).因此,通过AOP方式来进行日志管理可以减少很多代码量,也更加优雅. Springboot通过A ...
- MAC系统 - 系统目录结构
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/smstong/article/detai ...
- svn检出两种方式的区别
第一种是“做为新项目检出,并使用新建项目向导进行配置(仅当资源库中不存在.project工程文件时才可用,意思是如果代码库中有了这个工程文件,那么它就认为这是一个信息完整的工程,在导入的过程中就不需要 ...
- Java IO流详解(四)——字符流Reader和Writer
前面一章介绍了字节流的使用,提到了字节流在处理utf-8编码的中文可能会出现乱码的情况(其他编码的中文同样会出现乱码),所以Java针对这一情况提供了字符流. 但是字符流只能处理字符,不能用来处理 . ...
- mac 重启php-fpm
查看php-fpm端口是否在被php-fpm使用 一般修改 php.ini 文件后经常需要重启php-fpm sudo killall php-fpm // 关闭 再输入 sudo lsof -i:9 ...
- 【SSM 】导出excel含图片
ExprotRentUtils package com.kikyo.stat.utils; import java.awt.image.BufferedImage; import java.io.By ...
- dp-简单迷宫捡金币
链接:https://ac.nowcoder.com/acm/challenge/terminal 吃货LP参加了珠海美食节,每见一家摊位都会大吃一顿,但是如果不加收敛,接下来的日子就只能吃土了,所以 ...
- 电子书及阅读器Demo
电子书阅读器(Kindle,电子纸技术.LCD.电子墨水技术等: 亚马逊/当当网站) 电子书产业可分5大环节:内容供应商.数字格式制作商.内容流通服务平台.传输平台以及终端阅读器产品. 全球电子书市 ...
- vue+element ui table组件封装,使用render渲染
后台管理经常会用到表格,一开始封装了一个常用的功能性表格,点击这里: 后来由于需求增加,在表格中还会用到switch,select,input等多种组件,每次都要在html中增加<el-tabl ...
- python知识点总结以及15道题的解析
先看知识点总结 一.序列操作符x in s 如果x是列表s的元素,返回True,否则Falses + t 连接两个序列s和ts*n或者n*s 将序列s复制n次s[i] 返回s中第i元素s[i:j]或s ...