说一说垃圾回收的原理,讲一下过程?
Posted 我是谁的谁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了说一说垃圾回收的原理,讲一下过程?相关的知识,希望对你有一定的参考价值。
垃圾回收:只回收托管堆中的内存资源,不回收其他资源(数据库连接、文件句柄、网络端口等)
什么样的对象才会被回收?答:没有变量引用的对象
什么时间回收?
系统回收,具体何时回收垃圾由系统自行确定,并不是即时执行回收的
手动调用垃圾回收器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一调用便释放非托管资源
以上是关于说一说垃圾回收的原理,讲一下过程?的主要内容,如果未能解决你的问题,请参考以下文章
53.垃圾回收算法的实现原理启动Java垃圾回收Java垃圾回收过程垃圾回收中实例的终结对象什么时候符合垃圾回收的条件GC Scope 示例程序GC OutOfMemoryError的示例