Series Mục lục và Giới thiệu về tôi.
1. Tổng quan
Hình trên cho thấy trình thu gom rác cổ điển, trong đó Serial, ParNew và Parallel Scavenge (Song song trong hình) được sử dụng ở thế hệ mới, Serial Old CMS và Parallel Old được sử dụng ở thế hệ cũ. người thu gom rác chỉ ra rằng chúng thường được sử dụng cùng nhau. Trình thu gom rác G1, ZGC và Shenandoah từ bỏ lý thuyết thu thập thế hệ và hành động trên toàn bộ đống. Những người thu gom rác này được giới thiệu dưới đây.
2. Serial và Serial cũ
Serial là trình thu gom rác hoạt động trên thế hệ mới và sử dụng thuật toán sao chép được đánh dấu và một luồng duy nhất để thu gom rác (luồng đơn có nghĩa là: một luồng được sử dụng khi thu gom rác và luồng làm việc cũng dừng khi thu gom rác). Nó là trình thu thập rác mặc định ở chế độ máy khách. Ưu điểm của nó là đơn giản và hiệu quả. Đối với các môi trường có tài nguyên bộ nhớ hạn chế, nó tiêu tốn ít bộ nhớ bổ sung nhất trong số tất cả các trình thu thập và không có chi phí chuyển đổi luồng. một lõi đơn. Hiệu suất nối tiếp trong CPU thậm chí còn tốt hơn CPU đa lõi.
Serial Old là phiên bản cũ của Serial. Nó sử dụng thuật toán sắp xếp dấu. Ngoài việc được sử dụng với Serial, nó còn là phương án dự phòng khi việc thu gom rác thế hệ cũ của CMS không thành công.
- -XX:+UseSerialGC: Cho máy ảo sử dụng
Serial+Serial Cũ
Thực hiện việc thu gom rác
- -XX:SurvivorRatio: Kiểm soát tỷ lệ của Survivor và Eden, chẳng hạn như -XX:SurvivorRatio=8 có nghĩa là Eden:Survivor=8:1
3. ParNew
ParNew có thể được coi là phiên bản song song của Serial. Nó hoạt động trên thế hệ mới và sử dụng thuật toán sao chép được đánh dấu. Đây là trình thu gom rác thế hệ mới mặc định sau khi kích hoạt trình thu gom rác CMS.
ParNew sẽ không hiệu quả hơn Serial trong môi trường bộ xử lý CPU lõi đơn vì nó có chi phí tương tác luồng. Sử dụng -XX:ParallelGCThreads=n để giới hạn số lượng luồng thu gom rác.
Sử dụng -XX:+UseParNewGC để chỉ định sự kết hợp của ParNew + Serial Old. Cả hai hoạt động cùng nhau như hiển thị bên dưới.
4. Quét song song
Parallel Scavenge tương tự như ParNew, hoạt động trên thế hệ mới và sử dụng thuật toán sao chép được đánh dấu. Nhưng nó là một công cụ thu gom rác tập trung vào thông lượng. (Thông lượng = thời gian chạy mã người dùng / tổng thời gian tiêu thụ bộ xử lý (thời gian mã người dùng + thời gian GC)).
-
-XX:+UseParallelGC là giá trị mặc định của máy ảo ở chế độ Server. Sau khi bật lên, nó sử dụng kết hợp Parallel Scavenge + Serial Old.
-
-XX:MaxGCPauseMillis =n Bộ sưu tập cố gắng hết sức để đảm bảo rằng thời gian tạm dừng của một lần tái chế bộ nhớ không vượt quá giá trị này, nhưng không đảm bảo rằng nó sẽ không vượt quá giá trị này. (Nếu cài đặt quá nhỏ sẽ gây ra Minor GC thường xuyên).
-
-XX:GCTimeRatio=n đặt kích thước thông lượng, nằm trong khoảng từ 0 đến 100. Giả sử rằng giá trị của GCTimeRatio là n, hệ thống sẽ dành không quá 1/(1+n) thời gian cho việc thu gom rác.
-
Sau khi bật -XX:+UseAdaptiveSizePolicy, không cần chỉ định thủ công các tham số như kích thước của thế hệ mới (-Xmn), tỷ lệ Eden so với Survivor (-XX:SurvivorRatio) và tuổi của thế hệ cũ được thăng cấp các đối tượng tạo (-XX:PretenureSizeThreshold). Bộ thu thập sẽ Tự động điều chỉnh dựa trên các điều kiện vận hành hệ thống hiện tại.
5. Song Song Cũ
Parallel Old là phiên bản cũ của Parallel Scavenge. Nó đa luồng và sử dụng thuật toán sắp xếp dấu -XX:+UseParallelGC sử dụng kết hợp Parallel Scavenge + Serial Old và không thể sử dụng lại khả năng xử lý song song đa bộ xử lý của máy chủ. Sau khi Parallel Old xuất hiện, các kịch bản tập trung vào thông lượng có thể sử dụng -XX:+UseParallelOldGC để chọn Parallel Scavenge + Parallel Old để sử dụng cùng nhau.
6. CMS
CMS là một công cụ thu thập nhằm mục đích đạt được thời gian tạm dừng khôi phục ngắn nhất và sử dụng thuật toán đánh dấu và quét để tái chế thế hệ cũ. Thích hợp để sử dụng trong các tình huống cần quan tâm đến tốc độ phản hồi dịch vụ và thời gian tạm dừng hệ thống, chẳng hạn như hệ thống B/S. Ưu điểm của CMS là nó sử dụng thuật toán đánh dấu ba màu để triển khai thu thập rác và thực thi song song các luồng của người dùng (đánh dấu ban đầu và đánh dấu lại đồng thời vẫn yêu cầu Stop The World).
Quy trình tái chế 1.CMS
-
Dấu ấn ban đầu.
Nó đề cập đến việc tìm kiếm tất cả các đối tượng được tham chiếu bởi GCRoots. Giai đoạn này yêu cầu Stop the World. Bước này chỉ đánh dấu các đối tượng mà GC Roots có thể liên kết trực tiếp. Không cần quét toàn bộ tham chiếu nên rất nhanh.
-
Đánh dấu đồng thời
Nó đề cập đến việc quét toàn bộ chuỗi tham chiếu của các đối tượng được đánh dấu trong "giai đoạn đánh dấu ban đầu" là không bắt buộc trong giai đoạn này. Việc quét toàn bộ chuỗi tham chiếu mất rất nhiều thời gian, do đó có thể giảm thời gian thu gom rác bằng cách thực thi luồng thu gom rác đồng thời với luồng của người dùng. Đây cũng là lý do cốt lõi tại sao trình thu gom rác CMS có thể giảm đáng kể thời gian tạm dừng GC, nhưng nó cũng gây ra một số vấn đề, đó là: khi đánh dấu đồng thời, tham chiếu có thể thay đổi, do đó có thể xảy ra việc hủy sai (đối tượng rác là vô dụng). được đánh dấu là rác, tạo ra rác nổi) và dán nhãn sai (các đối tượng không phải là rác sẽ bị đánh dấu là rác).
-
Dán nhãn lại.
Nó đề cập đến việc khắc phục các sự cố xảy ra trong giai đoạn đánh dấu đồng thời, yêu cầu Stop the World. Giai đoạn này giải quyết vấn đề dán nhãn sai trong giai đoạn ghi nhãn đồng thời.
-
Dọn dẹp đồng thời
Nó đề cập đến việc dọn dẹp các đối tượng được đánh dấu là rác là không cần thiết ở giai đoạn này. Luồng thu gom rác và luồng người dùng tiến hành đồng thời. (Bước này sử dụng thuật toán mark and clear nên có thể thực hiện song song với user thread, tuy nhiên mark and clear sẽ tạo ra nhiều đoạn bộ nhớ hơn).
Ưu điểm 2.CMS
Thu thập đồng thời, tạm dừng thấp.
Thông tin đánh dấu ban đầu được chia thành đánh dấu ban đầu, đánh dấu đồng thời và đánh dấu lại. Việc đánh dấu đồng thời tốn nhiều thời gian nhất có thể được chạy song song với luồng của người dùng, từ đó nâng cao hiệu quả thu gom rác. Giai đoạn thu gom rác (xóa rác đồng thời) cũng có thể được thực hiện song song với các luồng của người dùng, đạt được mức độ tạm dừng thấp trong quá trình thu gom rác.
3. Nhược điểm của CMS
-
Nó tiêu tốn rất nhiều tài nguyên CPU.
Mặc dù việc sử dụng đa luồng để thu gom rác giúp cải thiện hiệu quả nhưng cũng đúng là quy trình thu gom rác đa luồng sẽ chiếm một phần sức mạnh tính toán của bộ xử lý, khiến ứng dụng bị chậm và giảm thông lượng.
Theo mặc định, số lượng luồng thu gom rác được CMS kích hoạt là (số lượng CPU + 3)/4. Khi số lượng CPU lớn hơn, tỷ lệ các luồng thu gom rác được kích hoạt sẽ nhỏ hơn.
Nhưng nếu số lượng CPU ít hơn bốn, thì việc chiếm dụng luồng thu gom rác đạt 50%, điều đó có nghĩa là cần 50% thời gian của CPU để thu gom rác. Điều này sẽ làm giảm đáng kể thông lượng của hệ thống, điều này là không thể chấp nhận được.
-
Không thể xử lý rác trôi nổi. Do việc dán nhãn sai xảy ra trong giai đoạn đánh dấu đồng thời CMS nên một số đồ vật rác đáng lẽ phải được tái chế lại không thể tái chế được. Ngoài ra, khi CMS thực hiện dọn dẹp đồng thời, các luồng của người dùng đang chạy cùng lúc, điều này cũng sẽ tạo ra một số rác nổi. Vì vậy, đối với CMS thu gom, nó cần chừa một khoảng trống cho các kho chứa rác nổi này và không thể dọn sạch cho đến lần thu gom rác tiếp theo.
Bạn có thể sử dụng tham số -XX:CMSInitiatingOccupancyFraction để điều chỉnh lượng dung lượng thế hệ cũ được sử dụng, sau đó kích hoạt CMS để tái chế thế hệ cũ.
Nếu phát hiện thấy bộ nhớ dự trữ không thể đáp ứng nhu cầu của chương trình trong quá trình vận hành CMS, lỗi Chế độ đồng thời sẽ xuất hiện. Tại thời điểm này, máy ảo áp dụng phương án dự phòng: tạm thời cho phép Serial Old Collector thực hiện lại việc thu gom rác ở thế hệ cũ. Tại thời điểm này, thời gian Stop the World có thể sẽ rất dài.
-
Tạo ra các mảnh vụn không gian. Vì CMS là một trình tái chế được triển khai dựa trên thuật toán đánh dấu và quét nên nó sẽ tạo ra rất nhiều mảnh không gian, điều này sẽ gây rắc rối khi phân bổ các đối tượng lớn và kích hoạt Full GC trước. Bạn có thể sử dụng tham số -XX:+UseCMSCompactAtFullCollection (bật theo mặc định) để ngăn bộ nhớ liền kề được phân bổ cho các đối tượng lớn, để thế hệ cũ có thể được sắp xếp khi FullGC được kích hoạt.
Tham số này thường được sử dụng cùng với -XX:CMSFullGCsBeforeCompaction -XX:CMSFullGCsBeforeCompaction có thể kiểm soát số lần CMS không dọn dẹp Full GC trước khi Full GC tiếp theo dọn sạch thế hệ cũ.
Bảy, G1
Garbage First, được gọi là G, đi tiên phong trong bộ sưu tập cục bộ hướng đến người thu thập và bố cục bộ nhớ dựa trên Vùng.
1. Tạm dừng mô hình
Mô hình tạm dừng: hỗ trợ mục tiêu dành không quá N mili giây cho việc thu gom rác trong khoảng thời gian M mili giây.
Làm thế nào G1 đạt được mục tiêu này:
Lồng thu gom rác cho toàn bộ khu vực (toàn bộ thế hệ mới, thế hệ cũ và đống) bị bỏ hoang. Thay vào đó, Bộ sưu tập (CSet) được hình thành cho bất kỳ phần nào của heap để tái chế, không dựa trên thế hệ mà nó thuộc về mà dựa trên bộ nhớ nào chứa nhiều rác nhất và có lợi ích tái chế lớn nhất. Đây là GC hỗn hợp của G1. . Điều hỗ trợ toàn bộ mục tiêu là bố cục bộ nhớ heap dựa trên Rigion của G1.
2. Bố cục bộ nhớ heap theo vùng
Có thể thấy, G1 cũng đi theo lý thuyết tập hợp thế hệ, nhưng bố cục bộ nhớ heap không còn tuân theo một kích thước cố định và số lượng phân chia khu vực thế hệ cố định mà chia heap thành nhiều Vùng. Mỗi Vùng có thể là Eden, Survivor, hoặc Cũ. Ngoài ra còn có Humongous được sử dụng để lưu trữ các đối tượng lớn. Nếu một đối tượng vượt quá một nửa kích thước Vùng, nó được coi là một đối tượng lớn và G1 coi phần này của khu vực là thế hệ cũ.
Kích thước của Vùng có thể được đặt thông qua -XX:G1HeapRegionSize, phải có lũy thừa bằng 2 và nằm trong khoảng từ 1MB đến 32MB. Các đối tượng lớn hơn một Vùng được phân bổ theo N Humongous liên tiếp.
Mỗi lần G1 tái chế, nó sẽ tái chế một số không gian có kích thước Vùng. Điều này cũng có thể tránh việc thu thập toàn bộ vùng nhớ heap và sử dụng danh sách ưu tiên để ghi lại và theo dõi giá trị tích lũy rác trong mỗi Vùng. và giá trị kinh nghiệm của thời gian cần thiết để phục hồi. Mỗi bộ sưu tập rác sẽ chọn Khu vực có giá trị tái chế lớn nhất dựa trên thời gian tạm dừng được chỉ định bởi -XX:MaxGCPauseMillis (mặc định 200 mili giây).
3. G1 giải quyết vấn đề thu gom rác tham chiếu đa thế hệ như thế nào?
Vấn đề tham chiếu giữa các Vùng trong Vùng được giải quyết bằng cách sử dụng ý tưởng về bộ nhớ. Nhưng bộ nhớ của G1 phức tạp hơn. Mỗi Vùng có một bộ nhớ. Các bộ nhớ này ghi lại các con trỏ được trỏ đến bởi các Vùng khác và đánh dấu các trang thẻ chứa các con trỏ này.
Cấu trúc này chiếm nhiều bộ nhớ hơn vì nó không phù hợp để sử dụng G1 Garbage Collector nếu bộ nhớ heap quá nhỏ.
4. G1 giải quyết vấn đề như thế nào do các luồng người dùng thay đổi mối quan hệ tham chiếu trong giai đoạn đánh dấu đồng thời?
G1 sử dụng ảnh chụp nhanh gốc để giải quyết vấn đề này.
Khi đối tượng màu xám muốn xóa mối quan hệ tham chiếu trỏ đến đối tượng màu trắng, các tham chiếu đã xóa sẽ được ghi lại. Sau khi quá trình quét đồng thời hoàn tất, các đối tượng màu xám có mối quan hệ tham chiếu đã ghi này sẽ được sử dụng làm gốc và được quét lại.
Ngoài ra, G1 còn thiết kế hai con trỏ có tên TAMS (Top at mark start) để cho phép các luồng của người dùng phân bổ bộ nhớ cho các đối tượng mới trong khu vực này trong giai đoạn tái chế đồng thời. Theo mặc định, G1 coi các đối tượng trong khu vực này là còn sống.
5. Quy trình thu gom rác G1
-
Dấu ấn ban đầu.
Các đối tượng được đánh dấu có thể được liên kết trực tiếp và có thể truy cập được từ GC Roots. Cần phải ngăn chặn thế giới.
-
Đánh dấu đồng thời
Thực thi đồng thời với luồng người dùng, thực hiện phân tích khả năng tiếp cận trên các đối tượng trong vùng heap bắt đầu từ GC Roots, quét đệ quy biểu đồ đối tượng trong toàn bộ vùng heap và tìm các đối tượng cần được tái chế.
-
Dấu cuối cùng.
Bắt buộc phải dừng thế giới, xử lý giai đoạn đánh dấu đồng thời và sử dụng ảnh chụp nhanh ban đầu của các đối tượng được ghi SATB.
-
Sàng lọc và tái chế.
Cập nhật số liệu thống kê Khu vực, sắp xếp giá trị và chi phí tái chế đối tượng của từng Khu vực, sau đó chỉ định kế hoạch tái chế theo thời gian dừng dự kiến của người dùng, sau đó chọn nhiều Khu vực để tạo Bộ sưu tập (CSet) để tái chế và phần này của Khu vực sẽ được tái chế Sao chép các đối tượng còn sót lại vào Khu vực trống, sau đó dọn sạch toàn bộ không gian của toàn bộ Khu vực cũ. Phần này yêu cầu di chuyển các đối tượng và vẫn yêu cầu Dừng thế giới, được hoàn thành bởi nhiều luồng song song.
6. So sánh G1 và CMS
6.1 Ưu điểm của G1 so với CMS là gì?
- Thời gian tạm dừng tối đa có thể được chỉ định
- Việc thu gom tái chế có thể được xác định dựa trên động lực doanh thu
- Lọc và tái chế sử dụng thuật toán sao chép đánh dấu, thuật toán này không tạo ra sự phân mảnh bộ nhớ và có thể tránh được tình trạng không thể phân bổ bộ nhớ liên tục cho bộ sưu tập tiếp theo.
6.2 CMS do điểm G1
-
CMS chỉ có một bộ nhớ, chiếm một lượng bộ nhớ nhỏ, nhưng mỗi Vùng của G1 có một bộ nhớ và tất cả các G1 đều chiếm nhiều bộ nhớ hơn.
Vì vậy, CMS phù hợp hơn với các máy có bộ nhớ nhỏ. G1 cũng là một lựa chọn tốt nếu bộ nhớ heap đủ lớn.
-
CMS sử dụng các rào cản sau ghi để duy trì bộ nhớ và là hoạt động đồng bộ trực tiếp (thay đổi tham chiếu và cập nhật bảng thẻ cùng một lúc).
Để đạt được ảnh chụp nhanh ban đầu, G1 cũng cần sử dụng rào cản ghi trước, do đó G1 sử dụng hàng đợi tin nhắn để xử lý không đồng bộ việc cập nhật bộ nhớ.
Cuối cùng, bài viết về Chương 3 của "Hiểu biết chuyên sâu về Máy ảo Java" (3) - Classic Garbage Collector kết thúc tại đây nếu bạn muốn biết thêm về Chương 3 của "Hiểu biết chuyên sâu về Máy ảo Java" Ghi chú đọc (3) - Về nội dung của trình thu gom rác cổ điển, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!