.Netでのメモリ割り当ての問題
5144 ワード
最近のテストでは、メモリ不足のテストが要求されています.メモリを消費するために多くのプログラムを開きたくありません.それは面倒で、正確ではありません.そこで小さなプログラムを书いてメモリを占用して、考えはとても简単で、1つのByte配列がメモリを占用していることを宣言して、意外にもこのような简単な考えは正常に仕事をすることができなくて、私の予想に反して、振り回されて、ついに原因を明らかにしました.
.Netに配列が割り当てられている場合、メモリはすぐにコミットされません.このメモリにアクセスする必要がある場合は、コミットされます.これが問題の原因です.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MemoryEat
{
public partial class Form1 : Form
{
byte[] byteContainer;
public Form1()
{
InitializeComponent();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
int memorySize;
if (int.TryParse(this.textBox1.Text, out memorySize))
{
if (memorySize > 0)
{
byteContainer = new byte[memorySize * 1024 * 1024];
// foreach,
//force commit the memory size
foreach (byte b in byteContainer)
{
}
}
}
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
if (byteContainer != null)
{
byteContainer = null;
GC.Collect();
}
}
}
}
.Netに配列が割り当てられている場合、メモリはすぐにコミットされません.このメモリにアクセスする必要がある場合は、コミットされます.これが問題の原因です.