CLRCore

news/2024/11/15 19:28:35/文章来源:https://www.cnblogs.com/guoxu486/p/18378553

1.CLR:公共语言运行时,就是IL(中间语言)的运行环境;安装.net Framewrok的时会安装CLR

 

 2.堆栈内存分配: CLR进行内存的分配

值类型分配在栈中,变量和值都是在线程栈中(结构体是输出值类型,结构体默认继承system.valuetype,所以不能继承其他类了,结构体不能有无参构造函数,不能继承或者被继承)

引用类型分布在堆上,变量是存在栈中,值是在堆中

3.string类型

//string字符串内存分配
            {string student = "大山";//开辟一块内存,放下"大山”,返回一个引用string student2 = student;student2 = "App";//改了student2的值,但不是修改内存,string字符串的内存是不可变的,不可变是因为享元,可能是多个变量指向同一个字符串//字符串变化了,多个变量都会受到影响,还因为堆里面的内存是连续分配的,如果变长度,会导致大量数据的移动//赋值其实是new string(app) ,重新开辟内存,返回引用//这时 student 的值依然是“大山”;            }{string student = "大山";string student2 = "app";student2 = "大山";Console.WriteLine(object.ReferenceEquals(student,student2)); //结果输出true,clr内存分配字符串的时候,会查找相同值,有就重用了}

4.垃圾回收:

值类型出现在线程栈中,每次调用都有线程栈,用完自己就结束

引用类型出现在堆中,全局就一个堆,空间有限,所以需要进行垃圾回收,堆是连续分配的(数组),

GC发生在new的时候, new一个对象时,会开辟内存,看看空间够不够,不够的话就要GC了,发现内存不够,就去遍历堆中的对象,标记访问不到,然后启动一个线程来清理内存;

移动标记了的对象,其他挪动,然后整齐摆放,所以这个时候全部线程停止,不允许操作内存

但是析构函数 会单独的处理,它会把这些对象放入一个队列单独处理,但是不知道什么时候去调用析构函数,析构函数主要时用来释放非托管资源,是clr自动执行的

静态不会回收:如下所示

class GCDemo{private static Student _Student = new Student() //静态的不可能被回收,静态持有的引用也不会被回收
        {Id = 123,Name = "jj"};public static void Show(){{Student student = _Student;Class @class = new Class(){};student.Class = @class;}{GC.Collect();//主动GC ,用于定时任务,执行一次后就不执行了,所以需要手动GC
            }}}

5.GC的2个优化策略:

一.分级策略:

首次GC前全部对象都是0级  ;

第一次GC后,还保留的对象叫1级;

回收先找0级对象,如果空间还不够,再去找1级对象,这之后还存在的对象就变成2级;

0级不够,1级也不够,2级还不够就内存溢出了

二.大对象策略:

如果大于某个值的对象85K,单独管理,用的时链表,避免频繁的内存移动

6.Dispose(); 只有实现了IDIsposable方法,才能使用using关键字;

在用完对象后,我们主动执行Dispose方法,当时可以使用using的快捷方式

internal class Student:IDisposable{public int Id { get; internal set; }public string Name { get; internal set; }public object Class { get; internal set; }public virtual void Dispose()//提供主动释放方式
        {//通知垃圾回收机制不再调用析构器GC.SuppressFinalize(this);}~Student()//保证垃圾回收时,一定会把非托管资源释放
        {}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/786809.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSP-S 2024 游记

壹 我有一个朋友叫小 W ,他最近有点闷。 我问他为什么闷,他跟我说他根本就没准备初赛。 我说你这么牛,连初赛都不用准备。 他说,他在梦中见到了 ddz ,他问 ddz 没准备初赛怎么办, ddz 给他的答复是:不是,哥们。你都免初赛了还问我干啥啊。 贰 我喜欢月光。 空空,不可控…

别样的ABC大战

前言:BYD ABC 大战。此事发生于2024年3月,为保护隐私(有的人应该能看出来哈哈),人物名字均使用字母代替。故事虽根据真实事件改编,但较为夸张。 一天,W老师给我发来微信。她说:“你敢不敢和其他人举行ABC大战?”我豪爽的答应了:“我当然敢!”周六下午在花园路XX号举…

【NextJS】中间件实战介绍

原创 洞窝技术使用 Next.js 中间件实现高性能个性化 在当今的数字时代,用户期望获得量身定制的在线体验。个性化已经从一个奢侈品变成了必需品,尤其是对于希望在竞争激烈的市场中脱颖而出的企业来说。然而,实现高性能的个性化往往是一个挑战,需要在用户体验和系统性能之间取得…

排列组合问题

排列公式 从 \(n\) 个数中选出 \(m\) 个数并且排序。 公式推导: \[ A^2_3 = 3 \times 2 = 6\\3_6 = 6 \times 5 \times 4 = 120\\ A^2_6 = 6 \times 5 = 30\\ \therefore A^m_n = n(n-1)(n-2)\dots (n-m+1)\\ 又\because n!=n\times (n-1)\times (n-2) \dots \times 2\times…

Docker简介及安装

本系列将会与大家分享 Docker 的相关知识。本章主要简要介绍 Docker,并指导大家如何在 CentOS 7 上进行 Docker 的安装。本系列将会与大家分享 Docker 的相关知识。本章主要简要介绍 Docker,并指导大家如何在 CentOS 7 上进行 Docker 的安装。废话不多说,下面我们直接进入主…

C程序设计语言(第2版新版)练习题1-9

练习1-9 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替。#include <stdio.h>int main(int argc, char *argv[]) {(void)argc;(void)argv;int c;int c_last = \0;while((c = getchar()) != EOF) {if (( != c) || ( != c_last)) {putchar(c);}c…

C# .NET CORE 知识点总结【基础篇】

心之所向,勇往直前!记录面试中的那些小事。面试题只是一道门,最好还是走进屋里看看。正文 结语本篇到此结束,如果有任何疑问或者指正,请发表在评论区。

相遇(容斥+最短路+分类,水紫)

第5题 相遇 查看测评数据信息给定一个有n个节点m条边的无向图,在某一时刻节点st上有一个动点a, 节点end上有一个动点b, 动点a向节点end方向移动,要求是尽快到达end点,与此同时,动点b向节点st方向移动,要求是尽快到达st点, 但是整个过程中a和b不能相遇,问两点不相遇一…

NYX靶机笔记

NYX靶机笔记 概述 VulnHub里的简单靶机 靶机地址:https://download.vulnhub.com/nyx/nyxvm.zip 1、nmap扫描 1)主机发现 # -sn 只做ping扫描,不做端口扫描 nmap -sn 192.168.84.1/24 # 发现靶机ip为 MAC Address: 00:50:56:E0:D5:D4 (VMware) Nmap scan report for 192.168.…