2009-10-26 26 views
5
  1. Lý do có thể có của OutofMemory ngoại lệ là gì.Ngoại lệ OutOfMemory

  2. Phân bổ bộ nhớ phải được xử lý bởi GC.

  3. Bao nhiêu bộ nhớ được phân bổ/Chỉ dành cho ứng dụng bình thường .NET/C#

Trong ứng dụng của chúng tôi nói đến ở nhiều nơi khác nhau như Stream.ReadToEnd()DataTable.WriteXml(Memory stream) chức năng.

Môi trường là Net C#

+1

Đầu tiên, ít nhất đề cập đến môi trường (nếu có) câu hỏi của bạn là về. Ít nhất. Net và Java có ngoại lệ OOM. Thứ hai, 2) đây thậm chí không phải là một câu hỏi thích hợp. Bạn hỏi gì? Bỏ phiếu để đóng. – sleske

+0

1) Envoirment là .Net C# 2) tại sao ques này là không thích hợp – Buzz

+0

Vâng, câu hỏi 1) một câu hỏi, nhưng như vậy chung rằng nó không thực sự có một câu trả lời có ý nghĩa. 2) không phải là một câu hỏi, và 3) nên ít nhất có được một dấu hỏi. Hãy thử và sử dụng dấu chấm câu và chính tả thích hợp, và quan trọng nhất và đưa ra một số ngữ cảnh. – sleske

Trả lời

7

Các OutOfMemory exception xảy ra bất cứ khi nào một cuộc gọi đến bất kỳ hướng dẫn MSIL sau thất bại

  1. newobj
  2. newarr
  3. hộp

Mà về cơ bản hoạt động s phân bổ bộ nhớ mới trong heap, trong trường hợp của bạn Stream.ReadToEnd rõ ràng phân bổ mảng byte nội bộ để tải luồng trong bộ nhớ, vì vậy nếu tập tin đủ lớn để phá vỡ quá trình nó sẽ ném ngoại lệ này.

1
  1. Giả sử bạn có bộ nhớ tối đa 10MB để sử dụng trong ứng dụng của mình. Bạn tạo một List mới và thêm vào nó Object instance. Bây giờ hãy nói rằng mỗi đối tượng thể hiện "trọng lượng" 1MB. Vì vậy, 10 cá thể đầu tiên sẽ được thêm vào mà không gặp vấn đề gì nhưng cá thể thứ 11 sẽ ném OutOfMemoryException như sau 10 cá thể đầu tiên bạn sử dụng tất cả bộ nhớ được cấp phát (10MB).

  2. Bộ thu gom rác tìm kiếm "Rác", Các trường hợp sẽ không sử dụng - CANT nào được sử dụng như không có trường hợp nào khác trỏ đến chúng. Trong trường hợp ví dụ có một cá thể thành viên của loại Danh sách có chứa các cá thể, GC sẽ không thu thập Danh sách cũng như các trường hợp của nó. Tiếp tục thêm các trường hợp vào Danh sách có thể và với ngoại lệ OutOfMEmory.

Sử dụng các đối số vm sau đây nếu bạn muốn/cần tăng bộ nhớ sử dụng bởi ứng dụng của bạn: Java youAppName -Xms128m -Xmx512m

2

Hoặc bạn đang sử dụng nhiều bộ nhớ hơn so với ứng dụng có sẵn cho nó . Trong trường hợp này, bạn sẽ cần phải làm việc ra làm thế nào để làm cho bộ nhớ của bạn sử dụng hiệu quả hơn. Sử dụng Tệp/Cơ sở dữ liệu để lưu trữ dữ liệu bạn không sử dụng ngay lập tức có thể cần thiết ..

Hoặc, bạn bị rò rỉ bộ nhớ. Trong trường hợp đó, bạn cần phải xem xét việc loại bỏ các tham chiếu đến bộ nhớ khi bạn không còn sử dụng chúng để GC có thể giải phóng bộ nhớ.

Nếu bạn đang sử dụng C# hoặc .Net, bạn có thể sử dụng CLR Profiler để phân tích bộ nhớ của bạn để xem nó đang được sử dụng như thế nào. CLR Profiler

+0

số bộ nhớ có sẵn cho ứng dụng làm cách nào tôi có thể kiểm tra? – Buzz

+0

Trên Windows 32 bit (trước Win7), có giới hạn cứng 2GB trên Bộ nhớ ảo (3GB với một công tắc nhất định). Windows 64 bit có thể hỗ trợ 8TB (7TB trên Itanic). Bộ nhớ thực mà bạn có thể truy cập trước khi lỗi phân bổ có thể thay đổi. –

2

Hoặc ứng dụng của bạn đã sử dụng hết bộ nhớ có sẵn cho nó hoặc bạn gặp sự cố với phân đoạn heap.

Trong trường hợp đầu tiên bạn đã tạo đủ đối tượng để chiếm hết bộ nhớ và bạn vẫn có tham chiếu đến chúng để bộ thu gom rác không thể xóa chúng.

Trong trường hợp thứ hai, phân mảnh heap, bạn đang cố gắng tạo một đối tượng lớn hơn phần tiếp giáp lớn nhất của bộ nhớ trong heap. Điều này hiếm hơn nhưng chắc chắn sẽ xảy ra trong một số trường hợp. Heap bình thường sẽ được nén trong khi chạy gc nhưng heap đối tượng lớn sẽ không.

Có một số tốt article trên MSDN về vùng đối tượng lớn.

Chỉnh sửa: Tôi nhớ một cách khác để thoát khỏi bộ nhớ. Bạn có thể thử và tạo một đối tượng có kích thước lớn hơn 2GB. Đó là kích thước đối tượng tối đa trong .NET ngay cả trên 64-bit.