C#でメモリを使用または使用する方法


136

アプリケーションで使用可能なRAMまたはメモリを取得するにはどうすればよいですか?


System.Diagnostics.Processクラスを見てください。
Ronald Wildenberg

3
現在使用されている物理RAMはワーキングセットであり、割り当てられたメモリはプライベートバイトまたは共有バイトに分類されます(割り当てのタイプによって異なります)。
リチャード

回答:


172

以下を使用できます。

Process proc = Process.GetCurrentProcess();

現在のプロセスを取得して使用するには:

proc.PrivateMemorySize64;

プライベートメモリの使用状況を取得します。詳細については、このリンクを参照てください


52
GetCurrentProcessの呼び出し自体がかなりのリソースを割り当てることに注意してください。完了したら、返されたプロセスでDisposeを呼び出すか、コード全体を「using」スコープでラップします。
Mathias Lykkegaard Lorenzen 2014

9
名前空間:System.Diagnosticsアセンブリ:System(System.dll内)
Enigma Plus

12
PrivateMemorySize64プロパティ(およびその他のプロパティ)自体は、Refresh()が呼び出されるまで自動的に更新されないことも追加したいと思います。(上のリンクのページで言及されています。)
ScottRhee

1
:より多くの回答については、この他の同様の質問を参照してくださいstackoverflow.com/questions/14032515/...
アーロンD

1
@ScottRheeは私が間違っている場合は私を修正しますが、プロパティの値はを呼び出した時点で「最新」であると追加しGetCurrentProcessますが、プロパティにアクセスする前に他の操作を実行している場合にのみ更新する必要があります。ソース - 備考は、プロセスのスナップショットが作成された瞬間にプロパティが正しいと言います。
tabjsina

38

あなたはGC.GetTotalMemoryをチェックしたいかもしれませんメソッド。

現在ガベージコレクターによって割り当てられていると考えられているバイト数を取得します。


12
ただし、マネージヒープ内のみです。Arkainの答えは、ネイティブヒープとマネージヒープの両方を提供するはずです。
Yaur

25

System.EnvironmentにWorkingSetがありますプロセスコンテキストにマップされた物理メモリのバイト数を含む64ビットの符号付き整数)があります。

多くの詳細が必要な場合はSystem.Diagnostics.PerformanceCounterがありますが、セットアップには少し手間がかかります。


あなた(または誰か)は、PerformanceCounterを使用してシステムを使用可能/使用済みメモリにする方法の例を挙げられますか?
Elemental of Creation

11

見て、ここで詳細は。

private PerformanceCounter cpuCounter;
private PerformanceCounter ramCounter;
public Form1()
{
    InitializeComponent();
    InitialiseCPUCounter();
    InitializeRAMCounter();
    updateTimer.Start();
}

private void updateTimer_Tick(object sender, EventArgs e)
{
    this.textBox1.Text = "CPU Usage: " +
    Convert.ToInt32(cpuCounter.NextValue()).ToString() +
    "%";

    this.textBox2.Text = Convert.ToInt32(ramCounter.NextValue()).ToString()+"Mb";
}

private void Form1_Load(object sender, EventArgs e)
{
}

private void InitialiseCPUCounter()
{
    cpuCounter = new PerformanceCounter(
    "Processor",
    "% Processor Time",
    "_Total",
    true
    );
}

private void InitializeRAMCounter()
{
    ramCounter = new PerformanceCounter("Memory", "Available MBytes", true);

}

値が0の場合、NextValue()2回呼び出す必要があります。次に、CPU使用率の実際の値を示します。詳細はこちらをご覧ください。


6

@JesperFyhrKnudsenの回答と@MathiasLykkegaardLorenzenのコメントに加えてdispose、返された方がよいでしょうProcess、それを使用した後。

したがって、を破棄するためProcessに、usingスコープでラップするかDispose、返されたプロセス(proc変数)を呼び出すことができます。

  1. using 範囲:

    var memory = 0.0;
    using (Process proc = Process.GetCurrentProcess())
    {
        // The proc.PrivateMemorySize64 will returns the private memory usage in byte.
        // Would like to Convert it to Megabyte? divide it by 2^20
           memory = proc.PrivateMemorySize64 / (1024*1024);
    }
  2. またはDisposeメソッド:

    var memory = 0.0;
    Process proc = Process.GetCurrentProcess();
    memory = Math.Round(proc.PrivateMemorySize64 / (1024*1024), 2);
    proc.Dispose();

これでmemory、メガバイトに変換される変数を使用できます。


3
注意:1メガバイトは1e + 6ではなく2 ^ 20です
Hylaean

1
1つのメモ。C#^では、パワーではなくビットごとのXORです。だから使用proc.PrivateMemorySize64 / (1024*1024)、またはproc.PrivateMemorySize64 / (1 << 20)
СергейРыбаков

proc.PrivateMemorySize64 / (1024 * 1024)乗算が除算よりも優先されないため、括弧を逃しました。
Laurynas Lazauskas

@LaurynasLazauskas答えを更新しました。ありがとう。
Ahmad Payan

0

システム全体については、Microsoft.VisualBasic Frameworkを参照として追加できます。

 Console.WriteLine("You have {0} bytes of RAM",
        new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory);
        Console.ReadLine();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.