GC.Collect如何影响垃圾回收
根据垃圾回收的算法,对象在内存中是按代的方式存放的,通常情况下,当第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如何影响垃圾回收相关推荐
- 趣谈GC技术,解密垃圾回收的玄学理
趣谈GC技术,解密垃圾回收的玄学理论 GC的由来 一个例子引发的问题 GC的意义 GC算法 Reference Counting 循环引用 破环之道 作者介绍 开源项目介绍 大多数程序员在日常开发中常 ...
- 趣谈GC技术,解密垃圾回收的玄学理论(一)
点击上方蓝字,关注我们~ 导语:大多数程序员在日常开发中常常会碰到GC的问题:OOM异常.GC停顿等,这些异常直接导致糟糕的用户体验,如果不能得到及时处理,还会严重影响应用程序的性能.本系列从GC的基 ...
- java_opts gc回收器_JVM之垃圾回收机制(GC)
JVM之垃圾回收机制全解(GC)文章底部有思维导图,较为清晰,可参考 导读:垃圾回收是Java体系中最重要的组成部分之一,其提供了一套全自动的内存管理方案,要想掌握这套管理方案,就必须了解垃圾回收器的 ...
- golang 关闭gc 并手动gc_Golang垃圾回收 屏障技术
作者:镜萱 垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行. Golang中的垃圾回收主要应用 ...
- system.gc会立即执行垃圾回收吗_JVM基础到实战03-垃圾回收概念
1.为什么要进行垃圾回收? 不回收会造成内存泄漏 2.什么时候执行回收? 达到一定的比例,或者申请的内存超出了空闲内存,触发回收 3.如果是你,如何设计垃圾回收算法?就是回收哪些类型的对象 回收栈中没 ...
- GC算法-增量式垃圾回收
概述 增量式垃圾回收也并不是一个新的回收算法, 而是结合之前算法的一种新的思路. 之前说的各种垃圾回收, 都需要暂停程序, 执行GC, 这就导致在GC执行期间, 程序得不到执行. 因此出现了增量式垃圾 ...
- GC算法-分代垃圾回收
概述 分代垃圾回收并不是一个新的算法, 而是将之前的回收算法结合利用, 分场景使用. 简单来说, 分代垃圾回收的思路, 就是给每个对象都分配一个年龄, 年龄越大的, 活的越久, 被回收的概率就越小. ...
- java gc 对象可达性_JVM垃圾回收系列---GC Roots可达性分析
JVM的垃圾回收对于Java开发人员来说是比较透明的,本文采用问答的形式进行展开,希望能够解释下垃圾回收的一些问题.那么首先第一个问题 问:什么样的对象会被回收. 答:已经死亡的对象,不可达的对象,肯 ...
- GC(Garbage Collection)垃圾回收机制
垃圾回收机制: 主要三个任务:①分配内存,②确保被引用对象的内存不被错误的回收,③回收不再被引用的对象的内存空间 判断是否是可回收对象:(什么可以回收?) 使用有向图来记录和管理堆内存中的所有对象,通 ...
最新文章
- Zookeeper的java实例
- Aix oracle 自动启动,AIX如何自动启动和关闭软件的运行
- 环路的产生及RIP防环机制
- 身体对腐朽灵魂的一次震撼:向京的雕塑与观众的行为
- dm365工作笔记20130731
- 高级代码编辑器:sublime text 4 for Mac
- 关于SpringBoot场景启动器
- jqGrid专题:jqGrid原理
- linux下重启weblogic
- python变量作用域图解_图解python全局变量与局部变量相关知识
- 快捷键查看Emacs源码
- 每天30分钟搞Software Rendering--(0)搜集资料,阅读,了解
- CORE Transport Technologies宣布蓝牙航空货物跟踪系统重大升级
- iOS视频录制及gif图片制作
- 华为是怎样研发的(1)——概述
- 继屠呦呦后,下一个得诺奖的中国人可能是他?
- Mapped Statements collection does not contain value for的解决方法
- 2022小美赛认证杯数学建模D题完整原创成品来啦!
- Java设计模式-模板模式
- 失去优秀员工会付出惨痛的代价?