2015-07-23 14 views
6

Tôi đã lược tả việc sử dụng bộ nhớ của một ứng dụng Windows Forms trong dotmemory và tôi nhận thấy rằng đối với ứng dụng của tôi có 0-4 đống tất cả các kích thước khác nhau cũng như khối đối tượng lớn.Các heap khác nhau trong .net là gì?

Tôi chỉ băn khoăn liệu có ai có giải thích tốt về những gì mỗi heap dành cho và những gì thường được lưu trữ trong mỗi heap?

+0

Điều này có thể liên quan đến cách bộ thu gom rác C# hoạt động. Tôi nghĩ rằng đó là một GC thế hệ, phân tách dữ liệu dựa trên cách nó được sử dụng gần đây. – ryanyuyu

+2

Có 3 đống + đống đối tượng lớn. Tất cả các đối tượng được phân bổ trong heap 0. Nếu chúng tồn tại trong một bộ sưu tập rác, chúng sẽ được tăng lên 1, sau đó đến heap 2, và sau đó vẫn ở đó cho đến khi được thu thập. Heap đối tượng lớn (LOH) là cho các đối tượng có kích thước từ 85000 byte trở lên (không phải trong tổng số, liên tục, giống như mảng). Nơi bạn có đống thứ năm từ tôi không biết. –

+0

Có thể quan tâm: http: // stackoverflow.com/questions/11189932/stack-and-heap-phân bổ –

Trả lời

7

Bạn có các đống khác nhau vì cách trình thu gom rác C# hoạt động. Nó sử dụng một GC thế hệ, phân tách dữ liệu dựa trên cách nó được sử dụng gần đây. Việc sử dụng các vùng heap khác nhau cho phép bộ thu gom rác dọn dẹp bộ nhớ hiệu quả hơn.

Theo MSDN:

Heap được tổ chức thành hệ để nó có thể xử lý các đối tượng tồn tại lâu dài và ngắn ngủi. Thu gom rác chủ yếu xảy ra với việc cải tạo các đối tượng sống ngắn thường chỉ chiếm một phần nhỏ của đống.

  • Thế hệ 0. Đây là thế hệ trẻ nhất và có các đối tượng sống ngắn. Một ví dụ về một đối tượng sống ngắn là một biến tạm thời. Thu gom rác xảy ra thường xuyên nhất trong thế hệ này. Các đối tượng mới được phân bổ tạo thành một thế hệ các đối tượng mới và tạo ra hoàn toàn 0 bộ sưu tập, trừ khi chúng là các đối tượng lớn, trong trường hợp chúng đi trên đống đối tượng lớn trong bộ sưu tập thế hệ 2. Hầu hết các đối tượng được khai hoang để thu gom rác thải trong thế hệ 0 và không tồn tại trong thế hệ tiếp theo.
  • Thế hệ 1. Thế hệ này chứa các đối tượng tồn tại trong thời gian ngắn và đóng vai trò như bộ đệm giữa các đối tượng sống ngắn và các đối tượng tồn tại lâu dài.
  • Thế hệ 2. Thế hệ này chứa các đối tượng tồn tại lâu dài. Một ví dụ về một đối tượng tồn tại lâu dài là một đối tượng trong ứng dụng máy chủ có chứa dữ liệu tĩnh tồn tại trong suốt thời gian của quá trình.

Đối tượng không được khai hoang trong một thu gom rác thải được gọi là những người sống sót, và được thăng cấp lên thế hệ tiếp theo.

Dữ liệu quan trọng nhanh chóng được đưa vào ổ ghi của bộ thu gom rác (thế hệ cao hơn) và được chọn để xóa ít thường xuyên hơn. Điều này làm giảm lượng thời gian lãng phí bộ nhớ kiểm tra mà thực sự cần phải tồn tại, cho phép bạn thấy hiệu suất đạt được từ một bộ thu rác hiệu quả.

+0

Điều này không giải thích lý do tại sao có thể có những đống khác nhau, nơi mỗi heaps có thế hệ. –

0

Khi nói đến các đối tượng được quản lý, có ba Vùng đối tượng nhỏ (SOH) và một đối tượng lớn (LOH).

Large Object Heap (LOH)

Đối tượng có dung lượng lớn hơn 85KB sẽ Loh ngay lập tức. Có một số rủi ro nếu bạn có quá nhiều vật thể lớn. Đó là một cuộc thảo luận khác nhau, để biết thêm chi tiết có một cái nhìn tại The Dangers of the Large Object Heap

nhỏ Object Heap (SOH): Gen0, Gen1, Gen2

thu rác sử dụng một thuật toán thông minh để thực hiện collecton rác chỉ khi nó là cần thiết. Quy trình thu gom rác đầy đủ là một hoạt động tốn kém không nên xảy ra quá thường xuyên. Vì vậy, nó đã phá vỡ SOH của nó thành ba phần và như bạn đã nhận thấy mỗi Gen có một số lượng quy định của bộ nhớ.

Mỗi đối tượng nhỏ (< 85KB) ban đầu sẽ chuyển thành Gen0. Khi Gen0 đầy, thu gom rác chỉ thực hiện cho Gen0. Nó kiểm tra tất cả các cá thể trong Gen0 và xóa/giải phóng bộ nhớ được sử dụng bởi bất kỳ đối tượng không cần thiết nào (không được tham chiếu, ngoài các đối tượng được sắp xếp hoặc sắp xếp). Và sau đó nó sao chép tất cả các yêu cầu (trong sử dụng) trường hợp để Gen1.

Trên quá trình được thực sự xảy ra ngay cả khi bạn thực hiện dưới đây: (không nhất thiết phải gọi bằng tay)

// Perform a collection of generation 0 only. 
GC.Collect(0); 

Bằng cách này, nhà sưu tập rác xóa bộ nhớ được cấp phát cho các trường hợp sống ngắn đầu tiên (dây đó là bất biến, các biến trong phương thức hoặc phạm vi nhỏ hơn).

Khi GC tiếp tục thực hiện thao tác này ở một giai đoạn, Gen1 tràn. Sau đó, nó hoạt động tương tự với Gen1. Nó xóa tất cả bộ nhớ không cần thiết trong Gen1 và sao chép tất cả các bộ nhớ cần thiết vào Gen2.

Trên quá trình là xảy ra khi bạn thực hiện dưới đây bằng tay (không nhất thiết phải gọi bằng tay)

// Perform a collection of all generations up to and including 1. 
GC.Collect(1); 

Khi GC là giữ thực hiện thao tác này tại một sân khấu nếu Gen2 tràn nó cố gắng để làm sạch Gen2.

quá trình Trên đây là xảy ra ngay cả khi bạn thực hiện dưới đây bằng tay (không nhất thiết phải làm bằng tay)

// Perform a collection of all generations up to and including 2. 
GC.Collect(2); 

Nếu dung lượng bộ nhớ cần được sao chép từ Gen1 để Gen2 lớn hơn dung lượng bộ nhớ có sẵn trong Gen2, GC ném ra khỏi ngoại lệ bộ nhớ.

9

Các câu trả lời khác dường như thiếu thực tế rằng có sự khác biệt giữa heapsthế hệ. Tôi không thấy lý do tại sao một profiler thương mại sẽ nhầm lẫn giữa hai khái niệm, vì vậy tôi mạnh mẽ nghi ngờ nó heaps và không phải thế hệ sau khi tất cả.

Khi GC CLR đang sử dụng server flavor, nó tạo ra một vùng riêng biệt cho mỗi bộ xử lý logic trong mặt nạ ái lực của quy trình. Lý do cho sự cố này chủ yếu là để cải thiện khả năng mở rộng phân bổ và để thực hiện trong GC song song. Đây là những vùng bộ nhớ riêng biệt, nhưng tất nhiên bạn có thể có các tham chiếu đối tượng giữa các heap và có thể coi chúng là một đống logic duy nhất. Vì vậy, giả sử rằng bạn có bốn bộ vi xử lý hợp lý (ví dụ: một CPU i5 với HyperThreading được kích hoạt), bạn sẽ có bốn đống dưới máy chủ GC.

Heap đối tượng lớn có tên đáng tiếc, khó hiểu. Nó không phải là một đống trong ý nghĩa tương tự như heaps cho mỗi bộ vi xử lý. Đó là một sự trừu tượng hợp lý ở trên cùng của nhiều vùng bộ nhớ chứa các đối tượng lớn.

+1

Đây phải là câu trả lời được chấp nhận –

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