有哪些提示可以减少.NET应用程序的内存使用量?考虑以下简单的C#程序.
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
在x64的发布模式下编译并在Visual Studio外部运行,任务管理器报告以下内容:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
Run Code Online (Sandbox Code Playgroud)
如果它只为x86编译它会好一点:
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
Run Code Online (Sandbox Code Playgroud)
然后,我尝试了以下程序,它执行相同但尝试在运行时初始化后修剪进程大小:
class Program
{
static void Main(string[] args)
{
minimizeMemory();
Console.ReadLine();
}
private static void minimizeMemory()
{
GC.Collect(GC.MaxGeneration);
GC.WaitForPendingFinalizers();
SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,
(UIntPtr) 0xFFFFFFFF, (UIntPtr)0xFFFFFFFF);
}
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetProcessWorkingSetSize(IntPtr process,
UIntPtr minimumWorkingSetSize, UIntPtr maximumWorkingSetSize);
}
Run Code Online (Sandbox Code Playgroud)
在Visual Studio外部的 …
是否可以在.NET中设置第0代堆的最小大小?
我有一个下面的sistuation.我有一个函数,分配大约20-30 MB的1KB对象,对它们做一些事情,然后终止,让所有分配的对象都被GC编辑.现在,在性能监视器中,我可以看到第0代堆大小是5-6 MB,这还不足以接受我需要的所有20-30 MB的对象.当我开始分配时,gen0 GC开始运行,并且因为需要所有对象,所以它们将它们提升为gen1.GC下次开始运行时,这些对象将在gen2中升级.所以最终大约15MB的对象最终进入gen2堆.根据我的逻辑,这些是临时对象,绝不应该在gen2堆中结束.我相信问题在于gen0堆大小的大小.但我不确定.我知道在Java中有可能设置最小的代数堆.在.NET中有这样的方式吗?
以下是c ++和c#中的两个代码部分,完全相同:
#include <stdio.h>
int main(int argc, char *argv[]) {
char p[1000000];
unsigned int i,j;
unsigned long long s=0;
for(i=2;i<1000000;i++) p[i]=1;
for(i=2;i<500000;) {
for(j=2*i;j<1000000;j+=i) p[j]=0;
for(i++;!p[i];i++);
}
for(i=3,s=2;i<1000000;i+=2) if(p[i]) s+=i;
printf ("%lld\n",s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
时间:0.01s memmory:2576 kB
using System;
namespace ConsoleApplication4
{
internal class Program
{
private static void Main(string[] args)
{
var p = new byte[1000000];
ulong i, j;
double s = 0;
for(i=2;i<1000000;i++)
p[i]=1;
for(i=2;i<500000;)
{
for(j=2*i;j<1000000;j+=i)
p[j]=0;
for(i++;p[i]==0;i++);
}
for(i=3,s=2;i<1000000;i+=2)
if(p[i]!=0) s+=i; …Run Code Online (Sandbox Code Playgroud) 我在我的一本大学书中遇到了一个令人困惑的问题:在那里声明"堆不是静态的,可以根据需要通过从操作系统请求更多内存来增长".
所以我很困惑的是:假设我运行我的应用程序,并在堆上分配对象.在某些时候,应用程序内存不足:现在发生了什么?
根据我的理解,Gc(垃圾收集器)开始并开始它的标记和扫描操作.我想知道不管怎样,而不是通过CLR调用Gc,堆是否有可能从操作系统请求更多内存?
我读到在C++语言中,有一种方法可以实现这一点,但在C#.Net Framework 4.5中是否可行?