上篇文章说了一些基本概念的东西,然后还有很多东西概念没有头绪,这篇文章我试着解释

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)的更多相关文章

  1. 试着把.net的GC讲清楚(1)

    什么是GC? GC(garbage collection)是对内存管理中回收已经不用的内存的一种机制,我们熟知的java和.net都有自己的GC机制,是内存管理的一部分. 为什么会有GC呢?是因为动态 ...

  2. 试着把.net的GC讲清楚(3)

    前两篇写的都是gc的一些概念和细节,这些东西对自己以后写代码有什么用,本篇我就准备将这些内容. root 第一篇文章中讲了GC在遍历存活对象的时候,都是从root开始的,root是一些对象的引用,例如 ...

  3. 《你不知道的JavaScript下卷》知识点笔记

    1. [1, 2, 3] == [1, 2, 3] 返回false [1, 2, 3] == “1, 2, 3” 返回true 2. 如果 < 比较的两个值都是字符串, 就像在b < c中 ...

  4. 试着讲清楚:js代码运行机制

    一. js运行机制 js执行引擎 经常看文章的说到js是带线程的,其实这个说法非常的模糊,准确的是js执行引擎是单线程的,js执行引擎就是js代码的执行器,有了这个概念就可以下来说说js是如何运行的了 ...

  5. 深入浅出聊优化:从Draw Calls到GC

    前言: 刚开始写这篇文章的时候选了一个很土的题目...<Unity3D优化全解析>.因为这是一篇临时起意才写的文章,而且陈述的都是既有的事实,因而给自己“文(dou)学(bi)”加工留下的 ...

  6. PHP新的垃圾回收机制:Zend GC详解

    概述 在5.2及更早版本的PHP中,没有专门的垃圾回收器GC(Garbage Collection),引擎在判断一个变量空间是否能够被释放的时候是依据这个变量的zval的refcount的值,如果re ...

  7. GitHub上那些值得一试的JAVA开源库--转

    原文地址:http://www.jianshu.com/p/ad40e6dd3789 作为一名程序员,你几乎每天都会使用到GitHub上的那些著名Java第三方库,比如Apache Commons,S ...

  8. 转:面试题:“你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?”

    转自:http://jeromecen1021.blog.163.com/blog/static/18851527120117274624888/ 面试题目: 地球人都知道,Java有个东西叫垃圾收集 ...

  9. 优化 从Draw Calls到GC

    原文出处: 慕容小匹夫的博客(@慕容小匹夫)   欢迎分享原创到伯乐头条 前言: 刚开始写这篇文章的时候选了一个很土的题目...<Unity3D优化全解析>.因为这是一篇临时起意才写的文章 ...

随机推荐

  1. Executors线程池

    强烈建议程序员使用较为方便的 Executors 工厂方法 Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收).Executors.newFixedTh ...

  2. C语言 模2除法

    C语言中的模2除法: 模2除做法与算术除法类似,但每一位除(减)的结果不影响其它位,即不向上一位借位.所以实际上就是异或.然后再移位移位做下一位的模2减. 步骤如下: a.用除数对被除数最高n位做模2 ...

  3. .net core 1.0 中的asp.net identity 基本使用(二)

    一.重写(覆盖)身份验证数据类型 1.修改Models目录中的ApplicationUser.cs类文件,如下 namespace xxxx.Models { //将应用程序用户的属性添加到应用程序 ...

  4. HBuilder连接IOS手机打开APP测试

    HBuilder是专为前端打造的开发工具,具有最全的语法库和浏览器兼容数据,以方便制作手机APP,最保护眼睛的绿柔设计等优点在近几年盛行: 开发移动端APP项目想要在手机真机上测试: 首先打开HBui ...

  5. webpack从0开始---(二)

    直接使用webpack进行打包 安装css loader,style loader(用来处理打包css文件) 命令行输入npm install css-loader style-loader --sa ...

  6. 常用API

    1 System类 System类包含一些有用的类和字段.它不能被实例化. 属性和方法都是静态的. 1.1 常见方法 返回以毫秒为单位的当前时间 public static long currentT ...

  7. java IO(四):键盘录入

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  8. js中的一元加法和一元减法

    大多数人都熟悉一元加法和一元减法,它们在 ECMAScript 中的用法与您高中数学中学到的用法相同. 一元加法本质上对数字无任何影响: var iNum = 20; iNum = +iNum; al ...

  9. python脚本检查TCP端口是否正常

    #!/usr/bin/python import socket import re import sys def check_server(address,port): s = socket.sock ...

  10. SDK,API概念

    什么是SDK什么是API? SDK 就是 Software Development Kit 的缩写,就是"软件开发工具包". 这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一 ...