惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 如斯夫

Windows Azure中的Affinity Group .NET程序的运行与内存管理 堆栈和堆 应用程序的装载与运行 字符串匹配算法 – Sunday算法 该怎么教育 COM学习 完成了吗? 技术人员面试流程泳道图 创建型模式 C# 面试题目 单链表中删除重复数据 C# 数据结构 单链表反转 C# 面试算法 人的问题 foreach中的隐式类型转换 C# 点滴 - 枚举 数据库惊魂 没有人能随随便便成功 If you are a new test manager – From google testing blog
.NET内存管理
如斯夫 · 2013-06-14 · via 博客园 - 如斯夫

当我们说“内存管理”的时候,我们说的实际上就是“堆”的管理,堆栈的内存当然也是内存,但是堆栈的内存管理要简单很多。

我们前面说“堆和堆栈”的时候,说到“堆”实际上就是一个需要用户用完就清理的大房间,放在“堆”上的对象是可以长期存在的,直到这个对象被手动地清理。在.NET中,大致也是如此,除了一点:堆变成了“托管堆”,所谓托管堆,就是有人帮你管理的堆,既然有专人管理,那我们用完后,就丢在那里,让管理人员收拾吧。比如说,你在家里睡觉后,你自己得把被子叠好,而住了酒店,就有服务人员帮你叠被子,一个道理。自己叠被子的话,你可以一起床就把被子叠好,看起来清清爽爽,只是自己需要花点时间,费点力气。而让服务人员帮你叠被子呢,你可能很轻松,但你得等服务人员过来才可以,在服务人员来之前,你的房间可能就不是那么清爽了。

.NET中的垃圾回收实际上就是这么回事,对于托管对象来说,你用完后就可以扔在那里不管了,CLR会在合适的时候检查每个房间,看是不是需要帮你清理。有需要的时候,你也可以直接给服务人员打电话,主动召唤他们来清理你的房间。

那么什么是合适的时候?

我们的这个宾馆,为了管理方便,把客房分成3个等级:

· 经常打扫的 – 钟点房,数量较少,刚入住的客人一般都安排在这里;

· 打扫较少的-普通客房,数量稍多,这里住的客人都是从 钟点房转过来的,如果上次打扫钟点房的时候,钟点房的客人还要住,那就把这些客人重新安排到普通客房,把钟点房让出来;

· 打扫最少的-长期客房,数量最多,这里的客人是从普通客房转来的,如果上次打扫普通客房时,普通客房的客人还没离开,就把他们转到长期客房,把普通客房让出来。

宾馆为了节约成本,只有必要的时候才让服务人员去打扫房间,那什么时候是必要的时候呢?我们这个宾馆在客人离店的时候,并不打扫房间,在有新客人入住的时候,就去看钟点房有没有干净的空房间,要是有,就直接安排新客人入住;要是没有了,再去检查哪些房间已经不用了,把这些房间收拾清扫出来,这个时候,肯定还有一部分人住在钟点房的客人还需要继续住一段时间,宾馆方面就把这些客人转到普通客房,这下钟点房就都空了,然后把新客人就安排在第一间钟点房;

但是,如果有一天普通客房也住满了怎么办呢?这一天,又来了一位新客人,这个时候,钟点房已经没有干净的空房间了,于是宾馆方面就清理所有的钟点房,把还要继续住的客人请到普通客房,开始普通客房也没有干净的空房间了,于是宾馆方面就把普通客房也挨个检查一次,发现有客人实际上已经离开了,就清理出来,如果住在普通客房的客人还需要继续住段时间,就把他们再安排在长期客房,把普通客房让出来,然后就可以把从钟点房转来的客人安排入住到普通客房了,同时,把新客人安排到钟点房。

这就是.NET中垃圾回收的3个代龄。

为了自己方便,宾馆方面在安排客房的时候,总是按照顺序给客人安排,比如说,宾馆方面从1号到10号是钟点房,那第一个客人来的时候,就安排在1号房,第二个客人来了就安排在2号房,以此类推。(新对象在托管堆上的内存分配机制

如果又来新客人时,钟点房没有干净房间了,服务人员检查每个房间,发现1号客人还要继续住,2号客人不需要了,3号客人还住,4, 5号客人也不需要了,6,7,8,9,10号客人还住;这些还要住宿的客人就要被安排在普通客房,安排的时候呢,还是依次安排:1号客人住普通客房的1号,2号客房住转来的3号客人,4号客房住转来的6号客人,5号客房住转来的7号客人,等等。