相关疑难解决方法(0)

减少.NET应用程序的内存使用量?

有哪些提示可以减少.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 c# memory optimization memory-optimization

107
推荐指数
6
解决办法
7万
查看次数

.NET生成0堆大小

是否可以在.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中有这样的方式吗?

.net garbage-collection

15
推荐指数
2
解决办法
9337
查看次数

C#大型阵列的内存优化

以下是c ++和c#中的两个代码部分,完全相同:

C++
http://ideone.com/UfL5R

#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

C#
http://ideone.com/baXYm

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)

c# c++ optimization performance

4
推荐指数
3
解决办法
3069
查看次数

C#/ .Net Framework中的堆大小 - 它可以增长吗?

我在我的一本大学书中遇到了一个令人困惑的问题:在那里声明"堆不是静态的,可以根据需要通过从操作系统请求更多内存来增长".

所以我很困惑的是:假设我运行我的应用程序,并在堆上分配对象.在某些时候,应用程序内存不足:现在发生了什么?

根据我的理解,Gc(垃圾收集器)开始并开始它的标记和扫描操作.我想知道不管怎样,而不是通过CLR调用Gc,堆是否有可能从操作系统请求更多内存?

我读到在C++语言中,有一种方法可以实现这一点,但在C#.Net Framework 4.5中是否可行?

.net c# heap garbage-collection memory-management

3
推荐指数
1
解决办法
8996
查看次数