2010-06-11 27 views
12

Mỗi lần và một lần nữa tôi thấy mình làm điều gì đó vừa phải câm mà kết quả trong chương trình của tôi phân bổ tất cả bộ nhớ nó có thể nhận được và sau đó một số.Làm thế nào để bạn tự bảo vệ mình khỏi việc tiêu thụ bộ nhớ bỏ chạy làm giảm PC?

Loại điều này được sử dụng để làm cho chương trình chết khá nhanh với lỗi "hết bộ nhớ", nhưng những ngày này Windows sẽ hết cách để cung cấp bộ nhớ không tồn tại này cho ứng dụng và trên thực tế dường như được chuẩn bị để tự tử làm như vậy. Không phải là tất nhiên, nhưng nó sẽ khiến bản thân RAM khó sử dụng đến nỗi thậm chí chạy trình quản lý tác vụ cũng sẽ mất nửa giờ để hoán đổi (sau khi tất cả ứng dụng chạy trốn vẫn phân bổ bộ nhớ ngày càng nhiều).

Điều này không xảy ra quá thường xuyên, nhưng khi điều đó thật tai hại. Tôi thường phải thiết lập lại máy tính của tôi, gây ra mất dữ liệu theo thời gian và nói chung là rất nhiều bất tiện.

Bạn có lời khuyên thực tế nào về việc làm cho hậu quả của một sai lầm như vậy ít nghiêm trọng hơn không? Có lẽ một số tinh chỉnh registry để hạn chế số tiền tối đa của bộ nhớ ảo mà một ứng dụng được phép phân bổ? Hoặc một số cờ CLR sẽ giới hạn điều này chỉ cho ứng dụng hiện tại? (. Nó thường trong .NET mà tôi làm điều này để bản thân mình)

("Đừng chạy ra khỏi RAM""Mua thêm RAM" không sử dụng - cựu Tôi không có quyền kiểm soát, và sau này tôi đã làm.)

+1

+1, tôi đã có ý định đặt câu hỏi này một lúc. Nó thậm chí còn tồi tệ hơn khi nó không phải là ứng dụng của tôi và tôi không thể nhấn 'Stop'. – zildjohn01

+0

Thông thường, tôi đủ nhanh để tiêu diệt ứng dụng của mình bất cứ khi nào tôi cảm thấy có sự cố như thế này. Tuy nhiên 1 để suy nghĩ về một giải pháp thay vì chỉ sống với "nguy hiểm" này. Có lẽ có một số tinh chỉnh, điều đó sẽ được đánh giá cao! – zerm

+2

Tôi chưa bao giờ thấy tiêu thụ bộ nhớ runaway mang máy tính xuống, nhưng nếu có, thì tôi hy vọng nó thực hiện điều đó trong quá trình phát triển hoặc QA để chúng tôi có thể khắc phục vấn đề; hoặc nếu nó xảy ra trong quá trình sản xuất, tôi hy vọng những người hoạt động của chúng tôi sẽ giết/phá hủy quy trình và thông báo cho tôi về nó. –

Trả lời

8

Bạn có thể giữ một dấu nhắc lệnh mở bất cứ khi nào bạn chạy một ứng dụng nguy hiểm. Sau đó, nếu nó bắt đầu để có được ra khỏi tầm kiểm soát, bạn không cần phải chờ đợi cho Task Manager để tải, chỉ cần sử dụng:

taskkill /F /FI "MEMUSAGE ge 2000000" 

này sẽ (về mặt lý thuyết) có hiệu lực giết bất cứ điều gì sử dụng nhiều hơn 2GB bộ nhớ.

Sử dụng taskkill /? để nhận danh sách đầy đủ các tùy chọn cần thiết.

EDIT: Thậm chí tốt hơn, hãy chạy lệnh dưới dạng tác vụ được lên lịch sau vài phút. Bất kỳ quá trình nào bắt đầu nổ tung sẽ tự động bị zapped.

+0

Ý tưởng tuyệt vời với lịch trình, điều này có thể chỉ thực hiện thủ thuật. Tôi không biết taskkill có khả năng lọc mạnh mẽ. –

+1

+100. Điều này đang ở trong thanh khởi động nhanh của tôi. Sau khi "một vài phút" đi qua, nó thường là quá muộn. – zildjohn01

+1

Miễn là nó không giết hình ảnh 3D qua đêm của bạn một nửa ... –

0

Tôi thường sử dụng Trình quản lý tác vụ trong trường hợp đó để hủy quá trình trước khi máy chạy bộ nhớ. TaskMan chạy khá tốt ngay cả khi máy bắt đầu phân trang khá nặng. Sau đó máy sẽ thường phục hồi. Các phiên bản sau của Windows (như 7) thường có nhiều khả năng sống sót hơn trong các tình huống này so với các phiên bản trước đó. Chạy mà không có DWM (tắt chủ đề Aero trong Vista và 7) nói chung cũng cho nhiều thời gian hơn để gọi taskman để theo dõi và có khả năng giết chết các quy trình chạy trốn.

4

Câu trả lời rõ ràng là chạy chương trình bên trong máy ảo cho đến khi nó được kiểm tra đến mức bạn chắc chắn rằng những thứ như vậy sẽ không xảy ra.

Nếu bạn không thích số tiền trên đó, có một chút trung gian: bạn có thể chạy quá trình đó bên trong một đối tượng công việc với giới hạn được đặt trên bộ nhớ được sử dụng cho đối tượng công việc đó.

+1

Máy ảo sẽ chết hoàn toàn nếu nó xảy ra, và vì đó là nơi tôi đã phát triển, tôi đã chịu đựng gần như tất cả các hiệu ứng tương tự. Re đối tượng công việc: đã không đi qua những trước; là nó có thể thiết lập Visual Studio để bắt đầu gỡ lỗi "thông qua" một đối tượng công việc, nếu tôi có thể nói như vậy? –

+1

Phải - bạn phải gán nó cho một máy ảo riêng biệt để có được nhiều điều tốt. Tôi không nghĩ rằng VS hỗ trợ đưa người tị nạn vào các đối tượng công việc, mặc dù nó có vẻ như một bước rõ ràng. –

1

Trong Windows bạn có thể kiểm soát các thuộc tính của một quá trình sử dụng Job Objects

7

Có một số việc bạn có thể làm: giới hạn quy mô làm việc của quy trình của bạn.Dán mã này vào phương thức Main() của bạn:

#if DEBUG 
     Process.GetCurrentProcess().MaxWorkingSet = new IntPtr(256 * 1024 * 1024); 
#endif 

Điều đó giới hạn số lượng RAM mà quy trình của bạn có thể yêu cầu, ngăn chặn các quá trình khác bị hoán đổi hoàn toàn.

Những điều khác bạn có thể làm:

  • Thêm RAM hơn, có lý do để không có ít nhất 3 Gigabyte những ngày này.
  • Chống phân mảnh tệp hoán trang của bạn. Điều đó đòi hỏi phải chống phân mảnh đĩa trước, sau đó chống phân mảnh tệp hoán trang với, tiện ích pagedefrag của SysInternals.

Đặc biệt nhiệm vụ bảo trì sau rất quan trọng đối với các máy cũ. Một tệp hoán trang có thể làm giảm đáng kể hành vi hoán đổi. Phổ biến trên các máy XP không bao giờ được phân mảnh trước và có một đĩa nhỏ được phép lấp đầy. Phân mảnh tệp hoán trang gây ra rất nhiều đầu đĩa tìm kiếm, ảnh hưởng xấu đến tỷ lệ cược rằng một quá trình khác có thể tự trao đổi lại thành RAM trong một khoảng thời gian hợp lý.

+0

+1. Tôi nghĩ rằng bạn chỉ cần thực hiện một phần nhỏ của công việc thử nghiệm của tôi khoảng 10 lần dễ dàng hơn ... –

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