.NET中的GC垃圾回收

Wesley13
• 阅读 482

本章将和大家分享.NET中的GC垃圾回收。

托管堆垃圾回收--CLR提供GC。

1、什么样的对象需要垃圾回收?

  托管资源+引用类型

  托管资源和非托管资源:

    托管的就是CLR控制的,例如:new的对象、string字符串、变量等;

    非托管不是CLR能控制的,例如:数据库连接、文件流、句柄、打印机连接等;

    using(SqlConnection)--被C#封装了用来管理那个非托管的数据库连接资源;

    只要是需要手动释放的,都是非托管的。

2、哪些对象的内存,能被GC回收?

  对象访问不到了,那就可以被回收了

  程序--入口--去找对象--建立对象图--访问不到的就是垃圾。

3、对象是如何分配在堆上?

  连续分配在堆上面,每次分配就先检查空间够不够。

4、什么时候执行GC?

  a、new对象时--临界点

  b、GC.Collect 强制GC

  c、程序退出时会GC

  a="123"

  a=null

  GC.Collect  可以GC,但是频繁GC是不好的,GC是全局的。

  如果项目中有6个小时才运行new一次,什么时候GC? 这6个小时都不GC,可以手动GC。

5、GC的过程是怎么样的呢?

  N个对象--全部对象标记为垃圾--入口开始遍历--访问到的就标记可以访问(+1)--遍历完就清理内存--产生不连续内存--压缩--地址移动--修改变量指向--所以会全局阻塞。

  清理内存分2种情况:

    a、无析构函数,直接清理内存。

    b、把对象转移到一个单独的队列,会有个析构器线程专门做这个(清理慢一些)通常在析构函数内部是用来做非托管资源释放,因为CLR肯定会调用,可以避免使用者忘记的情况。

6、垃圾回收策略

  对象分代:3代

  0代:第一次分配到堆,就是0代

  1代:经历了一次GC,依然还在的

  2代:经历了两次或以上GC,依然还在的

  垃圾回收时,优先回收0代,提升效率,最多也最容易释放。

  0代不够---找1代---1代不够才找2代--再不够就不够了。。

  大对象堆,没有分代,直接都是2代,80000字节以上就叫大对象。

  大对象堆没有分代这主要有2个原因:一是内存移动时如果是大对象则很耗资源;二是0代空间问题;

7、标准Dispose模式

using System;namespace MyGC{ /// <summary> /// 标准Dispose模式 ///  /// 析构函数:被动清理 /// Dispose:主动清理 /// </summary> public class StandardDispose : IDisposable {  /// <summary>  /// 演示创建一个非托管资源  /// </summary>  private stri.........
点赞
收藏
评论区
推荐文章
灯灯灯灯 灯灯灯灯
2年前
阿里面试被问到【垃圾回收器】,不会怎么办??
垃圾回收器GC分类与性能指标垃圾回收器概述1.垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。2.由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。3.从不同角度分析垃圾收集器,可以将GC分为不同的类型。Java不同版本新特性1.语法层面:Lambda表达式、switch、
Wesley13 Wesley13
2年前
java中的GC和内存泄漏
java中的GC1.GC是什么?为什么要有GC? GC是垃圾回收的意思。是指JVM清理不再使用的对象释放内存。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存.2\.需要GC的内存区域垃圾回收区域:主要针对无用堆对象回
Wesley13 Wesley13
2年前
C#内存泄漏的事例
C内存泄漏的事例一,使用非托管资源忘记及时Dispose(1) 使用完非托管资源一定要Dispose或者使用usingusing(FileStreamfsWritenewFileStream(path,FileMode.OpenOrCreate,FileAccess.Write))
Wesley13 Wesley13
2年前
C# 常见面试问题汇总
1、c垃圾回收机制  从以下方面入手展开: 1、压缩合并算法  2、代的机制 3、GC调用终结器 GarbageCollector  .NET采用了和Java类似的方法由CLR(CommonLanguageRuntime)来管理 .NET的GC机制有这样两个问题:  首先,GC并不是能释放所有的资源。它不能自动
Wesley13 Wesley13
2年前
Java G1 GC 垃圾回收深入浅出
1\.G1概览G1GC 全称是GarbageFirstGarbageCollector,垃圾优先垃圾回收器,以下简称G1。G1是HotSpotJVM的短停顿垃圾回收器。其实关于G1的论文早在2004年就有了,但是G1是在2012年4月发布的JDK7u4中才实现。从长期来说,G1旨在取代CMS(ConcurrentMark
Stella981 Stella981
2年前
JVM笔记整理
不对之处还望指正。垃圾回收1\.如何判断对象是垃圾对象?引用计数法在对象中添加一个引用计数器,当有地方引用这个对象的时候,引用计数器的值1,当引用失效时,则值1.此方式不能解决循环引用的问题。验证添加gc日志,\_005GC.javaverbose:gc
Stella981 Stella981
2年前
Python的垃圾回收机制
垃圾回收机制「垃圾回收(GC)」大家应该多多少少都了解过,什么是垃圾回收呢?垃圾回收GC的全拼是GarbageCollection,在维基百科的定义是:在计算机科学中,垃圾回收(英语:GarbageCollection,缩写为GC)是一种自动的内存管理机制。当一个电脑上的动态内存不再需要时,就应该予以释放,以让出内存,这种内存资源
Stella981 Stella981
2年前
JVM架构体系与GC命令小总结
!(https://oscimg.oschina.net/oscnet/052a011b9ad19376d76daa6b6dcb82fa032.png)1.Overview2.JVM架构体系1)垃圾回收对象存活性判断垃圾回收算法垃圾回收器(回收算法的具体实现)
Stella981 Stella981
2年前
JVM的GC算法总结
Java程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经失去标记,程序用不了它们了,对程序而言它们已经废弃),为了确保程序运行时的性能,java虚拟机在程序运行的过程中不断地进行自动的垃圾回收(GC),这就是我们的垃圾回收机制,关于垃圾回收我总结了一下几种:标记–清除算法(MarkSweep)
荀勗 荀勗
5个月前
WPF框架系列课程(小白进阶选择)
WPF主要编程模型通过托管代码公开。在WPF的早期设计阶段,曾有过大量关于如何界定系统的托管组件和非托管组件的争论。CLR提供一系列的功能,可以提高开发效率和可靠性(包括内存管理、错误处理和通用类型系统等),但这是需要付出代价的。PresentationF