C# 正在为应用程序请求内存

C# 正在为应用程序请求内存,c#,sql-server-2005,memory-management,C#,Sql Server 2005,Memory Management,我有一个类似的问题。主要区别在于应用程序不适用于开发人员环境,因此我需要知道如何优化Sql Server使用的空间(可能是基于规格的每台机器) 我对答案很感兴趣,特别是以下几点: 从SQL Server中提取 文件: 最大服务器内存(MB) 指定SQL Server运行时可以分配的最大内存量 启动并在其运行时启动。这 配置选项可以设置为 具体值,如果您知道有 同时运行多个应用程序 与SQL Server相同,您需要 以确保这些应用程序 有足够的内存运行。如果 这些其他应用程序,例如Web 或电子

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

我对答案很感兴趣,特别是以下几点:

从SQL Server中提取 文件:

最大服务器内存(MB)

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


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

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

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

许多游戏都是这样做的,因为它们通常对内存使用模式有很好的了解,并且经常经过大量优化。默认/系统分配器是通用的,速度不总是足够快,它以它而闻名,当然它的代码是可用的,并且被广泛讨论


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

这将取决于一些因素,特别是操作系统和使用的语言

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

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

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

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

[object alloc]; 
这通常被视为

[[object alloc] init];
请注意,这与在堆栈上创建对象略有不同-如果您认真想学习编程,那么这两者之间的区别可能也很有用:)


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

页面不可用:(@MickeyPerlstein想象一下,仅仅6年后Adobe就破坏了他们的URL方案。太糟糕了。我重写了它,并将链接切换到了更酷的东西。谢谢你的报道!