专栏名称: dotNET跨平台
专注于.NET Core的技术传播。在这里你可以谈微软.NET,Mono的跨平台开发技术。在这里可以让你的.NET项目有新的思路,不局限于微软的技术栈,横跨Windows,Linux 主流平台
相关文章推荐
直播海南  ·  女大学生失联后遗体被发现,高校通报 ·  2 小时前  
直播海南  ·  中国对4名加拿大毒贩执行死刑,外交部表态 ·  20 小时前  
直播海南  ·  今日春分 ·  昨天  
直播海南  ·  男子请客获海底捞10倍赔偿5600元,同吃朋 ... ·  2 天前  
51好读  ›  专栏  ›  dotNET跨平台

CLR的简单理解

dotNET跨平台  · 公众号  ·  · 2020-09-02 07:30

正文

CLR加载程序生成进程,一个进程中可以存在多个线程,当创建一个线程时,会分配1Mb的空间,也就是线程的栈空间,对应jvm的虚拟机堆栈,是线程执行过程中用到的工作内存。这片内存用于方法传递实参,并存储方法内部定义的局部变量,栈是从高位地址向低位地址构建。栈是由操作系统直接管理,不受GC控制,当执行的方法退出后,栈中的存储会自动释放。栈的效率很高,但存储空间有限。
对象的数据存储在堆上,堆上的数据是所有线程共享的,堆根据类型又分为:GC堆、加载堆(Loader Heap)、大对象(LOH)堆。当对象实例大小小于85000字节时,该对象会被分配到GC堆上,GC回收主要是回收这一片区域,回收过后会进行压缩。当对象实例大小大于85000个字节时,会被分配到LOH堆,只有GC进行完全回收时这片区域的数据才会被回收,且回收后不会压缩。
加载堆(Loader Heap)用来存储类型的元数据,也就是类的Type信息,反射的时候就是用到这里面的信息。每个类在加载堆中对应一个方法表(Method Table),里面记录该类的元数据信息,比如基类型、静态字段、继承的接口、所有的方法等。加载堆不受GC控制,不会被回收,其生命周期是从创建(第一次使用)直到AppDomain卸载。






请到「今天看啥」查看全文