学习笔记: 异常状态管理,托管堆垃圾回收,CLR寄宿
1. 
2. string 在内存中是连续分配的,是一个数组, 数组的特点就是 查询块,增删慢,改动Array导致所有数组成员地址变动,成本高 而string又是在程序中经常变动的 ,所有 clr中对 string 这种引用类型做特殊处理, 使用字面量声明 string时, 会先到string驻留池中查找 要声明的值有无,有直接把 池中实例地址返回 赋值给变量 .无则 新增

3. CLR的内存分配

4. GC 相关
析构函数 类型名称价加个~ 单独的处理,把这些对象放入一个队列单独处理,但是不知道什么时候去调用后析构函数
主要是用来释放非托管资源


析构函数 与 Dispose() 都是用来非托管资源的 , 有什么区别
被动 主动释放
如下图代码, using 代码块结束后, 会调用student的 dispose方法
如果 项目中需要封装一些 非托管资源供别人调用 , 实现Idispose接口的 一般逻辑是: 参考下 Student 类的实现
1. 假如别人用我的代码时 使用了dispose() 方法来释放资源, 手动调用 GC.SuppressFinalize(this) 告诉GC 不需要你来释放了 (提供主动释放方式,最快释放非托管资源)
2. 如果使用我代码的 没调用 dispose() , Student中的 析构函数 确保该资源能被 GC 回收 (保底)

public class People : IDisposable
{
public string Remark { get; set; }
public virtual void Dispose()
{
MyLog.Log($"执行{this.GetType().Name}Dispose");
}
} public class Student : People, IDisposable
{
public int Id { get; set; }
public string Name { get; set; }
public Class Class { get; set; } public override void Dispose()//提供主动释放方式
{
base.Dispose();//把我引用的其他东西给清理掉
if (this.Class != null)
{
this.Class.Dispose();
}
//通知垃圾回收机制不再调用终结器(析构器)
GC.SuppressFinalize(this);
MyLog.Log($"执行{this.GetType().Name}Dispose");
} public void Study()
{
Console.WriteLine("跟着Eleven老师学习.Net高级开发");
} ~Student()//保证垃圾回收时 一定会把非托管资源释放
{
MyLog.Log($"执行{this.GetType().Name}Dispose");
}
} 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");
}
}
学习笔记: 异常状态管理,托管堆垃圾回收,CLR寄宿的更多相关文章
- Java编程思想学习笔记_1(Java内存和垃圾回收)
1.Java中对象的存储数据的地方: 共有五个不同的地方可以存储数据. 1)寄存器.最快,因为位于处理器的内部,寄存器按需求分配,不能直接控制. 2)堆栈.位于通用RAM,通过堆栈指针可以从处理器那里 ...
- JVM 学习(一)反射、垃圾回收、异常处理--- 2019年4月
1.JVM 基础知识点 JVM 虚拟机包含了:自动内存管理器.垃圾回收(垃圾回收调优). 执行顺序:Java 代码 --- .class 字节码文件(加载到虚拟机中) --- Java 类放在方法区中 ...
- JVM内存管理机制和垃圾回收机制
JVM内存管理机制和垃圾回收机制 JVM结构 图片描述: java源码编译成class文件 class文件通过类加载器加载到内存 其中方法区存放的是运行时的常量.静态变量.类信息等,被所有线程共享 堆 ...
- Erlang进程堆垃圾回收机制
原文:Erlang进程堆垃圾回收机制 作者:http://blog.csdn.net/mycwq 每一个Erlang进程创建之后都会有自己的PCB,栈,私有堆.erlang不知道他创建的进程会用到哪种 ...
- java虚拟机学习记录(内存划分、垃圾回收、类加载等机制)
一直以来觉得虚拟机是Java最难的一部分,涉及最底层的原理,学起来难度很大,而且工作中基本上用不到这些原理,所以对这部分“敬而远之”.现如今工作五年了,从Java基础到算法.数据结构.网络.数据库.设 ...
- JVM学习笔记-内存管理
第一章 内存分配 1. 内存区域. 方法区和堆(线程共享),程序计数器 , VM栈 和 本地方法栈(线程隔离). 1) java虚拟机栈:线程私有.描写叙述的是java方法执行的内存模 ...
- JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代
内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...
- MongoDB学习笔记—权限管理
1.MongoDB权限介绍 a 上篇文章中,我们在Linux下配置了MongoDB环境并且将其设置为服务随机器启动而启动,那么接下来这篇文章我们就来简单说一下MongoDB下对登录用户权限的管理. b ...
- java虚拟机学习-JVM调优总结-基本垃圾回收算法(7)
可以从不同的的角度去划分垃圾回收算法: 1.按照基本回收策略分 引用计数(Reference Counting): 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计 ...
随机推荐
- 部署alinode监控线上应用
参考: https://segmentfault.com/a/1190000013089124
- vue生命週期
https://www.cnblogs.com/fly_dragon/p/6220273.html https://www.cnblogs.com/fly_dragon/p/6220273.html
- Lodop简答问答大全
其他相关简短问答:Lodop简短问答客户反馈篇 及排查步骤 及注册相关,Lodop某个电脑打印内容大小有问题,LODOP超文本简短问答和相关内容,LODOP.C-Lodop简短排查语句.Lodop.c ...
- Python 字符编码及其文件操作
本章节内容导航: 1.字符编码:人识别的语言与机器机器识别的语言转化的媒介. 2.字符与字节:字符占多少个字节,字符串转化 3.文件操作:操作硬盘中的一块区域:读写操作 注:浅拷贝与深拷贝 用法: d ...
- IntelliJ IDEA 2018 设置代码超出限制自动换行(最新版)
环境信息 * IntelliJ IDEA版本:ULTIMATE 2018.2.3:* 系统:Windows 10: 怎么设置IntelliJ IDEA 2018代码一行的换行宽度限制呢? 设置方法:` ...
- H5的表格
表格标签<table> 绘制表格的标签:<table>标签 表格标题:<caption>标签 表格宽度与高度:width和height属性 表格边框色:border ...
- di.xml
di.xml文件 该di.xml文件配置对象管理器要注入的依赖项. 领域和应用入口点 每个 模块 都可以具有全局和区域特定的di.xml文件.Magento读取di.xml系统中声明的所有配置文件,并 ...
- 绕过阿里云waf进行SQL注入
做个笔记吧,某SQL注入点的绕过,有阿里云waf的. 首先遇到是个搜索框的注入点: 演示下: 针对搜索框,我们的sql语句一般是怎么写的? 本地演示:select * from product whe ...
- C++:位操作基础篇之位操作全面总结
位操作篇共分为基础篇和提高篇,基础篇主要对位操作进行全面总结,帮助大家梳理知识.提高篇则针对各大IT公司如微软.腾讯.百度.360等公司的笔试面试题作详细的解答,使大家能熟练应对在笔试面试中位操作题目 ...
- Notepad++ 的函数参数提示错误的问题终于解决了
看第3张图片,明明我输入的是 print_double(), 提示的却是 print() 函数的参数. 这个问题困扰了我半年,今天晚上找到解决问题的办法: