首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET进程内存使用率= 5x CLR堆内存?

.NET进程内存使用率= 5x CLR堆内存?
EN

Stack Overflow用户
提问于 2012-04-12 18:40:11
回答 2查看 3.4K关注 0票数 8

我正在尝试解决一些内存使用问题。总体而言,我的应用程序收集了一些数据值,并使用PDF图表和数据网格将它们可视化,最后将所有内容都放入C1报告中。

使用YourKit分析我的进程我面临的情况是,CLR堆大小约为120MB(这很好),而进程内存大小约为580MB。这几乎是我实际CLR堆大小的5倍内存消耗。我的CLR峰值大小是220MB,而进程内存分配是710MB。

我很清楚,我的对象堆、堆栈等等都需要一些开销。在Java JVM中,我习惯的典型系数大约是1.5倍。

如何解释这种过多的内存开销?进程只是分配空闲的空闲堆空间吗?如果是,这是否解释了710MB与220MB的区别?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-22 22:54:26

这里有几个额外的注释。虽然我不太确定你所说的"CLR堆大小“是什么意思。根据您正在使用的.NET运行时,CLR会使用8或9个不同的堆-所以您在堆大小与VM大小中看到的内存大小说明了一些差异:

  1. 加载器堆:包含CLR结构和类型系统
  2. 高频堆: statics、MethodTables、FieldDescs、接口映射
  3. 低频堆: EEClass、ClassLoader和查找表
  4. 存根堆: CAS、COM包装器的存根、P/Invoke

< Code >H19大型对象堆:需要超过85k字节的内存分配

  1. GC堆:用户分配的专用于app的堆内存
  2. JIT代码堆:由mscoreee (执行引擎)和托管JIT编译器分配的内存用于托管JIT堆:互操作/非托管分配、本机内存、JIT编译器etc
  3. added in .NET 5Pinned Object Heap (POH)

另外两个可能导致过多内存使用的项目是内存碎片(主要发生在LOH或大型对象堆上)或大量线程。

造成内存碎片的原因有很多,排除这种情况的最好方法是使用WinDbg来分析GC堆上每个段的段大小。

对于大量的线程,您可以为应用程序使用的每个线程分配1MB (用于x86进程)或4MB (用于x64进程)的堆栈空间。这个内存放在进程/基础堆中。因此,如果您有100个线程,则可以使用高达100MB/400MB的额外内存。

HTH

票数 14
EN

Stack Overflow用户

发布于 2012-04-12 20:58:31

如果托管堆的总大小明显小于您的应用程序使用的私有字节,则可能是您分配了非托管内存,并且(可能)没有正确处理它。实现IDisposable的图形对象、流和其他对象需要在它们超出作用域之前调用它们的Dispose()方法,或者将它们放在using(){}语句中,以便清理任何非托管资源。使用ANTS Memory Profiler之类的工具可以向您显示内存是如何分配的,以及哪些对象实现了IDisposable。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10121943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档