Linxu磁盘 spring jdbc node static idea全局替换 oracle数据库创建表空间 python界面 python多线程编程 python循环语句 python编程语言 javalabel java类和对象 java学习基础 java定义接口 java类方法 linux命令行大全 python队列 begininvoke 显示器面板类型 博途v14安装教程 js正则匹配字符串 medcalc 奥法隐藏外观 globalscape jpg格式转换器 ps怎么p人脸 程序流程图软件 劳动节称号 无人机数据处理软件 数据挖掘案例 xmlhttp environment 黑客软件网 苹果手机怎么卸载软件 安卓怎么绕过锁屏密码 聚生网管远程管理工具 nginx文件服务器 软件编程 setinterval
当前位置: 首页 > 学习教程  > 编程语言

.NET中GC垃圾回收机制总结

2020/12/28 19:24:34 文章标签:

1. **注意:内存分配发生在创建对象实例前** 2. 堆Heap:托管堆,一个程序运行时,该进程存放引用类型变量的一块内存,全局唯一 3. 栈Stack:先进后出的数据结构(队列先进先出,但堆栈都是…

1. **注意:内存分配发生在创建对象实例前**
2. 堆Heap:托管堆,一个程序运行时,该进程存放引用类型变量的一块内存,全局唯一
3. 栈Stack:先进后出的数据结构(队列先进先出,但堆栈都是线性表),线程栈,每一个线程存放变量和值类型的内存,随着线程生命周期
4. 值类型的值,会随着对象的位置存储 。引用类型的值,一定在堆里面(之所以这么讲师是因为某些值类型中会混合引用类型如枚举、结构,引用类型中包含值类型如类)
5. 值类型的长度是确定的,引用类型的长度是不确定的,所以只有堆才能放各种值
6. 字符串的内存分配问题  字符串同一变量-使用同一值
7. 堆中的内存是紧密排放
8. 什么样的对象需要垃圾处理
9. 托管资源(托管资源就是受CLR控制的,New的对象、string字符串、变量)+引用类型
10. 非托管资源指不受CLR控制的,譬如:数据库连接、文件流、句柄(资源数据标识)、打印机连接、
11. 使用USing(SQLconnection)被C#封装了那个非托管的数据库连接资源,只要是手动释放的都是非托管

13. 哪些对象的内存能被GC
	1. 对象访问不到了就可以被回收。 程序-入口-去找对象-简历对象图-访问不到的就是垃圾
	
14. 对象如何分配在堆上
	1. 连续分配在堆上,每次分配前先检查空间够不够
	
15. 什么时候会执行GC
	1. new对象-临界点
	2. GC。Collect强行GC(因为每一次GC都会有一定性能耗损,所以不推荐强行)
	3. 程序退出时

16. GC垃圾回收过程
	1. N个对象-全部对象标记为垃圾-入口开始遍历-访问到的标记为可以访问(+1)-遍历完就清理内存,产生不连续内存-压缩-地址移动-修改变变量指向-所以会全局阻塞且性能耗损。
	
17. 内存清理分两种情况
	1. 无析构函数  执行清理内存
	2. 把对象转移到一个单独的队列,会有个析构器线程专门做这个(清理慢一些)通常在析构函数内部是用来做非托管资源释放,因为CLR肯定调用,所以避免了使用者忘记
	
18. 垃圾回收策略
	1. 对象分三代
	2. 0 代:第一次分配到堆
	3. 1代:经历了一次GC还存在
	4. 2代:经历2次及两次以上GC,依然存在
	5. 垃圾回收时优先回收0代,提升效率,最多也最容易释放
	6. 0代不够-找1代-1代不够找2代-再不够就不够了
	7. 大对象堆:一是内存移动大对象;二是0代空间问题,8W字节以上就叫大对象,没有分代,直接都是2代

19. 清理方式
	1. Dispose主动清理
	2. 析构函数被动清理

本文链接: http://www.dtmao.cc/news_show_550243.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?