5

私はこの場所の初心者であり、C# モバイルの初心者です。現在、C# ハンドヘルド デバイス プラットフォームに取り組んでいます。それで、メモリ使用量を取得する方法について質問があります。GC.GetTotalMemory()を試して、GC が使用した割り当てられたメモリを取得しました。しかし、これを使用して、アプリケーションに割り当てられたメモリの量を推定できますか。それは正しいかもしれませんが、実際には正しくないと思います。次に、Windows CEでメモリをチェックするために使用する参照やクラス、または何かを検索するためにGoogleを試しましたが、私がやっていることでサポートされていない別のプラットフォームでしか見つかりませんでした。

前もってありがとう、ストッパー


この投稿から離れたことをお詫びします。

私の質問に答えてくれて、この投稿を見てくれた人には本当に感謝しています。

これで、プロジェクトに「OpenNetCF」リファレンスを実装することで、必要なものがすべて揃いました。

再度、感謝します ;)

4

2 に答える 2

6

ドキュメントによると、GC.GetTotalMemory返品

マネージ メモリに現在割り当てられているバイト数の、利用可能な最良の近似値である数値。

これは、一部の開発者、特にネイティブの世界から来た開発者にとって、少し誤解を招く/混乱させるものです。GC が内部的に割り当てたメモリの量はわかりますが、システムからのヒープ全体 (つまり、割り当て済みおよび未割り当ての管理メモリ)に対する実際の割り当てはわかりません。

また、ネイティブ割り当ても報告しません。多くの GDI オブジェクト (ビットマップ、ブラシなど) を使用する場合、それらにもネイティブ メモリ割り当てがあるため、これは非常に大きくなる可能性があります。ビットマップの場合、管理されたフットプリントは実際にはネイティブのフットプリントよりもはるかに小さくなります。

マネージド アプリがシステム リソース全体に実際に与える影響に関心がある場合は、OS にクエリを実行し、何が起こっているかを実際に把握するために必要な物理メモリと仮想メモリの量を確認する必要があります (GC.GetTotalMemory は次のようになります)。実際には比較的役に立たない)。P/Invoking GlobalMemoryStatusを使用すると、必要なものが得られます。MSDN には例が含まれています。

于 2011-08-04T05:09:12.383 に答える
3

これを試して。GC.GetTotalMemory() で持っていたものを含め、あなたが望むと思うものを提供します。テキスト ラベルを独自のものに置き換えるか、任意の方法で使用する必要があります。ただし、P/Invoke を使用する必要があります...

public struct MEMORYSTATUS
{
    public UInt32 dwLength;
    public UInt32 dwMemoryLoad;
    public UInt32 dwTotalPhys;
    public UInt32 dwAvailPhys;
    public UInt32 dwTotalPageFile;
    public UInt32 dwAvailPageFile;
    public UInt32 dwTotalVirtual;
    public UInt32 dwAvailVirtual;
}

[DllImport("coredll.dll")]
private static extern void GlobalMemoryStatus(out MEMORYSTATUS lpBuffer);

public static void GetGlobalMemoryStatus(out UInt32 dwTotal, out UInt32 dwAvail,
                                             out UInt32 dwProcTotal, out UInt32 dwProcAvail)
{
    MEMORYSTATUS status = new MEMORYSTATUS();
    output.Length = (UInt32)System.Runtime.InteropServices.Marshal.SizeOf(output);
    GlobalMemoryStatus(out status);

    dwTotal = status.dwTotalPhys;
    dwAvail = status.dwAvailPhys;
    dwProcTotal = status.dwTotalVirtual;
    dwProcAvail = status.dwAvailVirtual;
}

private void UpdateMemoryDisplay()
{
    /*************************************************************************/
    bool IsTotalGB = false;
    bool IsUsedGB = false;
    uint TotalRamMemory;
    uint AvailRamMemory;
    uint ProcTotalRamMemory;
    uint ProcAvailRamMemory;

    GetGlobalMemoryStatus(out TotalRamMemory, out AvailRamMemory,
                          out ProcTotalRamMemory, out ProcAvailRamMemory);

    float TotalMB = (float)((float)TotalRamMemory / (1024 * 1024));
    float UsedMB = TotalMB - (float)((float)AvailRamMemory / (1024 * 1024));

    int RamPercent = (int)((UsedMB / TotalMB) * 100.0);

    if (1000 < TotalMB)
    {
        TotalMB /= 1000;
        IsTotalGB = true;
    }

    if (1000 < UsedMB)
    {
        UsedMB /= 1000;
        IsUsedGB = true;
    }

    this.RamMemMinLbl.Text = UsedMB.ToString("0.0") + ((false != IsUsedGB) ? "GB" : "MB");
    this.RamMemMaxLbl.Text = TotalMB.ToString("0.0") + ((false != IsTotalGB) ? "GB" : "MB");
    this.RamMemPercent.Current = RamPercent;

    IsUsedGB = false;

    TotalMB = (float)((float)ProcTotalRamMemory / (1024 * 1024));
    UsedMB = TotalMB - (float)((float)ProcAvailRamMemory / (1024 * 1024));

    if (1000 < UsedMB)
    {
        UsedMB /= 1000;
        IsUsedGB = true;
    }

    this.ProcRamMemMinLbl.Text = UsedMB.ToString("0.0") + ((false != IsUsedGB) ? "GB" : "MB");

    IsUsedGB = false;

    UsedMB = (float)((float)GC.GetTotalMemory(false) / (1024 * 1024));

    if (1000 < UsedMB)
    {
        UsedMB /= 1000;
        IsUsedGB = true;
    }

    this.GCMemMinLbl.Text = UsedMB.ToString("0.0") + ((false != IsUsedGB) ? "GB" : "MB");
    /*************************************************************************/
}
于 2011-08-20T23:01:58.800 に答える