在分析内存分配时,应该先了解关于堆栈的区别
堆的分配向高地址扩展,而栈的分配向低地址扩展。
一、内存分配
关于内存的分配,首先应该了解分配在哪里的问题。CLR管理内存的区域,主要有三块,分别为:
· 线程的堆栈,用于分配值类型实例。堆栈主要由操作系统管理,而不受垃圾收集器的控制,当值类型实例所在方法结束时,其存储单位自动释放。栈的执行效率高,但存储容量有限。
· GC堆,用于分配小对象实例。如果引用类型对象的实例大小小于85000字节,实例将被分配在GC堆上,当有内存分配或者回收时,垃圾收集器可能会对GC堆进行压缩,详情见后文讲述。

- publicclassVIPUser:User
- {
-
-
publicboolisVip;
-
publicboolIsVipUser()
- {
-
returnisVip;
- }
-
staticvoidMain(string[]args)
- {
-
- VIPUseraUser;
-
-
aUser=newVIPUser();
-
-
-
-
-
-
-
-
-
-
-
-
-
aUser.isVip=true;
- Console.WriteLine(aUser.IsVipUser());
-
- }
- }
-
publicclassUserInfo
- {
-
-
privateInt32age=-1;
-
-
privatecharlevel='A';
- }
-
publicclassUser
- {
-
-
privateInt32id;
-
-
-
privateUserInfouser;
- }
LOH(Large Object Heap)堆,用于分配大对象实例。如果引用类型对象的实例大小不小于85000字节时,该实例将被分配到LOH堆上,而LOH堆不会被压缩,而且只在完全GC回收时被回收。
在了解内存分配之前 首先了解一下三个概念:
-
TypeHandle,类型句柄,指向对应实例的方法表,每个对象创建时都包含该附加成员,并且占用4个字节的内存空间。我们知道,每个类型都对应于一个方法表,方法表创建于编译时,主要包含了类型的特征信息、实现的接口数目、方法表的slot数目等。
-
SyncBlockIndex,用于线程同步,每个对象创建时也包含该附加成员,它指向一块被称为Synchronization Block的内存块,用于管理对象同步,同样占用4个字节的内存空间。
-
NextObjPtr,由托管堆维护的一个指针,用于标识下一个新建对象分配时在托管堆中所处的位置。CLR初始化时,NextObjPtr位于托管堆的基地址。
二、继承本质论

-
Birdbird=newBird();
-
-
-
-
Chickench=newChicken();
原文链接:http://www.cnblogs.com/cheshui/archive/2012/09/29/2707910.html
分享到:
相关推荐
jemalloc.NET是基于本机内存分配器的.NET API,可为.NET应用程序提供由本机内存支持的高效数据结构,适用于大规模内存计算方案。 jemalloc是“通用的malloc(3)实现,它强调避免碎片和可扩展的并发支持”,已在...
在.NET开发环境中,内存泄漏是一个严重的问题,可能导致应用程序性能下降,甚至崩溃。本文将深入探讨如何使用.Net Memory Profiler这一专业工具来诊断和解决.NET应用的内存泄漏问题。.Net Memory Profiler是一款强大...
- **内存分配**:为对象分配内存。 - **执行管理**:确保代码的安全性和正确性。 - **垃圾回收**:自动回收不再使用的内存空间。 #### 三、垃圾回收过程详解 ##### 3.1 垃圾回收触发条件 垃圾回收通常在两种情况...
CLRProfiler是.NET Framework中用于诊断内存管理问题的强大工具,尤其是针对内存泄漏的检测。它能够帮助开发者深入理解应用程序在运行时如何使用内存,以及何时和为何会出现内存消耗异常的情况。以下是对这个工具...
内存碎片是由于频繁的内存分配和释放导致内存空间不连续,从而影响程序运行效率的现象。在传统的内存管理方式中,比如C++中的`new`和`delete`,或.NET中的`new`和`Dispose`,每次申请和释放内存都可能导致内存空间的...
这通常包括获取目标进程的句柄、分配内存来存放DLL路径、写入DLL路径到目标进程的内存、创建新线程并调用`LoadLibraryA`。以下是一个简单的示例: ```vb.net Public Class DLLInjector Public Shared Function ...
在.NET环境中,内存管理主要由垃圾收集器(Garbage Collector,GC)负责,它自动管理应用程序的内存分配和回收。32位系统中的.NET进程通常被分配约2GB的用户模式地址空间,其中一部分用于堆(Heap)、栈(Stack)、...
十、性能优化:通过分析工具如Profiler,了解内存分配、CPU使用和瓶颈,优化代码性能。 通过深入学习以上知识点,并结合实例进行实践,开发者不仅可以提升个人技能,还能在实际项目中更好地利用.NET Framework的...
1. 内存分配: 在C++中,内存主要分为五类:栈、堆、自由存储区、全局/静态存储区和常量存储区。栈内存通常用于局部变量,由编译器自动管理,效率高但空间有限。堆内存则是通过`new`操作符动态分配,需要程序员使用...
《.NET介绍,内存布局和分布》 .NET框架是一个由微软开发的全面的开发平台...内存布局和分配则体现了.NET对资源管理的智能化,确保了应用程序的稳定性和高效性。了解这些概念对于深入理解和开发.NET应用程序至关重要。
《.NET内存宝典》是一本专为.NET开发者编写的深度技术书籍,旨在提升代码质量、性能和可扩展性。作者Konrad Kokosa通过这本书详细阐述了.NET内存管理的精髓,将其与经典的《CLR via C#》相提并论,甚至认为在深入...
MPMCQueue.NET 有界的多个生产者,多个消费者排队等待.NET ... 操作期间无动态内存分配/管理。 生产者和使用者是彼此分开的(如在两锁队列中),即在队列不为空时不要触摸相同的数据。 实作 队列类
垃圾回收机制是.NET运行时自动管理内存的一部分,对于提高程序的性能至关重要。 **1.1.1 避免不必要的对象创建** 在C#中,不必要的对象创建会增加垃圾回收的压力,从而影响应用程序的整体性能。以下是一些避免对象...
接下来,我们来详细了解一下.NET内存管理的具体过程。创建对象时,如果托管堆中有足够的空间,系统会将对象的内存分配在堆上,并调用构造函数初始化该对象。对象的内存分配是通过一个指针(NextObjPtr)来管理的,该...
1. 公共语言运行库(Common Language Runtime, CLR):这是.NET的核心部分,它负责管理代码的执行,包括内存分配、垃圾回收、类型安全以及异常处理。CLR还支持多种编程语言,如C#、VB.NET、C++/CLI等,这些语言编译...
内存分配检测是编程中一个非常重要的环节,尤其是在系统优化、性能分析和错误排查时。VB(Visual Basic)作为Microsoft开发的一种面向对象的编程语言,虽然在现代编程领域中已不如以往流行,但仍然有很多开发者使用...
内存分配主要分为两个层次:用户空间内存分配和内核空间内存分配。用户空间内存分配主要是为进程或应用程序提供运行时所需的内存,而内核空间内存分配则服务于操作系统自身和系统级服务。 1. **用户空间内存分配** ...
`VirtualMemorySize64`则包括了进程的虚拟地址空间大小,这不仅包括已分配的内存,还包括预留但尚未使用的内存。 为了提高性能,可以考虑使用缓存策略。例如,可以定期获取系统资源信息并存储在内存中,然后在需要...