2008-11-19 36 views
22

Xuất phát từ một nền tảng java, một trong những điều tôi đang sử dụng để nói cho JVM biết kích thước heap tối đa là bao nhiêu. Nếu chương trình đang chạy cố gắng nuốt nhiều hơn mức được cho phép, và trình thu gom rác không thể giải phóng thêm bất kỳ tài nguyên nào, thì OutOfMemoryError bị ném và tất cả đều bị hỏng. Vì vậy, thiết lập kích thước heap tối đa là quan trọng trong Java.Tôi có thể (và tôi có bao giờ muốn) thiết lập kích thước heap tối đa trong .net không?

Điều này có áp dụng trong .net không? Bạn có thể đặt giới hạn kích thước heap không? CLR có tiếp tục phát triển heap cho đến khi đạt đến giới hạn vật lý của máy không? Hoặc là nó không phải là một vấn đề trong. Net cho một số lý do tinh tế mà blinkers Java của tôi ngăn cản tôi nhìn thấy?

Trả lời

19

Bạn không thể đặt kích thước heap tối đa trong. Net trừ khi bạn tự lưu trữ CLR trong một quy trình.

Edit: Để kiểm soát việc phân bổ bộ nhớ của CLR bao gồm kích thước tối đa heap, bạn cần phải sử dụng api lưu trữ để lưu trữ các clr và đặc biệt là sử dụng "giao diện quản lý bộ nhớ", một số thông tin khởi động có thể được tìm thấy ở đây MSDN Magazine, column CLR Inside Out : CLR Hosting APIs

Chỉnh sửa: để trả lời câu hỏi của bạn, tại sao bạn muốn kiểm soát cấp phát bộ nhớ hoặc kích thước heap tối đa cụ thể, bạn thường không muốn, nhưng nếu bạn đang viết một ứng dụng giống SQL Server hoặc IIS hoặc một số ứng dụng thời gian thực thì bạn có lý do khá tốt để kiểm soát bộ nhớ và cụ thể, tránh phân trang, nếu không thì bản thân CLR và HĐH đã làm một công việc khá tốt cho bạn, và những gì còn lại là để đảm bảo ứng dụng của bạn sử dụng tài nguyên tối thiểu để mọi thứ hoạt động tốt.

+0

Cảm ơn - thông tin thú vị về lưu trữ CLR. Có lẽ quá mức cho những gì tôi đang diong bây giờ - Tôi sẽ chỉ đảm bảo rằng tôi không phải là một con heo nhớ. – serg10

+1

Môi trường máy chủ được chia sẻ lưu trữ nhiều ứng dụng phải đảm bảo rằng bộ nhớ tối đa được phân bổ bởi tất cả ứng dụng khách của ứng dụng đó không vượt quá bộ nhớ khả dụng. Bạn không muốn một ứng dụng duy nhất bị lỗi để gỡ toàn bộ máy chủ vì nó phân bổ tất cả bộ nhớ có sẵn. –

+2

@Kelly, đó là những gì IIS và SQL Server làm, bởi vì chúng là máy chủ cho các ứng dụng được quản lý khác, và chúng kiểm soát bộ nhớ mà các ứng dụng được lưu trữ được phép ... mặt khác là ứng dụng .Net không được lưu trữ để phân bổ nhiều như một ứng dụng gốc, không có sự khác biệt ở đó (đó là lý do tại sao .net apis lưu trữ phải được sử dụng để kiểm soát lượng bộ nhớ được phân bổ) –

12

Không, nó không áp dụng trong .NET. Heap thực sự tiếp tục phát triển cho đến khi nó không thể phát triển nữa. (Rõ ràng đây là "sau khi cố gắng phục hồi bộ nhớ thông qua GC, phát triển heap".) Về cơ bản không có gần như nhiều điều chỉnh có sẵn trong .NET GC như trong Java. Bạn có thể chọn máy chủ GC hoặc máy khách, và tôi nghĩ rằng có một tùy chọn để bật/tắt GC đồng thời (tôi sẽ tìm thấy các liên kết trong một phút) nhưng về cơ bản là nó.

EDIT: Có vẻ như có nhiều hơn một chút với nó, mặc dù không phải là một số tiền khổng lồ. Rick Minerich's blog entry on GC settingsthe subsequent one dường như biết nhiều hơn tôi về vấn đề này. Chúng có thể là một điểm khởi đầu tốt cho bất kỳ cuộc điều tra nào khác - nhưng chúng hầu hết là cờ hơn là các giới hạn bộ nhớ có sẵn trong các JVM.

CHỈNH SỬA: Câu trả lời của Pop đặt ra một điểm tốt - Tôi đã giả định một mô hình lưu trữ CLR "bình thường" (tức là không thuộc quyền kiểm soát của bạn). Nếu bạn muốn đi đến các nỗ lực lưu trữ nó cho mình, bạn có khả năng để có được kiểm soát nhiều hơn nữa - với chi phí của công việc phụ của lưu trữ nó. Tôi không thể nói rằng tôi đã từng nhìn vào khía cạnh đó.

4

Theo như tôi đã tìm thấy, không có cách nào đơn giản để control the size of the heap của ứng dụng .Net bằng CLR.

Liên kết ở trên chỉ trả lời một nửa câu hỏi. Khi tôi đã nghiên cứu cùng một vấn đề này, phản hồi là "Heap phát triển để sử dụng tất cả bộ nhớ có sẵn" như thể đó là lý do duy nhất bạn muốn kiểm soát kích thước heap tối đa.

Môi trường máy chủ (thường là Java), bạn không muốn ứng dụng hoạt động kém trong bộ nhớ hog với chi phí của các ứng dụng được lưu trữ khác. Một giải pháp đơn giản là giới hạn số lượng bộ nhớ mà ứng dụng có thể sử dụng cho nó. Điều này được thực hiện với đối số -Xmx của Java để bạn có thể đảm bảo ứng dụng sẽ không sử dụng nhiều hơn những gì được lên kế hoạch, ví dụ: -Xmx256M.Kể từ khi cấp phát bộ nhớ trên heap trong quá trình khởi tạo có thể làm chậm khởi động ứng dụng, Java sử dụng -Xms arg để cho phép các ứng dụng tạo nhiều đối tượng trong quá trình khởi tạo để bắt đầu với khối lớn heap thay vì JVM tiếp tục thay đổi kích thước vùng đi.

CLR của Net không có khả năng này. Tôi nghi ngờ đó là vì CLR của .Net không phải là một máy ảo. CLR xảy ra là một API (khá toàn diện, tôi có thể thêm) phục vụ như một bộ điều hợp cho các tệp .dll gốc tương đương với một cách tiếp cận nhiều hơn giống như một thực thi khi nói đến quản lý bộ nhớ.

Tôi đã hỏi câu hỏi này về phát triển SharePoint và đã nghe rằng có thể kiểm soát heapsize thông qua việc sử dụng các mô-đun IIS được gọi là Ứng dụng web nhờ đó bạn có thể yêu cầu IIS giới hạn bộ nhớ của một ứng dụng web cụ thể. Tôi tự hỏi, nếu điều này là do IIS đã tùy chỉnh các thói quen thay thế/ghi đè new()/malloc()/etc và do đó có thể cung cấp loại điều khiển này cho các ứng dụng khách. Điều đó có nghĩa rằng các ứng dụng độc lập .Net không may mắn nếu bạn không muốn viết trình quản lý bộ nhớ tùy chỉnh trong C++ và tạo giao diện cho .Net

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