GC nối tiếp

Bộ sưu tập rác cải thiện hiệu quả bộ nhớ trong Java bằng cách loại bỏ các đối tượng không được ước tính khỏi heap và nhường chỗ cho các đối tượng mới được tạo.

Máy ảo Java có tám loại bộ thu gom rác. Hãy xem xét từng người trong số họ một cách chi tiết.

GC nối tiếp là triển khai GC đơn giản nhất. Nó dành cho các ứng dụng nhỏ chạy trong môi trường đơn luồng. Tất cả các sự kiện thu gom rác được thực hiện tuần tự trên cùng một luồng. Việc nén được thực hiện sau mỗi lần thu gom rác.

GC nối tiếp

Việc chạy bộ sưu tập dẫn đến sự kiện "thế giới dừng", trong đó toàn bộ ứng dụng bị treo. Vì toàn bộ ứng dụng bị đóng băng trong quá trình thu gom rác, bạn không nên dùng đến điều này trong cuộc sống thực nếu bạn muốn giữ độ trễ càng thấp càng tốt.

Đối số JVM để sử dụng trình thu gom rác nối tiếp là -XX:+UseSerialGC .

GC song song

Bộ thu gom rác song song được thiết kế cho các ứng dụng có tập dữ liệu từ trung bình đến lớn chạy trên phần cứng đa luồng hoặc đa bộ xử lý. Đây là triển khai GC mặc định và còn được gọi là trình thu thập thông lượng.

Một số chủ đề được dành cho việc thu gom rác nhỏ trong thế hệ trẻ. Chủ đề duy nhất đang bận với bộ sưu tập rác chính trong thế hệ cũ.

GC song song

Chạy một GC song song cũng khiến thế giới “dừng lại” và ứng dụng bị treo. Hành vi này phù hợp hơn với môi trường đa luồng, nơi có nhiều tác vụ cần được hoàn thành và tạm dừng dài có thể chấp nhận được, chẳng hạn như khi chạy một công việc hàng loạt.

Đối số JVM để sử dụng trình thu gom rác song song là -XX:+UseParallelGC .

CMS tổng hợp

Còn được gọi là bộ chọn song song phần còn lại thấp .

Ở đây, đối với một bộ sưu tập rác nhỏ, một số luồng có liên quan, điều này xảy ra thông qua cùng một thuật toán như trong bộ sưu tập song song. Bộ sưu tập rác chính là đa luồng, giống như GC song song cũ, nhưng CMS chạy đồng thời với các quy trình ứng dụng để giảm thiểu sự kiện "thế giới dừng".

CMS tổng hợp

Do đó, trình thu thập CMS tiêu thụ nhiều CPU hơn các trình thu thập khác. Nếu bạn có khả năng phân bổ nhiều CPU hơn để cải thiện hiệu suất, thì một CMS sẽ thích hợp hơn một bộ thu song song đơn giản. CMS GC không nén.

Đối số JVM để sử dụng trình thu gom rác quét đánh dấu song song là -XX:+UseConcMarkSweepGC .

G1 (Rác đầu tiên) GC

G1GC được hình thành để thay thế cho CMS và được phát triển cho các ứng dụng đa luồng có đặc điểm là kích thước vùng lưu trữ lớn (lớn hơn 4 GB). Nó song song và cạnh tranh giống như một CMS, nhưng bên trong nó hoạt động rất khác so với các công cụ thu gom rác cũ.

Tuy G1 cũng vận hành theo thế hệ nhưng lại không có không gian riêng cho thế hệ trẻ và già. Thay vào đó, mỗi thế hệ là một tập hợp các vùng, cho phép linh hoạt trong việc thay đổi quy mô của thế hệ trẻ.

G1 chia heap thành một tập hợp các vùng có kích thước bằng nhau (tùy thuộc vào kích thước của heap) và quét chúng thành nhiều luồng. Khu vực trong quá trình thực hiện chương trình có thể liên tục trở thành cả già và trẻ.

Sau khi giai đoạn đánh dấu hoàn tất, G1 sẽ biết khu vực nào chứa nhiều rác nhất. Nếu người dùng quan tâm đến việc giảm thiểu thời gian tạm dừng, G1 chỉ có thể chọn một số khu vực. Nếu thời gian tạm dừng không quan trọng đối với người dùng hoặc nếu giới hạn thời gian tạm dừng được đặt ở mức cao, thì G1 sẽ đi qua nhiều khu vực hơn.

Vì G1 GC xác định các vùng có nhiều rác nhất và thực hiện thu gom rác trên các vùng đó trước, nên nó được gọi là "Rác đầu tiên".

Ngoài các khu vực Eden, Survivors và Old Memory, còn có hai loại khác trong G1GC.

  • Humongous (Huge) - dành cho các đối tượng có kích thước lớn (hơn 50% kích thước heap).
  • Có sẵn - Không gian chưa được sử dụng hoặc chưa được phân bổ.

Đối số JVM để sử dụng trình thu gom rác G1 là -XX:+UseG1GC .

Shenandoah (Shandara)

Shenandoah là một GC mới được phát hành như một phần của JDK 12. Ưu điểm chính của Shenandoah so với G1 là hầu hết chu trình thu gom rác được thực hiện đồng thời với các luồng ứng dụng. G1 chỉ có thể sơ tán các khu vực đống khi ứng dụng bị treo, trong khi Shenandoah di chuyển các đối tượng cùng lúc với ứng dụng.

Shenandoah có thể thu gọn các đối tượng trực tiếp, dọn rác và giải phóng RAM gần như ngay khi tìm thấy bộ nhớ trống. Vì tất cả điều này xảy ra cùng một lúc mà không làm ứng dụng bị treo nên Shenandoah sử dụng nhiều CPU hơn.

Đối số JVM cho trình thu gom rác Shenandoah: -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC .

ZGC

ZGC là một GC khác được phát hành như một phần của JDK 11 và được cải tiến trong JDK 12.

Nó được thiết kế cho các ứng dụng yêu cầu tốc độ và độ trễ thấp (thời gian tạm dừng dưới 10 ms) và/hoặc sử dụng một đống rất lớn (vài terabyte).

Mục tiêu chính của ZGC là độ trễ thấp, khả năng mở rộng và dễ sử dụng. Để làm điều này, nó cho phép ứng dụng Java tiếp tục chạy mặc dù thực tế là các hoạt động thu gom rác đang diễn ra. Theo mặc định, ZGC giải phóng bộ nhớ không sử dụng và trả lại cho hệ điều hành.

Do đó, ZGC mang lại một cải tiến đáng kể so với các GC truyền thống khác bằng cách cung cấp thời gian chết cực thấp (thường trong vòng 2 mili giây).

Mục tiêu chính của ZGC 

Đối số JVM để sử dụng trình thu gom rác ZGC là -XX:+UnlockExperimentalVMOptions -XX:+UseZGC .