初步学习-----C#垃圾回收机制

原文地址:http://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA==&mid=206721898&idx=1&sn=dfaee0ae6fa092b1a6db5779d75c0a2d&scene=5#rd

下面是本菜鸟对上述大神文章简单总结,当然还有许多不足之处,希望大家还是看上面链接中的文章较好!

一基本原理:

计算机内存大致分为两种:栈和堆。C#中分为两种类型:值类型和引用类型。其中值类型主要存储在栈区(栈的机制实际通过类似链表实现的),引用类型实际内存分配在堆在队中,但栈区维护了引用类型的实际地址,类似的使用值类型存储方式,实现对指针的维护

当实例化一个引用类型的变量时会经过以下步骤:

1.计算索要实例化变量一共需要的字节数

2.计算实例化对象的额外所需的字节数(类型对象指针和同步快索引)

3.CLR检测是否有足够的内存

A.内存足够就直接分配,

B.内存不够,执行一次垃圾回收,再次检查内存是否足够,任然不足就抛出 OutMemeryException异常

二.检查不再使用的对象

每个应用程序都有一组根,每个根代表着一个存储对象(特指引用类型)

1.标记阶段,遍历所有的根,递归的方式,在有对象引用的根的同步块索引上设置标记

2.压缩阶段。该阶段垃圾收集器线性的遍历堆以寻找包含未标记对象的连续 区块。如果垃圾收集器找到了较小内存块,那么它忽略内存不计;如果找到 了较大的连续内存块,那么垃圾收集器将把内存中非垃圾对象搬移到这些连 续内存块中以压缩托管堆

三,代的概念

对象代(generation)的概念

0代,新创建的实例,CLR未对其做任何的检查

1代,CLR检查过一次,未被回收的对象

2代,CLR检查过二次及以上,仍然未被回收

CLR在程序初始时为每一代分配一定的内存空间,当创建对象发现内存不够,会执行一次垃圾回收机制。当0代内存够用时,不会回收1代中不可达对象。只有0代内存超出预算时,才会清理1代中的对象,这样一来程序仅需要标记部分对象就可以实现有效的垃圾回收机制。

时间: 2024-11-12 19:53:08

初步学习-----C#垃圾回收机制的相关文章

java基础学习之垃圾回收机制

回收过程: 1.发现无用的对象 2.回收无用对象占用的内存的空间. 垃圾回收相关算法: 1.引用计数法 堆中每个对象都有一个引用计数.被引用一次,计数加一.被引用变量值变为null,则计数减一. 到计数变为0,则表示为无用对象. 优点:算法简单 缺点:无法识别循环引用(相互引用对方,导致计数器不为0,但实际上已经不用它们了) 2.引用可达法(根搜索算法) 通过一系列的GC Roots的对象作为起始点,从这些根节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对

Java学习之垃圾回收机制

垃圾回收机制,依赖JRE和JVM,涉及操作系统中内存的分配与回收.依据所学,我猜想这种机制需要的数据结构是堆内存分配表(链),管理已分配和未分配的堆内存,对于已分配堆内存,需要知道由栈内存中的哪些变量引用.知道了这些,依赖垃圾检测和回收算法,把长期未得到栈变量引用的堆内存块回收,挂到未分配内存表中.清理完成后可能会进行碎片整理,相应地修改分配表. 垃圾检测和回收算法,会随着Java版本.操作系统不同而不同.而且垃圾检测和回收算法可以手动选择. 原文地址:https://www.cnblogs.c

虚拟机学习四-垃圾回收机制

重点关注几个问题: -对象已死吗? 采用引用计数法(不能解决相互循环引用问题)或可达性分析法. 引用计数法:计算对象的引用数,计数为0时对象被回收. 可达性分析:通过一系列的"GC Roots"的对象(如栈中引用的对象.方法区中类静态属性引用的对象.常量引用的对象)作为起始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(不可达),则这些对象时不可用的. -方法区中的回收 主要针对废弃的"常量"(程序中没有对象叫做“ab”,那常量

Java垃圾回收机制学习心得

本文章是我在学习Java垃圾回收机制中总结的知识点的整理,在此特别感谢http://www.cnblogs.com/andy-zcx/p/5522836.html和http://blog.csdn.net/zsuguangh/article/details/6429592的博客. 内存泄漏:内存泄漏是指内存空间使用完毕后未进行回收操作.一般来说,Java中的内存泄漏是因为内存对象生命周期超出其在程序中存在的时间长度 垃圾回收意义:解决编程时需要考虑的内存管理问题,有效解决内存泄漏问题,充分利用空

Java 垃圾回收机制学习

原文链接: http://blog.csdn.net/zsuguangh/article/details/6429592 自己学习总结: 1c++和java的内存使用的区别: 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾. 2: 触发主GC(Garbage Collector)的条件 1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用.因为GC在优先级最低的线程中进

python的内存管理与垃圾回收机制学习

一.python内存申请: 1.python的内存管理分为六层:最底的两层有OS控制.第三层是调用C的malloc和free等进行内存控制.第四层第五层是python的内存池.最上层使我们接触的直接对python对象进行操作. 2.python申请对象时候小于256Byte的字节申请回直接使用python自己的内存分配系统,当大于256Byte的时候会调用malloc直接分配一个256k的大内存空间.释放内存空间时候会回收到内存池中而不是直接调用free释放掉. 3.深浅拷贝的不同(id?内存地

JS学习之生命周期与垃圾回收机制

生命周期 变量或者函数在相应的作用域里存在的时间 局部变量和局部函数:不再使用就是生命周期的结束,在函数内声明,当函数执行完毕后,这个变量就不存在了 全局变量和全局函数:当声明完成以后在整个页面中都可以用,当页面关闭的时候生命周期结束 垃圾回收机制: 变量或者函数存在于内存当中,变量在使用完以后,没有在其他地方在使用就会被清除用来释放内存.垃圾回收机制会按照固定的时候周期性的执行 1 function test(){ 2 var n=10; // 在函数内声明,局部变量,在函数外面是访问不到的

【学习】012 垃圾回收机制算法分析

垃圾回收机制概述 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理.由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”.垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存. ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“

Java性能优化之JVM GC(垃圾回收机制)

Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成.GC优化很多时候就是减少stop-the-world 的发生. JVM GC回收哪个区域内的垃圾? 需要注意的是,JV