C#托管堆和垃圾回收
垃圾回收
- 值类型
- 每次使用都有对应新的线程栈 用完自动释放
- 引用类型
- 全局公用一个堆 因此需要垃圾回收
- 操作系统
- 内存是链式分配
- CLR
- 内存连续分配(数组) 要求所有对象从 托管堆分配
- GC
- 触发条件
- New对象时 计算是否有足够的空间来分配该对象 若空间不足 则CLR就执行GC
- 显示调用Collect 强制回收
- Windows报告内存过低
- CLR 卸载AppDomain时 CLR认为不存在根 开始对所有代进行GC
- CLR正在关闭 进程要终止了
- 垃圾回收算法-- 引用跟踪算法
- 该算法只关心引用变量--因为引用变量才能引用堆上对象、值类型直接包含类型实例
- 所有引用类型变量都称为-- 根
- GC过程
- 暂停进程中所有线程
- CLR进入GC标记阶段 遍历堆中所有对象 将同步块索引字段中的位设为0(表明所有对象都应删除)
- 检查所有活动根 查看根所引用的对象 所有被引用对象的同步块索引字段中的位设为1 进行标记(对象被标记后 CLR会检查被标记对象中的根 并标记它们引用的对象 如果一个对象已被标记 则不重新检查该对象 避免死循环) 【已标记对象-- 可达对象 反之 不可达对象 】
- GC开始压缩--删除不可达对象 并将可达对象 移动至一块连续的内存空间 【内存连续 实现了引用的 局部化 减少了程序的工作集 提高了访问性能】
- GC常见BUG
- OutOfMemoryException--若CLR在GC后没有回收到足够内存 无法对新对象进行分配 便会抛此异常(其中静态字段引用对象 会一直存在知道AppDomain卸载为止 所以让静态字段引用某个集合对象 然后不停的向集合添加数据 常常是内存泄漏的原因之一)
- 引用对象 t=null 并不会实现对象的回收 因为JIT编译器是一个优化编译器 对于将局部变量或参数设为null时 JIT会将t=null 整行代码优化掉
- 性能提升--基于代的垃圾回收器
- 只支持3代 0代 1代 2代 经历一次GC 代会提升一次 0代总是最新的对象 2代是最老的对象 很少回收2代变量 CLR初始化时 会为每一代选择预算内存大小
- 垃圾回收器每次会根据引用 构建 可达对象图 再根据可达对象图 进行回收 提高性能
- CLR的垃圾回收器是自调节的 会自动根据程序需求调节代的内存分配
- GC模式
- 工作站模式--客户端应用程序优化
- 服务器模式--主要优化吞吐量、资源利用
- 触发条件
C#托管堆和垃圾回收的更多相关文章
- 【C#进阶系列】21 托管堆和垃圾回收
托管堆基础 一般创建一个对象就是通过调用IL指令newobj分配内存,然后初始化内存,也就是实例构造器时做这个事. 然后在使用完对象后,摧毁资源的状态以进行清理,然后由垃圾回收器来释放内存. 托管堆除 ...
- .NET 托管堆和垃圾回收
托管堆基础 简述:每个程序都要使用这样或那样的资源,包括文件.内存缓冲区.屏幕空间.网络连接.....事实上,在面向对象的环境中,每个类型都代表可供程序使用的一种资源.要使用这些资源,必须为代表 ...
- 【CLR】解析CLR的托管堆和垃圾回收
目录结构: contents structure [+] 为什么使用托管堆 从托管堆中分配资源 托管堆中的垃圾回收 垃圾回收算法 代 垃圾回收模式 垃圾回收触发条件 强制垃圾回收 监视内存 对包装了本 ...
- 重温CLR(十五) 托管堆和垃圾回收
本章要讨论托管应用程序如何构造新对象,托管堆如何控制这些对象的生存期,以及如何回收这些对象的内存.简单地说,本章要解释clr中的垃圾回收期是如何工作的,还要解释相关的性能问题.另外,本章讨论了如何设计 ...
- CLR via C# 读书笔记-21.托管堆和垃圾回收
前言 近段时间工作需要用到了这块知识,遂加急补了一下基础,CLR中这一章节反复看了好多遍,得知一二,便记录下来,给自己做一个学习记录,也希望不对地方能够得到补充指点. 1,.托管代码和非托管代码的区别 ...
- 托管堆和垃圾回收(GC)
一.基础 首先,为了深入了解垃圾回收(GC),我们要了解一些基础知识: CLR:Common Language Runtime,即公共语言运行时,是一个可由多种面向CLR的编程语言使用的"运 ...
- cir from c# 托管堆和垃圾回收
1,托管堆基础 调用IL的newobj 为资源分配内存 初始化内存,设置其初始状态并使资源可用.类型的实列构造器负责设置初始化状态 访问类型的成员来使用资源 摧毁状态进行清理 释放内存//垃圾回收期负 ...
- 如何管好.net的内存(托管堆和垃圾回收)
一:C#标准Dispose模式的实现 需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CL ...
- NET的堆和栈04,对托管和非托管资源的垃圾回收以及内存分配
在" .NET的堆和栈01,基本概念.值类型内存分配"中,了解了"堆"和"栈"的基本概念,以及值类型的内存分配.我们知道:当执行一个方法的时 ...
随机推荐
- matlab——插值与拟合
@ 目录 前言 一.拟合 1.定义 2.三种判别准则 3.最小二乘法 (1)一般形式 (2)常用函数 (3)matlab实现 二.插值 1.定义 2.方法 (1)分段线性插值 (2)拉格朗日插值多项式 ...
- java集合(2)-Collection与Iterator接口
1 package com.j1803.collectionOfIterator; 2 import java.util.ArrayList; 3 import java.util.Collectio ...
- final修饰符(7)-缓存实例的不可变类
不可变类的实例状态不可改变,可以很方便地被多个对象所共享,可以考虑缓存这种不可变类的实例
- 2021.07.21 NPCBOT增加人类的SS和74
#ssinsert into `creature_template_npcbot_appearance`(`entry`,`name*`,`gender`,`skin`,`face`,`hair`,` ...
- 【Azure Redis 缓存】Azure Redis出现了超时问题后,记录一步一步的排查出异常的客户端连接和所执行命令的步骤
问题描述 Azure Redis在使用的过程中,多次无规律的出现超时问题.抓取到客户端的异常错误后,想进一步的分析是何原因导致了如下异常呢? Timeout awaiting response (ou ...
- python + mysql 实现表删除数据
实例如下: import pymysqldef Delete_From(): #打开数据库链接 db = pymysql.connect("localhost","roo ...
- Java成长之路--一个非科班生的进阶之路
前言 笔者从事Java开发六年有余,从什么都不懂的小白一路成长到上市公司管理20人的技术leader.管理的团队,虽然人数不算多,但也是对于我这个非科班生这么多年努力的一种肯定.在技术的道路上,我没有 ...
- ASP.NET中<%=%>、<%%>、<%@%>、<%#%>的用法与区别
1.<%= %> 里面放变量名,获取后台的变量值,直接输入变量到页面上,里面放的变量名,未经过encode eg: 后台: seession["ab"]=ab; 前台: ...
- 构建前端第7篇之---elementUI设置主题,进而改变全局button底色
张艳涛写于2020-1-20 What:是elementUI主题? 是内置的格式,elementUI默认只有一个主题,如果想整体替换按钮的颜色等问题,那么就可以用主题 设置步骤 在路径src/styl ...
- 用 JavaScript 刷 LeetCode 的正确姿势【进阶】
之前写了篇文章 用JavaScript刷LeetCode的正确姿势,简单总结一些用 JavaScript 刷力扣的基本调试技巧.最近又刷了点题,总结了些数据结构和算法,希望能对各为 JSer 刷题提供 ...