2011-08-04 42 views
5

Tôi là người mới ở địa điểm này và khởi động bằng điện thoại di động C#. Bây giờ, tôi đang làm việc trên nền tảng thiết bị cầm tay C#. Vì vậy, tôi có một số câu hỏi để hỏi về cách sử dụng bộ nhớ. Tôi đã thử GC.GetTotalMemory() và nhận bộ nhớ được cấp phát mà GC đã sử dụng. Nhưng, tôi có thể sử dụng điều này để ước tính rằng ứng dụng của tôi được cấp phát bộ nhớ bao nhiêu. Tôi cho rằng nó có thể nhưng không thực sự chính xác. Sau đó, tôi đã thử google để tìm kiếm bất kỳ tài liệu tham khảo hoặc lớp hoặc bất cứ điều gì để sử dụng cho kiểm tra bộ nhớ trên windows CE nhưng tôi đã tìm thấy chỉ trong một nền tảng khác mà không được hỗ trợ với điều tôi đang làm.C# Windows CE .net 3.5 để kiểm tra mức sử dụng bộ nhớ

Cảm ơn trước, Stoper


Apologize cho rằng tôi đi ra khỏi bài đăng này.

Tôi thực sự cảm ơn bạn với bất kỳ ai đã trả lời câu hỏi của tôi và xem trên bài đăng này.

Bây giờ, tôi có tất cả những gì tôi cần bằng cách triển khai tham chiếu "OpenNetCF" trong dự án của tôi.

Cảm ơn một lần nữa;)

Trả lời

6

Theo các tài liệu, GC.GetTotalMemory lợi nhuận

Một số đó là xấp xỉ tốt nhất hiện có của số byte hiện phân bổ trong bộ nhớ được quản lý.

Đây là một chút gây hiểu lầm/gây nhầm lẫn cho một số nhà phát triển, đặc biệt là những người đến từ một thế giới bản địa. Nó sẽ cho bạn biết số lượng bộ nhớ mà GC đã phân bổ nội bộ nhưng không phân bổ thực tế cho toàn bộ heap (tức là được phân bổ và chưa phân bổ bộ nhớ được quản lý) từ hệ thống.

Nó cũng không báo cáo phân bổ gốc. Điều này có thể rất lớn nếu bạn sử dụng nhiều đối tượng GDI (bitmap, cọ vẽ, vv) vì chúng cũng có phân bổ bộ nhớ riêng. Trong trường hợp của một Bitmap, nó được quản lý dấu chân thực sự là nhỏ hơn nhiều so với dấu chân bản địa của nó.

Nếu bạn quan tâm đến các ứng dụng được quản lý tác động thực sự lên tài nguyên hệ thống tổng thể, bạn cần truy vấn hệ điều hành và yêu cầu bộ nhớ và bộ nhớ ảo thực tế như thế nào. tìm GC.GetTotalMemory tương đối vô dụng trong thực tế). P/Gọi GlobalMemoryStatus cung cấp cho bạn những gì bạn muốn. MSDN có chứa an example.

+0

Tôi tìm thấy 'GlobalMemoryStatus' khá không chính xác trên thiết bị Windows CE 6 của tôi. Các giá trị tải ảo, vật lý sẵn có và bộ nhớ có sẵn sẽ nhảy xung quanh khi tôi tiếp tục tải thêm hình ảnh vào bộ nhớ. Đôi khi các giá trị sẽ cao hơn trước khi hình ảnh được tải xuống, đôi khi thấp hơn, mặc dù tôi đang tải hình ảnh (tất cả các hình ảnh đều được tải). – Trisped

+0

Tôi nghi ngờ nó không chính xác - Tôi chưa bao giờ thấy một nền tảng ở đó. Nó có thể là bạn chỉ đơn giản là không hiểu chính xác những gì nó có nghĩa là. GC giữ một đống riêng, có thể tăng hoặc thu nhỏ.Để phát triển hoặc thu nhỏ nó * có thể * cấp phát hoặc bộ nhớ miễn phí từ hệ điều hành. Những phân bổ có thể lấy từ vật lý hoặc ảo tùy thuộc vào việc họ là những trang cam kết cụ thể, hoặc nếu chúng được bảo lưu hoàn toàn. Việc cấp phát bộ nhớ không phải là siêu đơn giản, và GC đang thêm một lớp phức tạp khác lên trên nó. – ctacke

+0

Nếu bạn muốn tôi có thể giúp bạn kết xuất đầu ra. Tôi không chắc chắn nếu có cái gì đó đặc biệt trong hệ điều hành, nhưng tôi có một vòng lặp tải hình ảnh. Dường như ngẫu nhiên, tổng bộ nhớ vật lý và ảo sẵn có sẽ nhảy lên. Điều này sẽ là không thể trừ khi mọi thứ đang được di chuyển ra khỏi bộ nhớ. – Trisped

3

Hãy thử điều này. Nó sẽ cung cấp cho bạn những gì tôi nghĩ rằng bạn muốn, bao gồm cả những gì bạn đã có với GC.GetTotalMemory(). Bạn sẽ phải thay thế các lab lab bằng văn bản của riêng bạn hoặc sử dụng nó theo bất kỳ cách nào bạn muốn. Bạn sẽ phải sử dụng P/Invoke dù ...

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"); 
    /*************************************************************************/ 
} 
+0

Cảm ơn tất cả các bạn. Bây giờ, tôi đã nhận được tài liệu tham khảo "OpenNETCF". Đó là tất cả những gì tôi muốn. Nhưng tôi vẫn tìm cách sử dụng bộ nhớ ứng dụng. –

Các vấn đề liên quan