0

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

我对Ricardo C 的回答很感兴趣,尤其是以下内容:

从 SQL Server 文档中提取:

最大服务器内存(MB)

指定 SQL Server 在启动和运行时可以分配的最大内存量。如果您知道有多个应用程序与 SQL Server 同时运行并且您希望保证这些应用程序有足够的内存来运行,则可以将此配置选项设置为特定值。如果这些其他应用程序(例如 Web 或电子邮件服务器)仅在需要时请求内存,则不要设置该选项,因为 SQL Server 会根据需要向它们释放内存。但是,应用程序通常会在启动时使用任何可用内存,并且在需要时不会请求更多内存. 如果以这种方式运行的应用程序与 SQL Server 同时在同一台计算机上运行,​​则将该选项设置为一个值,以保证应用程序所需的内存不是由 SQL Server 分配的。

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

4

3 回答 3

1

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

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

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

于 2008-11-17T08:49:53.013 回答
0

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

于 2008-11-17T08:49:15.353 回答
0

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

例如,在 MacOS Classic 下,启动后不可能分配更多内存 - 我们过去必须使用 Finder 修改分配的内存量,然后重新启动应用程序。那是糟糕的过去。

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

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

在 Objective-C 中,除了 malloc() 系列函数之外,您还可以在堆上创建对象,使用

[object alloc]; 

这通常被视为

[[object alloc] init];

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

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

于 2008-11-17T11:32:51.017 回答