我正在尝试解决一些内存使用问题。总体而言,我的应用程序收集了一些数据值,并使用PDF图表和数据网格将它们可视化,最后将所有内容都放入C1报告中。
使用YourKit分析我的进程我面临的情况是,CLR堆大小约为120MB(这很好),而进程内存大小约为580MB。这几乎是我实际CLR堆大小的5倍内存消耗。我的CLR峰值大小是220MB,而进程内存分配是710MB。
我很清楚,我的对象堆、堆栈等等都需要一些开销。在Java JVM中,我习惯的典型系数大约是1.5倍。
如何解释这种过多的内存开销?进程只是分配空闲的空闲堆空间吗?如果是,这是否解释了710MB与220MB的区别?
发布于 2012-08-22 22:54:26
这里有几个额外的注释。虽然我不太确定你所说的"CLR堆大小“是什么意思。根据您正在使用的.NET运行时,CLR会使用8或9个不同的堆-所以您在堆大小与VM大小中看到的内存大小说明了一些差异:
< Code >H19大型对象堆:需要超过85k字节的内存分配
另外两个可能导致过多内存使用的项目是内存碎片(主要发生在LOH或大型对象堆上)或大量线程。
造成内存碎片的原因有很多,排除这种情况的最好方法是使用WinDbg来分析GC堆上每个段的段大小。
对于大量的线程,您可以为应用程序使用的每个线程分配1MB (用于x86进程)或4MB (用于x64进程)的堆栈空间。这个内存放在进程/基础堆中。因此,如果您有100个线程,则可以使用高达100MB/400MB的额外内存。
HTH
发布于 2012-04-12 20:58:31
如果托管堆的总大小明显小于您的应用程序使用的私有字节,则可能是您分配了非托管内存,并且(可能)没有正确处理它。实现IDisposable的图形对象、流和其他对象需要在它们超出作用域之前调用它们的Dispose()方法,或者将它们放在using(){}语句中,以便清理任何非托管资源。使用ANTS Memory Profiler之类的工具可以向您显示内存是如何分配的,以及哪些对象实现了IDisposable。
https://stackoverflow.com/questions/10121943
复制相似问题