学习笔记: 异常状态管理,托管堆垃圾回收,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): 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计 ...
随机推荐
- Package与Activity简介
Package Package 包.只是在我们的app中这个Package是唯一的,就像你身份证号码一样.在我们做app自动化时,我们就需要知道他的Package,我们知道了Package那么也就知道 ...
- 转 spring注解式参数校验
转自: https://blog.csdn.net/jinzhencs/article/details/51682830 转自: https://blog.csdn.net/zalan01408980 ...
- 爬虫简介与request模块
一 爬虫简介 概述 近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的利益,而网络爬虫是其中最为常用的一种从网 ...
- 切割日志(mysql,nginx,php tomcat)使用logrotate
1.简介 logrotate 程序是一个日志文件管理工具.用来把旧的日志文件删除,并创建新的日志文件,我们把这个过程叫做“转储”.我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 ...
- POJ1509 Glass Beads 【后缀自动机】
题目分析: 模板练手.看最长能走多远. 代码: #include<iostream> #include<cstdio> #include<cstdlib> #inc ...
- Linux-监控目录及文件
Linux-通过inotifywait监控目录及文件 inotifywait命令的使用此处就不写了:可以参考文章:https://www.cnblogs.com/martinzhang/p/41269 ...
- 来自多校的一个题——数位DP+卡位
n<=1e9就要考虑倍增.矩阵乘法这种了 假设L=0 考虑枚举二进制下,所有X与R的LCP长度,前len高位 对于第len+1位,假设R的这一位是1 如果一个x的这一位是0了,那么后面可以随便填 ...
- [HAOI2008]糖果传递 结论题
题目描述 有\(n(n<1000000)\)个小朋友坐成一圈,每人有\(a_i\)个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为\(1\),求使所有人糖果数相等的最小代价. 暴力 ...
- Fiddler--AutoResponder
AutoResponder支持创建规则,可以在响应请求时自动触发,常见例子是返回之前捕捉的响应,而不需要访问服务器. 通俗点讲,就是它能在不访问服务器的情况下,使发送的请求得到自己设置的响应. 下图是 ...
- React 记录(7)
React文档:https://www.reactjscn.com/docs/handling-events.html 慢慢学习:对照教程文档,逐句猜解,截图 React官网:https://reac ...