一位采访者刚问我一个以前没想过的特殊问题。
“你如何在C#中尽快填写计算机内存?”
我回答说我可能会使用某种递归函数,但他指出在填充内存之前我可能会得到堆栈溢出。
我的问题很简单,如何使用C#尽快填写计算机内存?
答案 0 :(得分:8)
我会用叉弹:
while (true) Process.Start(Assembly.GetExecutingAssembly().Location);
这个概念很熟悉,程序无休止地开始自己的新实例。
答案 1 :(得分:2)
Fork-Bomb,这最终会使CPU非常繁忙,但不一定会填满内存。如果你有GB的内存和一个小程序,Windows MMU最终可能会将未使用的(以前的分支)交换到磁盘,并且仍可以为其他程序保留内存。唯一的问题是,这不会填充内存,而只会使系统无法响应。
虚拟内存,通过使用Marshal.AllocHGlobal或类似函数分配大对象,你可能会认为你正在填充内存,但是再一次,但是如果你只是分配内存并且不使用它们来读取操作系统更智能再次,操作系统将再次将它们重新打包回磁盘,仍然不占用所有内存。这仍然是虚拟内存,操作系统将允许您通过.net指南给出的MAX内存,然后它将开始不再占用内存,而不会实际占用所有内存。
物理内存,现在这很棘手,首先,在任何应用程序中,在正常情况下都无法访问Windows中的物理内存。如果你真的想填写内存(物理内存),那么你必须编写一个内核模式驱动程序来完成它。
AllocateUserPhysicalPages 功能。这是唯一允许您分配物理内存的Windows API(在某种程度上可以更快地填充内存),使其无法用于其他进程。 https://msdn.microsoft.com/en-us/library/aa366528(VS.85).aspx SQL Server使用它,我相信即使是其他数据库也会使用它来预先分配物理内存,这个内存更快,主要用于缓存目的。
答案 2 :(得分:1)
我还没有尝试过,但我会选择类似的东西:
for city in d.index.get_level_values(0).unique():
d[d['City']==city].plot(x='subindex', y='H')
答案 3 :(得分:1)
创建一堆对象并避免它们被垃圾收集。
call kill()并享受。
void kill()
{
while(true)
ThreadPool.QueueUserWorkItem(fill));
}
void fill(Object o)
{
List<Object> list = new List<Object>();
while(true)
list.Add(new Object());
}
答案 4 :(得分:0)
string text = File.ReadAllText("C:\\Test\\BigFile.any");
更新
我认为代码本身可以说明一切。因此,在您的计算机中找到一个大文件,例如一个电影文件,例如“ D:\ Movies \ BigMovieFile.mp4”。并以字符串形式读取该文件,因为string
是非常消耗内存的类型。在32位应用程序中,1Gb文件足以耗尽内存。由于64位应用程序将使用计算机的所有内存,因此必须选择更大的文件,或者必须重复读取过程。 我认为这种方法将尽可能快。
答案 5 :(得分:0)
创建一个具有有效负载并实现终结器的类。然后产生许多优先级最高的线程,这些线程均创建此类的实例。他们不必坚持下去,因为他们将进入终结器队列。终结器线程将无法跟上要终结的传入对象的速率,您将有效地填充进程内存。在32位系统上可能不足以填充计算机内存,但在64位系统上,您应该能够在大多数系统上使用。