说一说垃圾回收的原理,讲一下过程?

垃圾回收:只回收托管堆中的内存资源,不回收其他资源(数据库连接、文件句柄、网络端口等)

什么样的对象才会被回收?答:没有变量引用的对象

什么时间回收?
系统回收,具体何时回收垃圾由系统自行确定,并不是即时执行回收的
手动调用垃圾回收器GC.Collect();,不建议使用,垃圾回收时会使程序暂停,影响程序性能

回收分为两个阶段: 标记 –> 压缩

基本工作原理就是遍历托管堆中的对象,标记哪些被使用对象(那些没人使用的就是所谓的垃圾),
然后把可达对象转移到一个连续的地址空间(也叫压缩),其余的所有没用的对象内存被回收掉。

垃圾回收运行机制:
垃圾收集器将托管堆中对象分为三代:0、1和2,在CLR初始化时,会选择为三代设置不同的阙值容量,一般为:第0代大约为256KB,第1代2MB,第2代10MB。容量越大效率越低,而GC收集器会自动调节其阙值容量来提升执行效率。在CLR初始化后,首先添加到托管堆中的对象都被定位第0代对象,当有垃圾回收执行时,未被回收的对象代龄将提升一级,变成第1代对象,而后新建对象仍未第0代对象。代龄越小表示对象越新,通常情况下其生命周期也最短,因此GC总是先收集第0代的不可达对象内存。
随着对象的不断创建,垃圾收集再次启动时则只会检查0代对象并回收0代垃圾对象。而1代对象由于未达到1代容量阙值,则不会进行垃圾回收操作,从而有效地提高了垃圾收集的效率,而这也是代龄机制在垃圾回收中的性能优化作用。当第0代对象释放的内存不足以创建新的对象,同时1代对象的体积也超出了容量阙值是,垃圾收集器将同时对0代和1代对象进行垃圾回收。回收之后,未被回收的1代对象变化2级对象,未被回收的0代对象升级为1代对象,而后新建的对象仍为第0代对象。

finalize和dispose区别:
• finalize由垃圾回收器调用;dispose由对象调用。
• finalize无需担心因为没有调用finalize而使非托管资源得不到释放,而dispose必须手动调用。
• finalize虽然无需担心因为没有调用finalize而使非托管资源得不到释放,但因为由垃圾回收器管理,不能保证立即释放非托管资源;而dispose一调用便释放非托管资源

时间: 2024-11-02 13:44:22

说一说垃圾回收的原理,讲一下过程?的相关文章

垃圾回收的原理

groot.createElement = function (html, id) { groot.dynamic[id] = id; return $(html).append("<input type='hidden' id=\"" + id + "\">") } 从上面得代码可以看出 函数在html代码片段的后面加了隐藏的input 并在 groot.dynamic加了添加了一个属性 function _collection()

JAVA虚拟机垃圾回收算法原理

除了释放不再被引用的对象外,垃圾收集器还要处理堆碎块.新的对象分配了空间,不再被引用的对象被释放,所以堆内存的空闲位置介于活动的对象之间.请求分配新对象时可能不得不增大堆空间的大小,虽然可以使用的总空闲空间是足够的.这是因为,堆中没有连续的空闲空间放得下新的对象. 垃圾收集器算法 任何垃圾回收算法都必须做两件事,首先,它必须检测出垃圾对象.其次,它必须回收垃圾对象所使用的堆空间并还给程序.从根对象开始,任何可以被触及的对象都被认为是“活动的”对象(如果正在运行的程序可以访问到根对象和某个对象之间

.NET垃圾回收(GC)原理

转载:http://mp.weixin.qq.com/s?__biz=MjM5MDI5MjAyMA==&mid=203643791&idx=1&sn=f65d23bcf7e270d1e69ac9fc5f648581&scene=1#rd 作为.NET进阶内容的一部分,垃圾回收器(简称GC)是必须了解的内容.本着“通俗易懂”的原则,本文将解释CLR中垃圾回收器的工作原理. 基础知识 托管堆(Managed Heap) 先来看MSDN的解释:初始化新进程时,运行时会为进程保留一

Java垃圾回收工作原理

在C++中,在heap上分配对象比在stack上分配对象更加昂贵.程序需要找到合适的内存块,再返回内存的地址.但是在Java中垃圾回收器显著地提高了在heap上分配对象的速度.听起来会有些怪,但是这就是Java垃圾回收器工作的方式.而且这意味着Java中在heap上分配对象几乎跟其他语言在stack上分配对象一样快. 比如说,C++中heap像是一个院子,每个对象占据自己的地盘.在一些JVM中,Java的heap更像是传送带,每次分配一个对象时,传送带就会往前进一点(而不需要寻找合适的内存空间)

JVM 及 垃圾回收机制原理

JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.JVM实现了Java语言最重要的特征:即平台无关性.原理:编译后的 Java 程序指令并不直接在硬件系统的 CPU 上执行,而是由 JVM 执行.JVM屏蔽了与具体平台相关的信息,使Java语言编译程序只需要生成在JVM上运行的目标字节码(.class),就可以在多种平台上不加修改地运行.Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行.因此实

java虚拟机的垃圾回收机制原理

1.常用的算法: a.引用计数法:为每一个对象配置一个整形计数器,当有一个引用时,计数器+1,引用失效时,计数器-1.计数器为0,进行垃圾回收 存在的问题:A对象引用B,B对象引用A.循环引用,无法清除,引起内存泄漏 java的垃圾回收器没有使用该算法 b.标记-清除算法 分标记阶段和清除阶段. 存在问题:释放后的空间不是连续的.内存分配不连续的空间,工作效率较低 c.复制算法 将内存空间分为两块,每次只使用其中一块,垃圾回收时,将正在使用的内存中存活的对象复制到未使用的内存中,然后,清除使用的

.Net 垃圾回收机制原理(一)

英文原文:Jeffrey Richter 编译:赵玉开 链接:http://www.cnblogs.com/yukaizhao/archive/2011/11/23/dot_net_GC_1.html 有了Microsoft.Net clr中的垃圾回收机制程序员不需要再关注什么时候释放内存,释放内存这件事儿完全由GC做了,对程序员来说是透明的.尽管如此,作为一个.Net程序员很有必要理解垃圾回收是如何工作的.这篇文章我们就来看下.Net是如何分配和管理托管内存的,之后再一步一步描述垃圾回收器工作

【译】.Net 垃圾回收机制原理(转)

上一篇文章介绍了.Net 垃圾回收的基本原理和垃圾回收执行Finalize方法的内部机制:这一篇我们看下弱引用对象,代,多线程垃圾回收,大对象处理以及和垃圾回收相关的性能计数器. 让我们从弱引用对象说起,弱引用对象可以减轻大对象带来的内存压力. 弱引用(Weak References) 当程序的根对象指向一个对象时,这个对象是可达的,垃圾回收器不能回收它,这称为对对象的强引用.和强引用相对的是弱引用,当一个对象上存在弱引用时,垃圾回收器可以回收此对象,但是也允许程序访问这个对象.这是怎么回事儿呢

[译]GC专家系列1: 理解Java垃圾回收

原文链接:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ 了解Java的垃圾回收(GC)原理能给我们带来什么好处?对于软件工程师来说,满足技术好奇心可算是一个,但重要的是理解GC能帮忙我们更好的编写Java应用程序. 上面是我个人的主观的看法,但我相信熟练掌握GC是成为优秀Java程序员的必备技能.如果你对GC执行过程感兴趣,也许你只是有一定的开发应用的经验:如果你仔细考虑过如何选择合适