为您的应用程序请求内存

时间:2008-11-17 08:36:52

标签: c# sql-server-2005 memory-management

我遇到与this person类似的问题。主要的区别是应用程序不适用于开发人员环境,因此我需要知道如何优化Sql Server使用的空间(可能是基于规范的每台机器)。

我被Ricardo C's回答感兴趣,特别是以下内容:

  

从SQL Server中提取   文档:

     

最大服务器内存(以MB为单位)

     

指定SQL Server可以分配的最大内存量   开始运行时。这个   配置选项可以设置为   特定值,如果你知道有   多个应用程序在运行   和SQL Server一样,你想要的   保证这些应用程序   有足够的内存来运行。如果   这些其他应用程序,例如Web   或电子邮件服务器,仅请求内存   根据需要,然后不要设置选项,   因为SQL Server会释放内存   根据需要给他们。的然而,   应用程序经常使用任何内存   在他们开始和做的时候可用   如果需要,不要求更多。如果   在此行为的应用程序   方式在同一台计算机上运行   与SQL Server同时设置   保证该值的选项   应用程序所需的内存   不是由SQL Server分配的。

我的问题是:应用程序在需要时如何从操作系统请求内存?这是内置于编译或开发人员管理的东西吗?在这台机器上运行的两个主要应用程序是Sql Server和我正在开发的(相当重量级的)C#应用程序,而且我几乎可以肯定,在要求操作系统获取内存方面我们并没有特别做任何事情。有没有正确/必要的方法来做到这一点?

3 个答案:

答案 0 :(得分:1)

某些应用程序在启动时分配大量内存,然后在其上运行自己的内存管理系统。 这对于具有特定分配模式的应用程序来说非常有用,并且认为它们可以比运行时系统提供的更通用的内存管理器做得更好。

许多游戏都是这样做的,因为他们通常非常了解内存使用模式的外观,并且经常进行大量优化。默认/系统分配器是通用的,并不总是足够快。 Doom did this,并且以其着名而闻名,当然它的代码可以广泛讨论。

在像C#这样的“托管”语言中,我认为这种情况非常罕见,您无需担心。

答案 1 :(得分:0)

每次创建新对象时,都要求.NET垃圾收集器为您提供内存。如果GC在托管堆上的内存不足,那么它会向操作系统询问更多内容。 正如另一个问题所说的那样,尽管SQL服务器旨在为内存提供支持,但它似乎并没有做得很好。这里没有任何硬性和快速的规则,您将不得不猜测SQL服务器的某些设置,然后测试性能。如果你发布一些关于服务器,数据库大小,你的应用程序似乎需要多少内存的信息,那么我相信人们会乐意为你提供一些初始配置的建议。 但是有一个警告,我认为更改内存限制需要重新启动服务。

答案 2 :(得分:0)

这取决于一些事项 - 特别是操作系统和使用的语言。

例如,在MacOS Classic下,启动后无法分配更多内存 - 我们以前必须修改使用Finder分配的内存量,然后重新启动应用程序。那些是过去不好的日子。

现代操作系统将允许运行进程以请求更多内存 - 例如在C中,您可以使用alloc(),malloc(),realloc()或类似来请求内存块。在动态语言中,您只需创建对象或变量,并分配更多内存。

在java中,JVM可以访问多少内存是有限制的 - 这可以通过重新启动JVM并将一些参数传递给它来改变(听起来像过去的糟糕日子,不是吗? ?)。

在Objective-C中,除了malloc()函数系列之外,您还可以使用

在堆上创建对象。
[object alloc]; 

通常被视为

[[object alloc] init];

请注意,这与在堆栈上创建对象略有不同 - 如果您对编程学习很认真,那么这两者之间的差异也可能有用:)

总之 - 程序员需要向操作系统询问更多内存。这可以是隐式的(在动态语言中,通过创建对象,或通过在堆上创建对象)或显式,例如在C中使用alloc()/ malloc()/ etc。