内存不足?简单的方法来增加程序的可用内存

2023-11-29 03:32

本文主要是介绍内存不足?简单的方法来增加程序的可用内存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自 https://blogs.msdn.microsoft.com/calvin_hsia/2010/09/27/out-of-memory-easy-ways-to-increase-the-memory-available-to-your-program/

当您运行VB或C#应用程序时,即使您的  计算机有很多  内存,也可能会出现OutOfMemoryException 。

 

每32位进程有一个2 ^ 32位(4 Gig)地址空间。这意味着每个指针的大小都是32位(4个字节),因此被限制为40亿个。

 

这相当于说车牌号由6位数组成,因此有100万个可能的号码。

 

4 Gigs分为一半:用户应用程序获取下半部分,操作系统获取上半部分。(这个界限可以改变:见下文)。

 

启动VS 2010. File-> New-> Project-> VB或C#Windows WPF应用程序。

粘贴下面的VB或C#代码。它创建一个堆,然后在循环中连续分配100Meg的内存,直到引发异常。

 

在我的具有8G内存的64位Windows 7机器上(你的数码相机或手机可能有  更多的内存!),我在分配之前分配了大约1.4Gig的内存。

 

#10 1,048,576,000

#11,153,433,600

#12 1,258,291,200

#13 1,363,148,800

类型'System.OutOfMemoryException'的异常异常被抛出。

 

 

现在选择Project-> Properties-> Compile-> Build Events-> PostBuildEvent Command,并  添加这两行

调用“$(DevEnvDir).. \ .. \ vc \ vcvarsall.bat”x86

“$(DevEnvDir).. \ .. \ vc \ bin \ EditBin.exe”“$(TargetPath)”   / LARGEADDRESSAWARE

 

注意:报价的位置非常重要

第一行调用一个BAT文件,该文件可以在路径上提供各种工具。

第二个在目标二进制文件上运行EditBin,使用LARGEADDRESSAWARE 标志(这几乎是键盘上的所有左手键!)

同样取消选项:Project-> Properties-> Debug->启用Visual Studio宿主进程

 

这两行的唯一影响是调用EditBin在EXE中切换一点。当EXE启动一个进程时,整个进程被标记为能够使用2G以上的指针。

用这样的指针,高位是1,以2的补码表示,它是一个负数,有些应用程序可能没有被设计成与“负”指针一起工作。

 

现在,当我运行代码时,我获得了3.5 Gigs:超过两倍的内存!

 

#30 3,145,728,000

#31,350,585,600

#32 3,355,443,200

#33 3460,300,800

类型'System.OutOfMemoryException'的异常异常被抛出。

 

 

这个Editbin“技巧”在64位操作系统上运行良好。对于一个32位的操作系统来说,它也可以工作,但是你需要“bcdedit / set IncreaseUserVA 3072”(重新启动),你不会获得更多的额外内存。

 

想要更多的记忆?如果您使用的是64位操作系统,请尝试编译为64位:

VB:项目 - >属性 - >编译 - >高级 - >目标CPU - >任何CPU(或x64)

C#:Project-> Properies-> Build-> Platform Target->任何CPU(或x64)

 

#110 11,534,336,000

Iter#111 11,639,193,600

#112 11,744,051,200

#113 11,848,908,800

Iter#114 11,953,766,400

类型'System.OutOfMemoryException'的异常异常被抛出。

 

是的,这真的是我的8 gig机器上近12演出!  您也可以通过任务管理器进行验证。

 

一个64位进程有一个大小为64位(8字节)的指针。2 ^ 64 = 18,000,000,000,000,000,000。(1.8×10 ^ 19)

这大约有18艾字节,或90万年的DVD质量视频。

 

不过这是隔靴搔痒的数量可能棋牌类游戏,甚至是waaaay较小的电子数量,将适合在宇宙Ĵ(哈勃定律,宇宙大爆炸物理学)

 

当我第一次为微软工作时,我开发了一个thunking机制,允许32位应用程序调用16位DLL。(http://support.microsoft.com/kb/139070 )

我们认为任何人都无法用完32位地址空间!

 

如果车牌号码的长度从6位增加到12位,这将从100万人(中等城市人口)增加到1Trillion(1×10 ^ 12),是世界人口的200倍。

 

 

也可以看看

BCDEdit命令行选项

有效地使用多个堆

你的计算机用所有的内存来做什么?编写你自己的内存浏览器

LARGEADDRESSAWARE

使用XAML创建您自己的测试主机来运行您的单元测试

未记录的API和16位DLL

 

<C#代码>

使用系统;

使用System.Collections.Generic;

使用System.Linq;

使用System.Text;

使用System.Windows;

使用System.Windows.Controls;

使用System.Windows.Data;

使用System.Windows.Documents;

使用System.Windows.Input;

使用System.Windows.Media;

使用System.Windows.Media.Imaging;

使用System.Windows.Navigation;

使用System.Windows.Shapes;

使用System.Runtime.InteropServices;

使用System.Diagnostics;

 

命名空间Heapcs

{

    /// <summary>

    /// MainWindow.xaml的交互逻辑

    /// </ summary>

    公共 部分  MainWindowWindow

    {

        public MainWindow()

        {

            的InitializeComponent();

        }

        private void Window_Loaded(object sender,RoutedEventArgs e)

        {

            VAR hHeap =  .HeapCreate(HeapFlags .HEAP_GENERATE_EXCEPTIONS,0,0);

            //如果FriendlyName是“heap.vshost.exe”,那么它使用VS托管进程而不是“Heap.Exe”

            Trace .WriteLine(AppDomain .CurrentDomain.FriendlyName + “heap created”);

            uint nSize = 100 * 1024 * 1024;

            ulong nTot = 0;

            尝试

            {

                forint i = 0; i <1000; i ++)

                {

                    var ptr = Heap .HeapAlloc(hHeap,0,nSize);

                    nTot + = nSize;

                    跟踪 .WriteLine(字符串 .Format(“Iter项目#{0} {1:N0}”,I,NTOT));

                }

            }

            catchException ex)

            {

                Trace .WriteLine(“Exception” + ex.Message);

            }

 

 

             .HeapDestroy(hHeap);

            Trace .WriteLine(“destroyed”);

            Application .Current.Shutdown();

        }

    }

 

    公共  

    {

        [ DllImport“kernel32.dll”,SetLastError = true)]

        public static extern IntPtr HeapCreate(HeapFlags flOptions,uint dwInitialsize,uint dwMaximumSize);

 

        [ DllImport“kernel32.dll”,SetLastError = true)]

        public static extern IntPtr HeapAlloc(IntPtr hHeap,HeapFlags dwFlags,uint dwSize);

 

        [ DllImport“kernel32.dll”,SetLastError = true)]

        public static extern bool HeapFree(IntPtr hHeap,HeapFlags dwFlags,IntPtr lpMem);

 

        [ DllImport“kernel32.dll”,SetLastError = true)]

        public static extern bool HeapDestroy(IntPtr hHeap);

 

        [ DllImport“kernel32.dll”,SetLastError = true)]

        public static extern IntPtr GetProcessHeap();

 

        [ 标志()]

        公共 枚举 HeapFlags

        {

            HEAP_NO_SERIALIZE = 0x1,

            HEAP_GENERATE_EXCEPTIONS = 0x4,

            HEAP_ZERO_MEMORY = 0x8

        }

 

    }

 

}

 

 

</ C#Code>

<VB代码>

选项严格打开

导入System.Runtime.InteropServices

 

 

MainWindow

    私人  Window_Loaded(BYVAL发件人作为系统。对象BYVAL Ë 作为 System.Windows。RoutedEventArgs把手 MyBase .Loaded

        暗淡 hHeap =  .HeapCreate(HeapFlags .HEAP_GENERATE_EXCEPTIONS,0,0)

        '如果FriendlyName是“heap.vshost.exe”,那么它使用VS Hosting进程而不是“Heap.Exe”

        Trace .WriteLine(AppDomain .CurrentDomain.FriendlyName + “创建的堆”

        Dim nSize As UInteger = 100 * 1024 * 1024

        Dim nTot As ULong = 0

        尝试

            对于 i = 1  1000

 

                Dim ptr = Heap .HeapAlloc(hHeap,0,nSize)

                nTot + = nSize

                跟踪 .WriteLine(字符串 .Format(“Iter项目#{0} {1:N0}”,I,NTOT))

            下一个

        抓住 EX 作为 例外

            Trace .WriteLine(“Exception” + ex.Message)

        结束 尝试

 

         .HeapDestroy(hHeap)

        Trace .WriteLine(“已销毁”

        结束

    结束 小组

 

公共

 

    < DllImport“kernel32.dll”,SetLastError:= True)> _

    公共 共享 函数 HeapCreate(

               BYVAL flOptions 作为 HeapFlags

               ByVal dwInitialSize 作为 UInteger

               ByVal dwMaximumSize 作为 UInteger

         )作为 IntPtr

    结束 功能

 

    < DllImport“kernel32.dll”,SetLastError:= True)>

    公共 共享 函数 HeapAlloc(

               ByVal hHeap 作为 IntPtr

               ByVal dwFlags As HeapFlags

               ByVal dwSize 作为 UInteger

         )作为 IntPtr

    结束 功能

    < DllImport“kernel32.dll”,SetLastError:= True)>

    公共 共享 函数 HeapFree(

               ByVal hHeap 作为 IntPtr

               ByVal dwFlags As HeapFlags

               ByVal lpMem As IntPtr

         )作为 布尔值

    结束 功能

 

    < DllImport“kernel32.dll”,SetLastError:= True)>

    公共 共享 函数 HeapDestroy(

               ByVal hHeap 作为 IntPtr

         )作为 布尔值

    结束 功能

 

    < DllImport“kernel32.dll”,SetLastError:= True)> _

    公共 共享 函数 GetProcessHeap(

         )作为 IntPtr

    结束 功能

    < 标志()>

    公共 枚举 堆标志

        HEAP_NO_SERIALIZE =&H1

        HEAP_GENERATE_EXCEPTIONS =&H4

        HEAP_ZERO_MEMORY =&H8

    End Enum

这篇关于内存不足?简单的方法来增加程序的可用内存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/431290

相关文章

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain