.NET垃圾回收机制 GC
线程栈 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的更多相关文章
- 垃圾回收机制GC知识再总结兼谈如何用好GC
一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般 ...
- 垃圾回收机制GC知识再总结兼谈如何用好GC(转)
作者:Jeff Wong 出处:http://jeffwongishandsome.cnblogs.com/ 本文版权归作者和博客园共有,欢迎围观转载.转载时请您务必在文章明显位置给出原文链接,谢谢您 ...
- 垃圾回收机制GC知识再总结兼谈如何用好GC(其他信息: 内存不足)
来源 图像操作,易内存泄露,边界像素 一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对 ...
- .NET 之 垃圾回收机制GC
一.GC的必要性 1.应用程序对资源操作,通常简单分为以下几个步骤:为对应的资源分配内存 → 初始化内存 → 使用资源 → 清理资源 → 释放内存. 2.应用程序对资源(内存使用)管理的方式,常见的一 ...
- 垃圾回收机制GC
垃圾回收机制GC 我们已经知道,name = 'leethon'这一赋值变量的操作,是将变量与数据值相绑定. 而数据值是存储到内存中的,有时变量会重新赋值即绑定其他数据值,而使得原本的数据值无法通过变 ...
- C#垃圾回收机制(GC)
GC的前世与今生 虽然本文是以.net作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是 ...
- java垃圾回收机制GC
记得第一次总结java 的GC的时候,是刚开始在课堂上学习GC的时候,那时候许老师第一节java课 课后老师说同学们可以去深入理解一下java的GC机制: 但是是花费了三四个小时,翻看了<Thi ...
- 【C#复习总结】垃圾回收机制(GC)2
理解C#垃圾回收机制我们首先说一下CLR(公共语言运行时,Common Language Runtime)它和Java虚拟机一样是一个运行时环境,核心功能包括:内存管理.程序集加载.安全性.异步处理和 ...
- 【C#复习总结】垃圾回收机制(GC)1
摘要:今天我们漫谈C#中的垃圾回收机制,本文将从垃圾回收机制的原理讲起,希望对大家有所帮助. GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由 ...
- JVM与垃圾回收机制(GC)和类的生命周期
JVM运行时数据区 GC(垃圾回收机制) 什么是垃圾回收机制: 在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用的是对象,可能会导致内存的耗尽,所以垃圾回 ...
随机推荐
- ssh框架整合笔记
1.建立普通的Javaweb项目,导入项目所必须的jar包. 2.配置web.xml文件. web.xml 3.在src下建立struts.xml. struts.xm 4.在实体包下配置 实体名 ...
- Spring Boot + Vue 前后端分离,两种文件上传方式总结
在Vue.js 中,如果网络请求使用 axios ,并且使用了 ElementUI 库,那么一般来说,文件上传有两种不同的实现方案: 通过 Ajax 实现文件上传 通过 ElementUI 里边的 U ...
- python中线程和进程(二)
目录 线程同步 Event Lock RLock Condition Barrier semaphore GIL 线程同步 线程同步,即线程之间协同工作,一个线程访问某些数据时,其他线程不能访问这些数 ...
- Python-字符版gif图
一.背景 上一篇文章我们讲了怎么做自己的炫酷二维码,需要的移驾Python-炫酷二维码,本片文章我们讲述下怎么把一张图片处理成字符版图片,就是说使用字符替代每个像素的颜色,形成一个由字符组成的图片,并 ...
- 如何理解Axis?
前言 只有光头才能变强. 回顾前面: 从零开始学TensorFlow[01-搭建环境.HelloWorld篇] 什么是TensorFlow? TensorFlow读写数据 不知道大家最开始接触到axi ...
- Element-ui使用技巧
使用第三方字体包 把下载后的*.zip字体包放到项目中在main.js中引用. import "@/assets/font/iconfont.css"; 注意一定要放到elemen ...
- 关于.net导出数据到excel/word【占位符替换】
1]excel的占位符替换 效果如图 关键代码: ///savedFilePath需要保存的路径 templateDocPath模板路径 替换的关键字和值 格式 [姓名]$%$小王 public st ...
- 教程:关于如何通过Maven仓库安装Spire系列的 Java产品
Spire系列库中已发布的Java产品目前有三个,即Spire.PDF for Java.Spire.Presentation for Java.Spire.Barcode for Java.使用该J ...
- 用python复制图片、视频
图片复制 f_src = open('1.jpg','rb') content = f_src.read() f_copy = open('1-副本.jpg','wb') f_copy.write(c ...
- 折腾Java设计模式之解释器模式
解释器模式 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 意图 给定一个语言,定义它的文法表 ...