线程栈 stuck:存值类型,和引用类型的引用  先进后出,链表形式,连续摆放 CLR(公共语言运行库(Common Language Runtime))启动进程,main函数为一个线程入口

进程堆heap:存引用类型 进程中的一块区域

IL:中间语言

对象的属性为值类型出现在堆里,方法里的值类型,由进程调用,出现在栈里

    /// <summary>
/// class 引用类型
/// </summary>
public class ReferenceTypeClass
{
private int _valueTypeField;//堆:因为对象都在堆里,对象里面的属性也在堆里
public ReferenceTypeClass()
{
_valueTypeField = ;
}
public void Method()
{
int valueTypeLocalVariable = ;//栈:全新的局部变量,线程栈来调用方法,然后分配内存
new Process();//new对象,分配在堆里
}
}

装箱拆箱(仅仅是说内存的拷贝动作):内存copy 也会浪费性能  通常都是因为object,

装箱拆箱只能发生在父子类里面, 因为这样你才能转换呀

dynamic 是引用类型的语法糖

                string student = "";
string student2 = student; Console.WriteLine(student); //
Console.WriteLine(student2);// student2 = "APP"; Console.WriteLine(student);//
Console.WriteLine(student2);//APP
     string student = "大山";
string student2 = "APP";//共享
student2 = "大山";
Console.WriteLine(object.ReferenceEquals(student, student2));//true 竟然一样
//就是同一个 享元模式 CLR内存分配字符串的时候,会查找相同值,有就重用了

托管资源:.Net  New的类,出了作用域就访问不到了,自动释放了,存放在进程堆中的资源; 值类型变量,存放在进程栈中,出了作用域就是放了,

非托管资源:访问数据库,操作Excel,Word什么的.

析构函数 ~Class() 见下图

    public class Class : IDisposable
{
public int ClassId { get; set; }
public string ClassName { get; set; }
~Class()
{
MyLog.Log($"执行{this.GetType().Name}Dispose");
}
public void Dispose()
{
MyLog.Log($"执行{this.GetType().Name}Dispose");
}
}

主要是用来释放非托管资源,等着GC去把非托管资源释放掉 系统自动执行
 GC.Collect();//主动GC(释放资源) GC回收的时候,CLR一定调用析构函数

Dispose() 也是释放非托管资源的,主动释放,方法本身是没有意义的,我们需要在方法里面实现对资源的释放
GC不会调用,而是用对象时,使用者主动调用这个方法(using),去释放非托管资源

总结:

1.循环New100个对象,出了作用域,就访问不到了,没有引用,.Net GC就释放了,但少New对象,创建对象需要内存开辟空间

2.实现Idispose() 接口的 使用Using 或调用dispose() 方法

3.操作Word或Excel 的时候 时候需要注意释放资源

前一段时间做了一个小程序,Word批量转PDF,运行的时候内存持续增加,加上释放资源就好了,见下图

   /// <summary>
/// word 操作类
/// </summary>
Microsoft.Office.Interop.Word.Application application = new Microsoft.Office.Interop.Word.Application();
/// <summary>
///word 转换成pdf
/// </summary>
/// <param name="sourcePath"></param>
/// <param name="targetPath"></param>
/// <returns></returns>
public bool WordToPDF(string sourcePath, string targetPath)
{ bool result = false; Microsoft.Office.Interop.Word.Document _document = null;
// application.
try
{
application.Visible = false;
_document = application.Documents.Open(sourcePath);
_document.ExportAsFixedFormat(targetPath,
Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF);
result = true;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
result = false;
}
finally
{
var doc_close = (Microsoft.Office.Interop.Word._Document)_document;
if (doc_close != null)
{
doc_close.Close();
}
else
{
result = false;
} // _document.Close();
}
return result;
}

4.访问数据库的时候还没看

.NET垃圾回收机制 GC的更多相关文章

  1. 垃圾回收机制GC知识再总结兼谈如何用好GC

    一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般 ...

  2. 垃圾回收机制GC知识再总结兼谈如何用好GC(转)

    作者:Jeff Wong 出处:http://jeffwongishandsome.cnblogs.com/ 本文版权归作者和博客园共有,欢迎围观转载.转载时请您务必在文章明显位置给出原文链接,谢谢您 ...

  3. 垃圾回收机制GC知识再总结兼谈如何用好GC(其他信息: 内存不足)

    来源 图像操作,易内存泄露,边界像素 一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对 ...

  4. .NET 之 垃圾回收机制GC

    一.GC的必要性 1.应用程序对资源操作,通常简单分为以下几个步骤:为对应的资源分配内存 → 初始化内存 → 使用资源 → 清理资源 → 释放内存. 2.应用程序对资源(内存使用)管理的方式,常见的一 ...

  5. 垃圾回收机制GC

    垃圾回收机制GC 我们已经知道,name = 'leethon'这一赋值变量的操作,是将变量与数据值相绑定. 而数据值是存储到内存中的,有时变量会重新赋值即绑定其他数据值,而使得原本的数据值无法通过变 ...

  6. C#垃圾回收机制(GC)

    GC的前世与今生 虽然本文是以.net作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是 ...

  7. java垃圾回收机制GC

    记得第一次总结java 的GC的时候,是刚开始在课堂上学习GC的时候,那时候许老师第一节java课 课后老师说同学们可以去深入理解一下java的GC机制: 但是是花费了三四个小时,翻看了<Thi ...

  8. 【C#复习总结】垃圾回收机制(GC)2

    理解C#垃圾回收机制我们首先说一下CLR(公共语言运行时,Common Language Runtime)它和Java虚拟机一样是一个运行时环境,核心功能包括:内存管理.程序集加载.安全性.异步处理和 ...

  9. 【C#复习总结】垃圾回收机制(GC)1

    摘要:今天我们漫谈C#中的垃圾回收机制,本文将从垃圾回收机制的原理讲起,希望对大家有所帮助. GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由 ...

  10. JVM与垃圾回收机制(GC)和类的生命周期

    JVM运行时数据区 GC(垃圾回收机制) 什么是垃圾回收机制: 在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用的是对象,可能会导致内存的耗尽,所以垃圾回 ...

随机推荐

  1. ssh框架整合笔记

    1.建立普通的Javaweb项目,导入项目所必须的jar包. 2.配置web.xml文件. web.xml  3.在src下建立struts.xml. struts.xm 4.在实体包下配置  实体名 ...

  2. Spring Boot + Vue 前后端分离,两种文件上传方式总结

    在Vue.js 中,如果网络请求使用 axios ,并且使用了 ElementUI 库,那么一般来说,文件上传有两种不同的实现方案: 通过 Ajax 实现文件上传 通过 ElementUI 里边的 U ...

  3. python中线程和进程(二)

    目录 线程同步 Event Lock RLock Condition Barrier semaphore GIL 线程同步 线程同步,即线程之间协同工作,一个线程访问某些数据时,其他线程不能访问这些数 ...

  4. Python-字符版gif图

    一.背景 上一篇文章我们讲了怎么做自己的炫酷二维码,需要的移驾Python-炫酷二维码,本片文章我们讲述下怎么把一张图片处理成字符版图片,就是说使用字符替代每个像素的颜色,形成一个由字符组成的图片,并 ...

  5. 如何理解Axis?

    前言 只有光头才能变强. 回顾前面: 从零开始学TensorFlow[01-搭建环境.HelloWorld篇] 什么是TensorFlow? TensorFlow读写数据 不知道大家最开始接触到axi ...

  6. Element-ui使用技巧

    使用第三方字体包 把下载后的*.zip字体包放到项目中在main.js中引用. import "@/assets/font/iconfont.css"; 注意一定要放到elemen ...

  7. 关于.net导出数据到excel/word【占位符替换】

    1]excel的占位符替换 效果如图 关键代码: ///savedFilePath需要保存的路径 templateDocPath模板路径 替换的关键字和值 格式 [姓名]$%$小王 public st ...

  8. 教程:关于如何通过Maven仓库安装Spire系列的 Java产品

    Spire系列库中已发布的Java产品目前有三个,即Spire.PDF for Java.Spire.Presentation for Java.Spire.Barcode for Java.使用该J ...

  9. 用python复制图片、视频

    图片复制 f_src = open('1.jpg','rb') content = f_src.read() f_copy = open('1-副本.jpg','wb') f_copy.write(c ...

  10. 折腾Java设计模式之解释器模式

    解释器模式 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 意图 给定一个语言,定义它的文法表 ...