C# 我的进程内存是常量吗?

C# 我的进程内存是常量吗?,c#,memory,C#,Memory,这是一个学术问题。如果我有恒定数量的变量、对象等,我们假设GC不会启动,并且没有瓶颈。是否有其他因素会迫使我的应用程序内存波动?在这种情况下,由我的进程分配的内存是否保持不变?您可以使用修改可用内存量的互操作调用非托管函数。此外,JIT编译器可能随时启动,将IL转换为机器代码,并可能消耗内存。如果你使用.NET的话,你也不能假设GC不会起作用,所以你从错误的假设中得出的任何结论都是错误的。因此,要回答您的问题,您不能假设内存将保持不变。您可以使用修改可用内存量的interop调用非托管函数。此外

这是一个学术问题。如果我有恒定数量的变量、对象等,我们假设GC不会启动,并且没有瓶颈。是否有其他因素会迫使我的应用程序内存波动?在这种情况下,由我的进程分配的内存是否保持不变?

您可以使用修改可用内存量的互操作调用非托管函数。此外,JIT编译器可能随时启动,将IL转换为机器代码,并可能消耗内存。如果你使用.NET的话,你也不能假设GC不会起作用,所以你从错误的假设中得出的任何结论都是错误的。因此,要回答您的问题,您不能假设内存将保持不变。

您可以使用修改可用内存量的interop调用非托管函数。此外,JIT编译器可能随时启动,将IL转换为机器代码,并可能消耗内存。如果你使用.NET的话,你也不能假设GC不会起作用,所以你从错误的假设中得出的任何结论都是错误的。因此,要回答您的问题,您不能假设内存将保持不变。

您的场景是人为的,不现实的:

我们假设GC不会起作用


嗯,会的。应用程序在执行过程中可能会采用不同的路径。如果是这样的话,那么状态可能会时不时地不同,对堆上对象的引用可能会保留更长的时间,等等。我真的不明白这个问题的目的。

您的场景是人为的,不现实的:

我们假设GC不会起作用


嗯,会的。应用程序在执行过程中可能会采用不同的路径。如果是这样的话,那么状态可能会时不时地不同,对堆上对象的引用可能会保留更长的时间,等等。我真的不明白这个问题的目的。

有可能,正如问题中提到的那种情况,将系统置于一种状态,即它使用一个常量内存集工作,而没有发生GC(因为没有分配任何需要它收集的内容,并且它会消失为零)。与此相关的文章甚至有一个实际(但高度专业化)的案例


请注意,它们有大量的方法和类,我们大多数人每天都会用到,但它们没有使用。

这是可能的,就像问题中提到的那种情况,将系统置于一种状态,即它使用一个常量内存集工作,而没有GC发生(因为没有分配任何需要它收集的东西,而且它也会消失殆尽)。链接到的文章甚至有一个实际(但高度专业化)的案例


请注意,它们有大量的方法和类,而我们大多数人每天都不会使用它们。

如果系统上没有足够的可用内存,为什么要启动GC?@kofucii:GC使用不同的数据集大小。最近分配的数据被装入一个非常小的缓冲区,当缓冲区用完时,GC运行,并进行清理增加一些分配,并将其他分配移动到更大的堆中以用于较旧的对象。因此,即使您有足够的内存,只要您分配了相当小的内存量,.NET GC就会运行,而不管您有多少总内存。这仍然是一个好问题。这正是.NET GC遵循的策略。:@kofucii,@jalf所说的是正确的,因为除非GC清除内存,否则大量分页将意味着“足够的空闲内存”仍然无法有效使用。但是,可能不会再发生堆分配,GC也会停止,但99.999%的时间并不理想。如果系统上没有足够的可用内存,为什么要启动GC?@kofucii:GC使用不同的数据集大小。最近分配的数据被装入一个非常小的缓冲区,当缓冲区用完时,GC将运行,清理一些分配,并将其他分配移到更大的堆中,用于较旧的对象。因此,即使您有足够的内存,只要您分配了相当小的内存量,.NETGC就会运行,不管您有多少总内存。尽管如此,这仍然是一个好问题。这正是.NET GC遵循的策略。:)@kofucii,@jalf所说的是正确的,因为除非GC清除内存,否则大量分页将意味着“足够的空闲内存”仍然无法有效使用。然而,有可能不再发生堆分配,GC停止,但在99.999%的情况下并不理想。