试着把.net的GC讲清楚(2)
上篇文章说了一些基本概念的东西,然后还有很多东西概念没有头绪,这篇文章我试着解释
GC的回收算法详细步骤?
上篇]文章讲了.net GC的算法是Mark and Compact,不过到底是怎么执行的,我这几天查了资料,找到一篇博客说明了,它分为了几个阶段
Mark phase
这个阶段没得说,就是标记存活对象的,不考虑Weak Reference(弱引用)对象
Plan phase
这个阶段是决定是执行Compact还是直接执行Sweep(上篇讲到猜测LOH执行的是的Mark and Sweep,其实是不正确的)
Relocate phase
这个阶段是Plan phase决定Compact后,开始对需要移动的对象进行地址重新计算,注意这个时候并不移动,只是重新计算地址
Compact phase
这个阶段开始移动对象。
Sweep phase
移动完成对象了还需要Sweep?是因为,GC把所有的对象都修改为了连续的,其中一些对象被回收后还是在存活对象之间。Sweep就是使用Free Object把这些空白的内存填充起来,并添加到一个叫Free list里面。
为什么要用Free object创建填充?不是很清楚,猜测是为了下次回收的时候一块把连续的内存回收了。
为什么会有LOH?
LOH存在的意义也就是为了性能;大对象太大了,移动花费时间太长了,所以做了一个LOH专门存储大对象,这样对他们就区别对待了。
上篇文章说过,>=85000字节就分配到LOH中,为什么是85000?这几天找了很多,发现了是因为在GC申请内存的时候,每次向操作系统申请的一个内存块大小为8k(Allocation Quantum),估摸着跟这个数值有关。
LOH其它一些信息
再次看到一个新颖的说法,说是LOH的gen是3,而不是2,待定
workstation,server GC模式到底区别是啥?
- workstation GC:这么说吧,它非常的保守的进行内存什么的管理,有点像守财奴,一点点的申请,所以GC申请内存小点。
- Server GC:就是那种暴发户,往大了申请内存,越多越好,所以可以预见到Server GC模式下,内存耗费是非常惊人的,在查找资料的时候有人在docker中运行.net core的程序,占用内存太大了被重启,改了workstation gc后内存就大幅下降。
其它的concurrent其实就是gc线程是和用户线程可以并行执行的,提高了程序性能,减少了GC时的等待时间
参考
试着把.net的GC讲清楚(2)的更多相关文章
- 试着把.net的GC讲清楚(1)
什么是GC? GC(garbage collection)是对内存管理中回收已经不用的内存的一种机制,我们熟知的java和.net都有自己的GC机制,是内存管理的一部分. 为什么会有GC呢?是因为动态 ...
- 试着把.net的GC讲清楚(3)
前两篇写的都是gc的一些概念和细节,这些东西对自己以后写代码有什么用,本篇我就准备将这些内容. root 第一篇文章中讲了GC在遍历存活对象的时候,都是从root开始的,root是一些对象的引用,例如 ...
- 《你不知道的JavaScript下卷》知识点笔记
1. [1, 2, 3] == [1, 2, 3] 返回false [1, 2, 3] == “1, 2, 3” 返回true 2. 如果 < 比较的两个值都是字符串, 就像在b < c中 ...
- 试着讲清楚:js代码运行机制
一. js运行机制 js执行引擎 经常看文章的说到js是带线程的,其实这个说法非常的模糊,准确的是js执行引擎是单线程的,js执行引擎就是js代码的执行器,有了这个概念就可以下来说说js是如何运行的了 ...
- 深入浅出聊优化:从Draw Calls到GC
前言: 刚开始写这篇文章的时候选了一个很土的题目...<Unity3D优化全解析>.因为这是一篇临时起意才写的文章,而且陈述的都是既有的事实,因而给自己“文(dou)学(bi)”加工留下的 ...
- PHP新的垃圾回收机制:Zend GC详解
概述 在5.2及更早版本的PHP中,没有专门的垃圾回收器GC(Garbage Collection),引擎在判断一个变量空间是否能够被释放的时候是依据这个变量的zval的refcount的值,如果re ...
- GitHub上那些值得一试的JAVA开源库--转
原文地址:http://www.jianshu.com/p/ad40e6dd3789 作为一名程序员,你几乎每天都会使用到GitHub上的那些著名Java第三方库,比如Apache Commons,S ...
- 转:面试题:“你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?”
转自:http://jeromecen1021.blog.163.com/blog/static/18851527120117274624888/ 面试题目: 地球人都知道,Java有个东西叫垃圾收集 ...
- 优化 从Draw Calls到GC
原文出处: 慕容小匹夫的博客(@慕容小匹夫) 欢迎分享原创到伯乐头条 前言: 刚开始写这篇文章的时候选了一个很土的题目...<Unity3D优化全解析>.因为这是一篇临时起意才写的文章 ...
随机推荐
- MyBatis之基于XML的动态SQL
先说下我的梦想,大学的时候一直想着是能开店卖胡辣汤,到目前依然还是我的梦想,上周一家出版社联系我问我有没有时间可以合作出书,这也是我的梦想之一,想了想还是放弃了,至少觉得目前不行,毕竟工作还不到五年, ...
- postgresql+mybatis返回值是数据库字段名
mybatis 返回map的时候是下划线 role_id, user_id 两种解决方法 1.重命名 postgresql不支持驼峰 加上双引号重命名 SELECT role_id "ro ...
- 【jsp】MyEclipse10.7.1最新版+破解下载
MyEclipse企业级工作平台[1](MyEclipse Enterprise Workbench ,简称MyEclipse)是对EclipseIDE的扩展,利用它我们可以在数据库和JavaEE的开 ...
- 改变UITableView选中行高亮的颜色
UIView *backView = [[UIView alloc] initWithFrame:self.contentView.frame]; backView.backgroundColor = ...
- assembly 基础
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- python_8_字典
什么是字典? --key -value 的数据类型,找到key就可以找到对应的值 --字典形式:{key1:value1,key2:value2,......} #!/usr/bin/python3 ...
- 网络编程之UDP编程
网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...
- <global-results>标签来定义全局的<result>
<global-results> <result name="error">/Error.jsp</result> <!-- Ac ...
- 【转】C++易混知识点3. New Operator, Operator New, Placement New 实例分析,比较区别
我们知道,C++中引入了New 这个内置符号,很大方便了指针的使用,程序员不必关注与这块堆上新分配的内存是如何来的,如何初始化的,然后如何转换为我们想要的类型指针的.现在,我们重点来分析下这个NEW内 ...
- 【转】Linux Oracle服务启动&停止脚本与开机自启动
在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设置相关参数,首先先介 ...