根据垃圾回收的算法,对象在内存中是按代的方式存放的,通常情况下,当第0代沾满分配的空间的时候(比如是256k),GC就会启动去回收第0代对象,幸存的第0代对象会被放入第1代中去,第1代的对象要等到放满了才会收集,因此,越是年轻的代越是被频繁的收集,由于通常情况下GC只收集第0代对象,既保证了可回收较多的内存,又忽略了老一代的对象,从而加快了垃圾回收的速度,提升了性能。

因此当调用gc.collect的时候,相当于强制的对所有代,不管年轻还是老的都执行一次回收。由于垃圾回收器在回收的资源的时候,正在执行托管代码的线程都会被挂起,具体的细节相当复杂,因为有的线程运行在不安全的点,CLR不能执行垃圾回收,因此CLR会采用线程劫持技术,即通过修改线程栈的方法,来做垃圾回收。这种复杂性使得性能降低。除非确定大量的旧对象死亡,才考虑调用这个方法。

所以,在一般情况下,尽量不要干预垃圾回收器工作,即尽量避免主动调用GC.Collect。

由于垃圾回收是异步的,CLR有一个专用的线程负责垃圾回收,因此,即使调用GC.Collect,也并不是实时的调用了Finalize,因此要保证确实调用了析构方法,可以使用语句GC.WaitForPendingFinalizers()。

下面是一段代码,通过注释掉

GC.Collect();

GC.WaitForPendingFinalizers();

语句,看出端倪。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
using System.Reflection;
namespace ConsoleApplication1
{class Program{static void Main(string[] args){AA aa1 = new AA("1");AA aa2 = new AA("2");AA aa3 = new AA("3");aa1 = null;aa2 = null;//GC.Collect();//GC.WaitForPendingFinalizers();var tmp = aa3;}}public class AA{public string id = "";public AA(string s){id = s;Console.WriteLine("对象AA_" + s + "被创建了");}~AA(){Console.WriteLine(id + " 析构函数被执行了");}}
}

当语句被注释掉的时候,虽然aa1和aa2都设成了null,但是垃圾回收并不是马上就把它们回收掉。对象可能都被放在第0代上,等进程结束的时候,由垃圾回收器一起回收。所以输出如下,顺序是321

但是当取消注释后,由于强制垃圾回收时,aa1对象和aa2对象都是null,因此就把它们回收掉了。顺序就是213了。

注意,如果aa1和aa2不设成null,那么强制回收时,并不认为这2个对象可以回收。因此还是会等到进程结束的时候才会回收。

GC.Collect如何影响垃圾回收相关推荐

  1. 趣谈GC技术,解密垃圾回收的玄学理

    趣谈GC技术,解密垃圾回收的玄学理论 GC的由来 一个例子引发的问题 GC的意义 GC算法 Reference Counting 循环引用 破环之道 作者介绍 开源项目介绍 大多数程序员在日常开发中常 ...

  2. 趣谈GC技术,解密垃圾回收的玄学理论(一)

    点击上方蓝字,关注我们~ 导语:大多数程序员在日常开发中常常会碰到GC的问题:OOM异常.GC停顿等,这些异常直接导致糟糕的用户体验,如果不能得到及时处理,还会严重影响应用程序的性能.本系列从GC的基 ...

  3. java_opts gc回收器_JVM之垃圾回收机制(GC)

    JVM之垃圾回收机制全解(GC)文章底部有思维导图,较为清晰,可参考 导读:垃圾回收是Java体系中最重要的组成部分之一,其提供了一套全自动的内存管理方案,要想掌握这套管理方案,就必须了解垃圾回收器的 ...

  4. golang 关闭gc 并手动gc_Golang垃圾回收 屏障技术

    作者:镜萱 垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行. Golang中的垃圾回收主要应用 ...

  5. system.gc会立即执行垃圾回收吗_JVM基础到实战03-垃圾回收概念

    1.为什么要进行垃圾回收? 不回收会造成内存泄漏 2.什么时候执行回收? 达到一定的比例,或者申请的内存超出了空闲内存,触发回收 3.如果是你,如何设计垃圾回收算法?就是回收哪些类型的对象 回收栈中没 ...

  6. GC算法-增量式垃圾回收

    概述 增量式垃圾回收也并不是一个新的回收算法, 而是结合之前算法的一种新的思路. 之前说的各种垃圾回收, 都需要暂停程序, 执行GC, 这就导致在GC执行期间, 程序得不到执行. 因此出现了增量式垃圾 ...

  7. GC算法-分代垃圾回收

    概述 分代垃圾回收并不是一个新的算法, 而是将之前的回收算法结合利用, 分场景使用. 简单来说, 分代垃圾回收的思路, 就是给每个对象都分配一个年龄, 年龄越大的, 活的越久, 被回收的概率就越小. ...

  8. java gc 对象可达性_JVM垃圾回收系列---GC Roots可达性分析

    JVM的垃圾回收对于Java开发人员来说是比较透明的,本文采用问答的形式进行展开,希望能够解释下垃圾回收的一些问题.那么首先第一个问题 问:什么样的对象会被回收. 答:已经死亡的对象,不可达的对象,肯 ...

  9. GC(Garbage Collection)垃圾回收机制

    垃圾回收机制: 主要三个任务:①分配内存,②确保被引用对象的内存不被错误的回收,③回收不再被引用的对象的内存空间 判断是否是可回收对象:(什么可以回收?) 使用有向图来记录和管理堆内存中的所有对象,通 ...

最新文章

  1. Zookeeper的java实例
  2. Aix oracle 自动启动,AIX如何自动启动和关闭软件的运行
  3. 环路的产生及RIP防环机制
  4. 身体对腐朽灵魂的一次震撼:向京的雕塑与观众的行为
  5. dm365工作笔记20130731
  6. 高级代码编辑器:sublime text 4 for Mac
  7. 关于SpringBoot场景启动器
  8. jqGrid专题:jqGrid原理
  9. linux下重启weblogic
  10. python变量作用域图解_图解python全局变量与局部变量相关知识
  11. 快捷键查看Emacs源码
  12. 每天30分钟搞Software Rendering--(0)搜集资料,阅读,了解
  13. CORE Transport Technologies宣布蓝牙航空货物跟踪系统重大升级
  14. iOS视频录制及gif图片制作
  15. 华为是怎样研发的(1)——概述
  16. 继屠呦呦后,下一个得诺奖的中国人可能是他?
  17. Mapped Statements collection does not contain value for的解决方法
  18. 2022小美赛认证杯数学建模D题完整原创成品来啦!
  19. Java设计模式-模板模式
  20. 失去优秀员工会付出惨痛的代价?

热门文章

  1. Python自动化开发学习15-css补充内容
  2. Linux下Apache虚拟主机配置
  3. WPF 快速制作可拖拽的对象和窗体
  4. Android Volley彻底解决(三),定制自己Request
  5. spring aop 应用实例
  6. Windows 7的VPC虚拟机自动不与主机时间同步的解决办法
  7. 如何提高表达能力——举手法则
  8. Memcached Java客户端2.6.1发布
  9. tensorflow 导入新的tensorflow实例
  10. 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(上)