Tài liệu và thu thập rác Java 7 (JDK 7) trên G1


81

Java 7 đã ra mắt được một thời gian, nhưng tôi không thể tìm thấy bất kỳ tài nguyên nào tốt về cấu hình của trình thu gom rác , cụ thể là trình thu gom G1 mới .

Những câu hỏi của tôi:

  1. G1 có phải là bộ thu thập mặc định trong Java 7 không và nếu không, làm cách nào để kích hoạt G1?
  2. G1 có cài đặt tùy chọn nào trong Java7?
  3. Có bất kỳ thay đổi nào được thực hiện đối với các trình thu thập khác như cms hoặc trình thu thập song song trong Java 7 không?
  4. Tôi có thể tìm tài liệu hay về thu gom rác trong Java 7 ở đâu?

6
Bắt đầu với Trình thu gom rác G1 cũng cung cấp một cái nhìn tổng quan tốt về các phương pháp hay nhất.
John McCarthy

Câu trả lời:


47

Trình thu gom rác G1 không phải là mặc định trong cài đặt Java của tôi, phiên bản 1.7.0_01. Bạn có thể tự xem bằng cách sử dụng với một số tùy chọn dòng lệnh bổ sung:

> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:ParallelGCThreads=4 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
 PSYoungGen      total 37696K, used 1293K [0x00000007d5eb0000, 0x00000007d88c0000, 0x0000000800000000)
  eden space 32320K, 4% used [0x00000007d5eb0000,0x00000007d5ff3408,0x00000007d7e40000)
  from space 5376K, 0% used [0x00000007d8380000,0x00000007d8380000,0x00000007d88c0000)
  to   space 5376K, 0% used [0x00000007d7e40000,0x00000007d7e40000,0x00000007d8380000)
 PSOldGen        total 86144K, used 0K [0x0000000781c00000, 0x0000000787020000, 0x00000007d5eb0000)
  object space 86144K, 0% used [0x0000000781c00000,0x0000000781c00000,0x0000000787020000)
 PSPermGen       total 21248K, used 2032K [0x000000077ca00000, 0x000000077dec0000, 0x0000000781c00000)
  object space 21248K, 9% used [0x000000077ca00000,0x000000077cbfc288,0x000000077dec0000)

Tuy nhiên, bạn không cần phải bật các tùy chọn thử nghiệm để bật bộ thu G1 nữa:

> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseG1GC -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
 garbage-first heap   total 130048K, used 0K [0x000000077ca00000, 0x0000000784900000, 0x00000007fae00000)
  region size 1024K, 1 young (1024K), 0 survivors (0K)
 compacting perm gen  total 20480K, used 2032K [0x00000007fae00000, 0x00000007fc200000, 0x0000000800000000)
   the space 20480K,   9% used [0x00000007fae00000, 0x00000007faffc288, 0x00000007faffc400, 0x00000007fc200000)
No shared spaces configured.

Tôi không biết bạn có thể tìm thấy tài liệu hay ở đâu.


2
Đây là vẫn còn hiệu lực cho 1.7.0_09 trên OSX
Tuổi Mooij

1
Tương tự vào ngày 1.7.0_10 trên Linux
Marc Polizzi

Không đúng với Oracle JDK 7u17 trên linux / amd64 được tải trực tiếp từ trang web Oracle. Nó nói -XX:+UseParallelGC.
user1050755

31

Oracle cuối cùng đã chính thức đưa G1 vào Java 7 U4: http://www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html

Mô tả: http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html

Tùy chọn dòng lệnh: http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options

Tuy nhiên, tôi không nghĩ nó là bộ thu thập mặc định trong Java 7. Đối với các máy chủ, mặc định là Bộ thu thập song song như trong Java 6.


1
và máy chủ được xác định bởi 2 lõi và ram 2 GB trở lên. Thông tin chi tiết có thể được tìm thấy qua hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/0d82bf449a61/src - xem các tệp ./share/tools/launcher/java.c và ./share/vm/runtime/ os.cpp
user1050755

22

Có, G1 là trình thu gom rác tiêu chuẩn mới trong Java 1.7 JVM.

Tại đây, bạn có thể tìm thấy nhiều thông tin về cách sử dụng và cấu hình trình thu gom rác mới:

Sử dụng G1 G1 vẫn được coi là thử nghiệm và có thể được bật với hai thông số sau:

-XX: + UnlockExperimentalVMOptions -XX: + UseG1GC

Để đặt mục tiêu thời gian tạm dừng GC, hãy sử dụng thông số sau:

-XX: MaxGCPauseMillis = 50 (cho mục tiêu thời gian tạm dừng là 50 mili giây)

Với G1, một khoảng thời gian có thể được chỉ định trong đó thời gian tạm dừng GC sẽ kéo dài không lâu hơn thời gian đã cho ở trên:

-XX: GCPauseIntervalMillis = 200 (cho mục tiêu khoảng thời gian tạm dừng 200ms)

Lưu ý rằng hai tùy chọn trên đại diện cho mục tiêu, không phải là lời hứa hoặc đảm bảo. Chúng có thể hoạt động tốt trong một số tình huống nhưng không hoạt động tốt trong một số tình huống khác và không phải lúc nào GC cũng có thể tuân theo chúng.

Ngoài ra, quy mô của thế hệ trẻ có thể được chỉ định rõ ràng để ảnh hưởng đến thời gian tạm dừng sơ tán:

-XX: + G1YoungGenSize = 512m (dành cho thế hệ trẻ 512 megabyte)

G1 cũng sử dụng các không gian tương đương với người sống sót, về mặt tự nhiên, là một tập hợp các vùng (có khả năng không liền kề). Kích thước của chúng có thể được chỉ định bằng các tham số thông thường (ví dụ, -XX: SurvivorRatio = 6).

Cuối cùng, để G1 chạy hết khả năng của nó, hãy thử đặt hai thông số này hiện bị tắt theo mặc định vì chúng có thể phát hiện ra một điều kiện đua hiếm:

-XX: + G1ParallelRSetUpdatingEnabled -XX: + G1ParallelRSetScanningEnabled

Một điều cần lưu ý nữa là G1 rất dài dòng so với các GC HotSpot khác khi -XX: + PrintGCDetails được thiết lập. Điều này là do nó in thời gian trên mỗi luồng GC và các thông tin khác rất hữu ích trong việc lập hồ sơ và xử lý sự cố. Nếu bạn muốn một nhật ký GC ngắn gọn hơn, hãy chuyển sang sử dụng -verbosegc (mặc dù chúng tôi khuyên bạn nên lấy nhật ký GC chi tiết hơn).

Tôi cũng đã tìm thấy này bài viết rất hữu ích trong việc tìm hiểu inners của G1.

Thông tin thêm ở đây .


6
Tôi đã thấy những tài nguyên này. Nhưng bài báo đầu tiên là về G1 trong JDK 6 khi nó vẫn còn là một lựa chọn thử nghiệm. Các bài viết khác nói về các bản phát hành beta của JDK 7 và ít nhất 1 năm tuổi. Tôi đang tìm kiếm thêm thông tin cập nhật hoặc tài liệu chính thức từ Oracle hoặc nhóm JDK.
Florakel 13/11/11

13

1. G1 có phải là bộ sưu tập mặc định trong Java 7 (...)

Quy tắc trên trang Java 5 này vẫn có thể áp dụng trong Java 7 (và AFAIK, Java 8):

Trên các máy cấp máy chủ chạy VM máy chủ, bộ thu gom rác (GC) đã thay đổi từ bộ thu thập nối tiếp trước đó (-XX: + UseSerialGC) thành bộ thu thập song song (-XX: + UseParallelGC).

Nhưng cũng nên xem xét:

  • Các JVM 64-bit không đi kèm với -clientmáy ảo, vì vậy luôn là "lớp máy chủ"
  • Kể từ Java 7, việc sử dụng -XX: + UseParallelGC (dù được đặt hay được ngụ ý) cũng ngụ ý -XX: + UseParallelOldGC (tức là trừ khi bị vô hiệu hóa rõ ràng)

Ví dụ: nếu trên Windows x64 bạn chạy ...

  • Java 7 64-bit, bạn nhận được Parallel GC (cho cả thế hệ trẻ và già) theo mặc định.
  • Java 8 32-bit, bạn nhận được Serial GC (cho cả hai thế hệ) theo mặc định

1. (...) Làm cách nào để kích hoạt G1?

Đối với Java 7, đơn giản -XX:+UseG1GC. Có lẽ điều quan tâm cũng là khi bạn muốn:

Các ứng dụng đang chạy ngày nay với CMS hoặc trình thu gom rác ParallelOld sẽ có lợi khi chuyển sang G1 nếu ứng dụng có một hoặc nhiều đặc điểm sau.

  • Hơn 50% đống Java chứa dữ liệu trực tiếp.
  • Tỷ lệ phân bổ đối tượng hoặc tỷ lệ thăng chức thay đổi đáng kể.
  • Thời gian tạm dừng thu gom hoặc nén rác lâu không mong muốn (lâu hơn 0,5 đến 1 giây)

2. G1 có những cài đặt tùy chọn nào trong Java7?

Bản thân tôi chưa sử dụng G1, nhưng tôi nhận thấy rằng nó tuân theo cùng các cờ "thông lượng / công thái học" cơ bản được sử dụng để điều chỉnh các bộ thu song song khác. Theo kinh nghiệm của tôi với Parallel GC, -XX:GCTimeRatiođây là thiết bị quan trọng trong việc cung cấp sự cân bằng tốc độ bộ nhớ mong đợi. YMMV.

Các tùy chọn cụ thể cho G1 được liệt kê ở đây

3. Có thay đổi đối với (...) cms hoặc bộ thu song song trong Java 7 không?

Không biết, nhưng ...

G1 được lên kế hoạch thay thế lâu dài cho Máy thu quét dấu đồng thời (CMS)

4. Tôi có thể tìm tài liệu tốt về thu gom rác trong Java 7 ở đâu?

Nó có thể là một nỗi đau để tìm kiếm, phải không? Có lẽ trang "trung tâm" tốt nhất mà tôi tìm thấy là trang này:

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140228.html

Một số đọc sâu cần thiết, nhưng đáng giá nếu bạn cần điều chỉnh. Đặc biệt sâu sắc là: Garbage Collector Ergonomics


13
  1. G1 có phải là bộ thu thập mặc định trong Java 7 không và nếu không, làm cách nào để kích hoạt G1?

G1 không phải là bộ thu thập mặc định trong Java 7. -XX:+UseG1GCsẽ kích hoạt G1GC

  1. G1 có cài đặt tùy chọn nào trong Java7?

Có nhiều. Hãy xem bài báo oracle này để biết thông tin đầy đủ.

G1 GC là một bộ thu gom rác thích ứng với các giá trị mặc định cho phép nó hoạt động hiệu quả mà không cần sửa đổi.

Vì lý do này, hãy tùy chỉnh các thông số quan trọng

-XX:MaxGCPauseMillis
-XX:G1HeapRegionSize
-XX:ParallelGCThreads
-XX:ConcGCThreads

và để tất cả các tham số khác thành giá trị mặc định .

Đây là danh sách các tùy chọn quan trọng và giá trị mặc định của chúng. Danh sách này áp dụng cho máy ảo Java HotSpot mới nhất, phiên bản 24. Bạn có thể điều chỉnh và điều chỉnh cài đặt G1 GC trên dòng lệnh JVM.

Mặc định quan trọng:

-XX:G1HeapRegionSize=n

Đặt kích thước của vùng G1. Giá trị sẽ là lũy thừa của hai và có thể nằm trong khoảng từ 1MB đến 32MB. Mục tiêu là có khoảng 2048 khu vực dựa trên kích thước đống Java tối thiểu.

-XX:MaxGCPauseMillis=200

Đặt giá trị mục tiêu cho thời gian tạm dừng tối đa mong muốn. Giá trị mặc định là 200 mili giây. Giá trị được chỉ định không thích ứng với kích thước đống của bạn.

-XX:G1NewSizePercent=5

Đặt tỷ lệ phần trăm của heap để sử dụng làm mức tối thiểu cho quy mô thế hệ trẻ. Giá trị mặc định là 5 phần trăm của đống Java của bạn.

-XX:G1MaxNewSizePercent=60

Đặt phần trăm kích thước heap để sử dụng làm kích thước tối đa cho kích thước thế hệ trẻ. Giá trị mặc định là 60 phần trăm của đống Java của bạn.

-XX:ParallelGCThreads=n

Đặt giá trị của các luồng công nhân STW. Đặt giá trị của n thành số bộ xử lý logic. Giá trị của n bằng với số bộ xử lý logic có giá trị là 8.

Nếu có nhiều hơn tám bộ xử lý logic, hãy đặt giá trị của n bằng khoảng 5/8 bộ xử lý logic. Điều này hoạt động trong hầu hết các trường hợp ngoại trừ các hệ thống SPARC lớn hơn trong đó giá trị của n có thể xấp xỉ 5/16 bộ xử lý logic.

-XX:ConcGCThreads=n

Đặt số lượng chủ đề đánh dấu song song. Đặt n thành xấp xỉ 1/4 số luồng thu gom rác song song (ParallelGCThreads).

-XX:InitiatingHeapOccupancyPercent=45

Đặt ngưỡng chiếm dụng đống Java kích hoạt chu kỳ đánh dấu. Tỷ lệ chiếm dụng mặc định là 45 phần trăm của toàn bộ đống Java.

-XX:G1MixedGCLiveThresholdPercent=65

Đặt ngưỡng sử dụng cho một khu vực cũ được đưa vào chu trình thu gom rác hỗn hợp. Công suất mặc định là 65 phần trăm

-XX:G1HeapWastePercent=10

Đặt phần trăm đống mà bạn sẵn sàng lãng phí. Máy ảo Java HotSpot không bắt đầu chu trình thu gom rác hỗn hợp khi phần trăm có thể thu hồi nhỏ hơn phần trăm rác đống

-XX:G1MixedGCCountTarget=8

Đặt số lượng mục tiêu của bộ sưu tập rác hỗn hợp sau một chu kỳ đánh dấu để thu thập các khu vực cũ có tối đa dữ liệu trực tiếp G1MixedGCLIveThresholdP phần trăm. Mặc định là 8 bộ sưu tập rác hỗn hợp

-XX:G1OldCSetRegionThresholdPercent=10

Đặt giới hạn trên cho số lượng khu vực cũ sẽ được thu gom trong một chu kỳ thu gom rác hỗn hợp. Mặc định là 10 phần trăm của đống Java

-XX:G1ReservePercent=10

Đặt phần trăm bộ nhớ dự trữ luôn trống để giảm nguy cơ tràn dung lượng. Mặc định là 10 phần trăm. Khi bạn tăng hoặc giảm tỷ lệ phần trăm, hãy đảm bảo điều chỉnh tổng số đống Java theo cùng một số lượng.

Bạn đã cấu hình lại nhiều tham số G1GC, những tham số này không bắt buộc nếu bạn làm theo trang tài liệu trên. Vui lòng kiểm tra lại các đề xuất ở trên, đặc biệt là trên ParallelGCThreadsConcGCThreads , sẽ dựa trên lõi CPU của bạn. Loại bỏ cấu hình lại các thông số không cần thiết.

Khuyến nghị từ oracle:

Khi bạn đánh giá và tinh chỉnh G1 GC, hãy ghi nhớ các khuyến nghị sau:

  1. Quy mô thế hệ trẻ : Tránh đặt quy mô thế hệ trẻ một cách rõ ràng bằng -Xmntùy chọn hoặc bất kỳ hoặc tùy chọn liên quan khác, chẳng hạn như -XX:NewRatio. Việc sửa quy mô thế hệ trẻ ghi đè mục tiêu về thời gian tạm dừng .

  2. Tạm dừng Mục tiêu thời gian: Khi bạn đánh giá hoặc điều chỉnh bất kỳ bộ sưu tập rác nào, luôn có sự cân bằng giữa độ trễ so với thông lượng. G1 GC là một bộ thu gom rác gia tăng với các khoảng dừng đồng nhất, nhưng cũng có nhiều chi phí hơn trên các luồng ứng dụng. Mục tiêu thông lượng cho G1 GC là 90 phần trăm thời gian ứng dụng và 10 phần trăm thời gian thu gom rác .

  1. Có bất kỳ thay đổi nào được thực hiện đối với các trình thu thập khác như cms hoặc trình thu thập song song trong Java 7 không?

Có một số thay đổi với Java 7. Mời các bạn xem qua bài viết này

  1. Tôi có thể tìm tài liệu hay về thu gom rác trong Java 7 ở đâu?

Tham khảo trang tài liệu oracle về gc và câu hỏi SE liên quan:

Thu gom rác Java G1 trong sản xuất


3

Không có G1 không phải là trình thu gom rác mặc định trong jdk 1.7.0_02. Bộ thu gom rác mặc định phụ thuộc vào loại máy. Nếu máy thuộc lớp Server thì bộ thu gom rác mặc định là Throughput Collector. Nếu máy thuộc lớp Client thì bộ thu gom rác mặc định là Serial Collector.


1
Tôi tranh luận rằng điều này là hoàn toàn chính xác. Tham chiếu Java 5 , vẫn còn hiệu lực. Trên hệ thống Windows (32/64): Chạy Java 32-bit (5..8) >> Serial GC theo mặc định. Chạy Java 64-bit (5..6) >> ParallelGC (chỉ dành cho thế hệ trẻ) theo mặc định. Chạy Java 64-bit (7..8) >> ParallelOldGC (song song Young và Old) theo mặc định. Tham chiếu cho thay đổi Java 7 , cuối cùng là bộ thu thập "song song" == "bộ thu thập thông lượng" "
Luke Usherwood

3
(Một phản hồi gay gắt cho đóng góp SO đầu tiên và chính xác của người này. Tôi lưu ý đó cũng là lần cuối cùng của họ.)
Luke Usherwood

2

Tài liệu có sẵn tại http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html (liên kết do Wojtek cung cấp) dường như là liên kết chính thức duy nhất có thông tin. có vẻ đã lỗi thời vì một số cờ được đề cập chỉ có sẵn trong các bản dựng thử nghiệm, chúng không còn tồn tại trong các bản phát hành sản xuất. Một số người từ Oracle nên cung cấp một số tài liệu cập nhật về G1 GC.


0

Theo mặc định, bạn không thực sự muốn sử dụng bộ sưu tập G1, vì nó không thực sự tốt hơn những cái khác. Nó chỉ tốt cho những mục đích đặc biệt.

Trong trường hợp ứng dụng có độ trễ thấp thì tốt hơn CMS một cách khéo léo, vì nó có thời gian tạm dừng ngắn hơn một chút và dễ đoán hơn. Đổi lại, thông lượng kém hơn nhiều so với CMS.

Vì vậy, nó chỉ tốt nếu độ trễ là quan trọng, nhưng thông lượng không quan trọng chút nào. Nếu cả hai đều quan trọng, thì hãy ở lại với CMS.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.