2011-01-31 28 views
12

MSDN:Hạn chế bộ nhớ quá trình với MaxWorkingSet

public IntPtr MaxWorkingSet { get; set; }

Gets hoặc đặt tối đa cho phép làm việc thiết lập kích thước cho các liên quá trình. Giá trị thuộc tính: Tối đa kích thước bộ làm việc được phép trong bộ nhớ cho quy trình, tính bằng byte.

Vì vậy, theo như tôi hiểu, tôi có thể giới hạn số lượng bộ nhớ có thể được sử dụng bởi một quy trình. Tôi đã cố gắng này, nhưng không có may mắn ..

Một số mã:

public class A 
{ 
    public void Do() 
    { 
     List<string> guids = new List<string>(); 
     do 
     { 
      guids.Add(Guid.NewGuid().ToString()); 
      Thread.Sleep(5); 
     } while (true); 
    } 
} 


public static class App 
{ 
    public static void Main() 
    { 
     Process.GetCurrentProcess().MaxWorkingSet = new IntPtr(2097152); 
     try 
     { 
      new A().Do(); 
     } 
     catch (Exception e) 
     { 

     } 
    } 
} 

Tôi đang mong đợi ngoại lệ OutOfMemory sau khi giới hạn 2MB được đạt tới, nhưng không có gì xảy ra .. Nếu tôi mở Task Manager Tôi có thể thấy rằng số lượng bộ nhớ mà ứng dụng của tôi sử dụng đang phát triển liên tục mà không có bất kỳ giới hạn nào.

Tôi đang làm gì sai? Cảm ơn trước

Trả lời

10

Không, điều này không giới hạn số lượng bộ nhớ được sử dụng bởi quy trình. Nó chỉ đơn giản là một wrapper xung quanh SetProcessWorkingSetSize mà a) là một khuyến nghị và b) giới hạn bộ làm việc của quá trình, là số lượng bộ nhớ vật lý (RAM) mà quá trình này có thể sử dụng.

Nó sẽ hoàn toàn không gây ra một ngoại lệ bộ nhớ trong quá trình đó, ngay cả khi nó phân bổ đáng kể nhiều hơn những gì bạn đặt thuộc tính MaxWorkingSet.

Có một giải pháp thay thế cho những gì bạn đang cố gắng thực hiện - API đối tượng công việc Win32. Có một trình bao bọc được quản lý cho điều đó trên Codeplex (http://jobobjectwrapper.codeplex.com/) mà tôi đã đóng góp. Nó cho phép bạn tạo một quy trình và giới hạn số lượng bộ nhớ mà quá trình này có thể sử dụng.

+0

Cảm ơn rất nhiều! Một số câu hỏi khác trong trường hợp này :). Điều gì có thể gây ra một sự tăng trưởng đáng kể của việc sử dụng thiết lập làm việc? Và điều gì sẽ xảy ra khi nó đạt đến giới hạn? Nó sẽ được OutOfMemory ngoại lệ hoặc smth khác? – Andrey

+0

Khi quá trình cấp phát bộ nhớ, nó có thể tiêu thụ bộ làm việc (RAM). Tuy nhiên, nếu cần RAM trong các quá trình/thành phần hệ thống khác, thì một số quy trình làm việc có thể được phân trang ra đĩa. Nếu bạn sử dụng Job Objects và chạy vào giới hạn, quá trình này được chấm dứt và bạn có thể nhận được thông báo rằng điều này đã xảy ra. –

+0

Thực ra đó là sai. Bộ làm việc là bộ nhớ được sử dụng gần đây bao nhiêu mà quá trình mong đợi cần trong bộ làm việc, ảnh hưởng đến L1/L2, chứ không phải RAM. Nó phụ thuộc vào hạt nhân hệ điều hành khi gỡ bỏ WS. Bộ làm việc là bộ nhớ LRU mà bạn mong đợi được lặp lại trong quá trình xử lý, ví dụ một cái nhìn nhỏ cần WS nhỏ trong khi một vòng lặp lớn đòi hỏi nhiều hơn. Thiết lập Working Set không ảnh hưởng đến lượng RAM mà quá trình sẽ sử dụng. –

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