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


91

Vì Java 7 sẽ sử dụng bộ sưu tập rác G1 mới theo mặc định, liệu Java sẽ có thể xử lý một thứ tự đống lớn hơn mà không có thời gian tạm dừng GC được cho là "tàn phá"? Đã có ai thực sự triển khai G1 trong sản xuất chưa, kinh nghiệm của bạn là gì?

Công bằng mà nói, lần duy nhất tôi thấy các khoảng dừng GC thực sự dài là trên các đống rất lớn, nhiều hơn một máy trạm sẽ có. Để làm rõ câu hỏi của tôi; G1 sẽ mở cổng vào đống hàng trăm GB? Lao?


15
Mặc dù nó có thể được diễn đạt lại cụ thể hơn, nhưng đây không phải là một câu hỏi kinh khủng. Tôi thực sự mong muốn mọi người phải giải thích về mình tốt hơn là "Không phải là câu hỏi" khi biểu quyết đóng.
Bill K

Tôi không bỏ phiếu để kết thúc, nhưng tôi ước OP đã làm một công việc khách quan hơn trong việc trình bày chi tiết mối quan hệ của anh ấy với GC hiện tại. Ngoài ra, "Java" là một ngôn ngữ trong khi anh ấy đang nói về việc triển khai, và tôi không biết "triển khai G1 trong sản xuất" nghĩa là gì, đặc biệt là với thì tương lai của phần còn lại của câu hỏi. Nếu nó sẽ có trong Java 7, chắc chắn không ai sử dụng nó trong sản xuất?
Pascal Cuoq

6
@Pascal G1 đã là một tính năng thử nghiệm có sẵn trong JDK kể từ bản cập nhật JDK 6 14. Bằng cách "triển khai G1 trong sản xuất", tôi nghĩ ý của anh ấy là thực sự sử dụng nó, không khó để hình dung. Và mặc dù tôi đồng ý rằng G1 là một phần của JDK 7, không phải Java, nhưng tìm kiếm Java 7 trên Google sẽ trả về trang chủ JDK 7 như là kết quả đầu tiên và cả hai thuật ngữ thường được sử dụng thay thế cho nhau. @Benju Tôi sẽ không tin tưởng vào kết quả thu được với G1 trên JDK hiện tại vì nó là thử nghiệm, nhiều thứ có thể thay đổi từ bây giờ đến bản phát hành chính thức.
teto

2
Có vẻ như JDK 7 bao gồm bản cập nhật 1,2 và 3 không sử dụng G1 gc theo mặc định. Bạn có thể chect nó bằng cách jinfo -flag UseG1GC pid
George

Câu trả lời:


34

Có vẻ như quan điểm của G1 là có thời gian tạm dừng nhỏ hơn, thậm chí đến mức nó có khả năng chỉ định mục tiêu thời gian tạm dừng tối đa.

Thu gom rác không chỉ là một thỏa thuận đơn giản "Này, đã đầy rồi, hãy di chuyển mọi thứ cùng một lúc và bắt đầu lại" nữa - đó là hệ thống phân luồng nền, đa cấp, phức tạp đến kinh ngạc. Nó có thể thực hiện phần lớn công việc bảo trì ở chế độ nền mà không hề tạm dừng và nó cũng sử dụng kiến ​​thức về các mẫu dự kiến ​​của hệ thống trong thời gian chạy để trợ giúp - như giả sử hầu hết các đối tượng chết ngay sau khi được tạo, v.v.

Tôi có thể nói rằng thời gian tạm dừng của GC sẽ tiếp tục được cải thiện, không xấu đi, với các bản phát hành trong tương lai.

BIÊN TẬP:

Khi đọc lại, tôi chợt nhận ra rằng tôi sử dụng Java hàng ngày - Eclipse, Azureus và các ứng dụng mà tôi phát triển, và đã lâu rồi kể từ khi tôi thấy tạm dừng. Không phải là một khoảng dừng đáng kể, nhưng ý tôi là bất kỳ khoảng dừng nào.

Tôi đã thấy tạm dừng khi nhấp chuột phải vào windows explorer hoặc (thỉnh thoảng) khi tôi kết nối phần cứng USB nhất định, nhưng với Java --- thì không.

GC có còn là vấn đề với ai không?


Đồng ý - lần duy nhất tôi thấy GC tạm dừng là khi tôi cố tình hoặc vô tình kích động chúng bằng mã tạo rác song song ồ ạt .....
mikera

28
Đúng vậy, GC vẫn còn là một vấn đề khi bạn bắt đầu xử lý các đống lớn (> 16GB), đặc biệt là với các thế hệ có thời hạn sử dụng lớn.
Nhà giả kim

2
@ the-alchemist wow, tôi đã thấy bình luận của bạn lướt qua một vài lần và nó khiến tôi kinh ngạc khi bạn nói 16 GB !! Mặc dù tôi hoàn toàn chắc chắn rằng bạn chính xác rằng điều này có thể gây ra sự chậm trễ lớn, nhưng tôi muốn kiểm tra xem bạn đã tắt TẤT CẢ hoán đổi chưa. Trên một hệ thống bộ nhớ lớn, bất kỳ sự hoán đổi java nào sẽ hoàn toàn giết chết hệ thống của bạn (Vì GC rất không thân thiện với hoán đổi). Tôi chắc rằng bạn đã làm điều này, nhưng tôi chỉ muốn đề cập đến nó - bởi vì nó sẽ tạo ra sự khác biệt rất lớn. Tôi chưa bao giờ thấy một chiếc PC nào có nhiều ram như vậy - bạn có bao nhiêu? 32g?
Bill K

8
Có, GC có vấn đề đối với các dịch vụ vì chúng là thứ khiến RẤT khó cải thiện giới hạn TP99,9 (và cao hơn). Cụ thể, các GC "thế hệ cũ" có thể là bẫy tử thần làm đóng băng JVM (và dịch vụ) trong nhiều giây; và đối với các dịch vụ thường phục vụ các yêu cầu trong mili giây một chữ số (hoặc hai chữ số thấp), điều này là có vấn đề. Đối với những gì đáng giá, đây là một vấn đề thực tế với lưu trữ phụ trợ được sử dụng bởi dịch vụ Hàng đợi Đơn giản của Amazon (không thể đi sâu vào chi tiết vì đó là AWS nội bộ).
StaxMan

21
Điều khó chịu về GC là cách đây nhiều năm Azul đã phát minh ra một thuật toán GC khéo léo (Azul C4) có thể dễ dàng đối phó với hàng trăm gigabyte mà không có bất kỳ thời gian tạm dừng đáng chú ý nào bằng cách sử dụng rất thông minh phần cứng bộ nhớ của bộ vi xử lý. Nhưng không ai biết điều này và nó sẽ không sớm được triển khai trong các phiên bản Java chính vì nó cần một số hỗ trợ của hệ điều hành. Và các nhà cung cấp hệ điều hành sẽ không làm bất cứ điều gì cho đến khi mọi người biết về thuật toán và gây áp lực lên các nhà cung cấp hệ điều hành. Xem azulsystems.com/zing/pgc , Managedruntime.org
Hans-Peter Störr 21/10/11

58

Tôi đã thử nghiệm nó với một ứng dụng nặng: 60-70GB được phân bổ cho heap, với 20-50GB được sử dụng bất cứ lúc nào. Với những loại ứng dụng này, thật thiếu sót khi nói rằng quãng đường của bạn có thể thay đổi. Tôi đang chạy JDK 1.6_22 trên Linux. Các phiên bản nhỏ rất quan trọng-- trước khoảng 1.6_20, có một số lỗi trong G1 gây ra NullPointerExceptions ngẫu nhiên.

Tôi thấy rằng nó rất tốt trong việc duy trì mục tiêu tạm dừng mà bạn đưa ra hầu hết thời gian. Mặc định dường như tạm dừng 100ms (0,1 giây) và tôi đã bảo nó thực hiện một nửa điều đó (-XX: MaxGCPauseMillis = 50). Tuy nhiên, một khi bộ nhớ thực sự cạn kiệt, nó sẽ hoảng sợ và thực hiện việc thu gom rác toàn thế giới. Với 65GB, mất từ ​​30 giây đến 2 phút. (Số lượng CPU có thể không tạo ra sự khác biệt; nó có thể bị giới hạn bởi tốc độ bus.)

So với CMS (không phải là GC máy chủ mặc định, nhưng nó phải dành cho máy chủ web và các ứng dụng thời gian thực khác), các lần tạm dừng điển hình dễ dự đoán hơn nhiều và có thể được thực hiện ngắn hơn nhiều. Cho đến nay, tôi đang gặp may mắn hơn với CMS vì những lần tạm dừng rất lớn, nhưng điều đó có thể là ngẫu nhiên; Tôi chỉ nhìn thấy chúng một vài lần sau mỗi 24 giờ. Tôi không chắc cái nào sẽ phù hợp hơn trong môi trường sản xuất của tôi vào lúc này, nhưng có lẽ là G1. Nếu Oracle tiếp tục điều chỉnh nó, tôi nghi ngờ G1 cuối cùng sẽ là người chiến thắng rõ ràng.

Nếu bạn không gặp sự cố với các trình thu gom rác hiện có, không có lý do gì để xem xét G1 ngay bây giờ. Nếu bạn đang chạy một ứng dụng có độ trễ thấp, chẳng hạn như ứng dụng GUI, G1 có lẽ là lựa chọn phù hợp, với MaxGCPauseMillis được đặt thực sự thấp. Nếu bạn đang chạy một ứng dụng ở chế độ hàng loạt, G1 sẽ không mua cho bạn bất cứ thứ gì.


14

Mặc dù tôi chưa thử nghiệm G1 trong quá trình sản xuất, tôi nghĩ rằng tôi sẽ nhận xét rằng GC đã có vấn đề đối với các trường hợp không có đống "khổng lồ". Cụ thể, các dịch vụ chỉ có 2 hoặc 4 hợp đồng biểu diễn có thể bị ảnh hưởng nghiêm trọng bởi GC. GC thế hệ trẻ thường không có vấn đề gì vì chúng kết thúc bằng mili giây một chữ số (hoặc nhiều nhất là hai chữ số). Nhưng các bộ sưu tập thế hệ cũ gặp nhiều vấn đề hơn vì chúng mất nhiều giây với kích thước thế hệ cũ từ 1 gig trở lên.

Bây giờ: về lý thuyết, CMS có thể giúp ích rất nhiều ở đó, vì nó có thể chạy hầu hết các hoạt động đồng thời. Tuy nhiên, theo thời gian sẽ có những trường hợp không thể làm được điều này và đành phải lùi bước để "đình giới". Và khi điều đó xảy ra (chẳng hạn như sau 1 giờ - không thường xuyên, nhưng vẫn quá thường xuyên), hãy giữ vững chiếc mũ của bạn. Có thể mất một phút hoặc hơn. Điều này đặc biệt có vấn đề đối với các dịch vụ cố gắng hạn chế độ trễ tối đa; thay vì mất 25 mili giây để phân phát một yêu cầu thì giờ đây nó mất mười giây trở lên. Để gây thêm tổn thương cho việc xúc phạm khách hàng, sau đó khách hàng thường sẽ hết thời gian yêu cầu và thử lại, dẫn đến các vấn đề khác (còn gọi là "cơn bão shit").

Đây là một trong những lĩnh vực mà G1 hy vọng sẽ giúp được rất nhiều. Tôi đã làm việc cho một công ty lớn cung cấp dịch vụ đám mây để lưu trữ và gửi tin nhắn; và chúng tôi không thể sử dụng CMS vì mặc dù phần lớn thời gian nó hoạt động tốt hơn các giống song song, nhưng nó có những sự cố này. Vì vậy, trong khoảng một giờ mọi thứ rất tốt đẹp; và sau đó mọi thứ xảy ra với người hâm mộ ... và bởi vì dịch vụ dựa trên các cụm, khi một nút gặp sự cố, các nút khác thường theo sau (vì thời gian chờ do GC gây ra dẫn đến các nút khác tin rằng nút đã bị lỗi, dẫn đến việc định tuyến lại).

Tôi không nghĩ GC là vấn đề quá lớn đối với các ứng dụng và có lẽ ngay cả các dịch vụ không phân cụm cũng ít bị ảnh hưởng hơn. Nhưng ngày càng có nhiều hệ thống được phân cụm (đặc biệt là nhờ kho dữ liệu NoSQL) và kích thước heap ngày càng tăng. OldGen GC có liên quan siêu tuyến tính với kích thước heap (có nghĩa là tăng gấp đôi kích thước heap nhiều hơn gấp đôi thời gian GC, giả sử kích thước của tập dữ liệu trực tiếp cũng tăng gấp đôi).


13

CTO của Azul, Gil Tene, có một cái nhìn tổng quan tốt đẹp về các vấn đề liên quan đến Thu gom rác và đánh giá các giải pháp khác nhau trong bản trình bày Hiểu biết về Bộ sưu tập rác trong Java và những gì bạn có thể làm với nó và có thêm chi tiết trong bài viết này: http: // www.infoq.com/articles/azul_gc_in_detail .

Azul's C4 Garbage Collector trong Zing JVM của chúng tôi vừa song song vừa đồng thời và sử dụng cùng một cơ chế GC cho cả thế hệ mới và cũ, hoạt động đồng thời và thu gọn trong cả hai trường hợp. Quan trọng nhất, C4 không có điểm dừng của thế giới. Tất cả quá trình nén được thực hiện đồng thời với ứng dụng đang chạy. Chúng tôi có những khách hàng đang chạy rất lớn (hàng trăm GByte) với trường hợp xấu hơn thời gian tạm dừng GC là <10 msec và tùy thuộc vào ứng dụng, thời gian thường ít hơn 1-2 msec.

Vấn đề với CMS và G1 là tại một thời điểm nào đó bộ nhớ heap của Java phải được nén lại, và cả hai trình thu gom rác đó đều dừng-the-world / STW (tức là tạm dừng ứng dụng) để thực hiện nén. Vì vậy, mặc dù CMS và G1 có thể loại bỏ các tạm dừng STW, nhưng chúng không loại bỏ chúng. Tuy nhiên, C4 của Azul loại bỏ hoàn toàn các lệnh tạm dừng STW và đó là lý do tại sao Zing có mức tạm dừng GC thấp như vậy ngay cả đối với các kích thước heap khổng lồ.

Và để sửa lại câu trả lời trước đó, Zing không yêu cầu bất kỳ thay đổi nào đối với Hệ điều hành. Nó chạy giống như bất kỳ JVM nào khác trên các bản phân phối Linux chưa được sửa đổi.


3
Tôi chỉ tự hỏi làm thế nào mà C4 của Azul đạt được những gì bạn nói và tại sao Sun hoặc Oracle lại không thể. Có một bí mật lớn nào đó hay đây chỉ là một sự đánh đổi nào đó?
George

5
Azul's C4 có công nghệ rất độc đáo bắt nguồn từ các thiết bị máy tính phần cứng của Azul (sử dụng bộ xử lý chuyên dụng được xây dựng để chạy các ứng dụng Java doanh nghiệp) và đã được phát triển để chạy trên các máy chủ x86 chạy Linux thông thường. Mọi trình thu gom rác cấp doanh nghiệp khác (cho dù của Oracle hay IBM) tại một thời điểm nào đó đều phải thực hiện tạm dừng thế giới - thuộc tính duy nhất của C4 của Azul là nó không bao giờ dừng các STW có vấn đề này. Nếu bạn tò mò, các nhà phát minh ra bộ sưu tập C4 đã xuất bản một bài báo về cách hoạt động của nó: dl.acm.org/citation.cfm?id=1064988 .
Người bán Scott

Scott, tôi đã đọc ở đây blog.mikemccandless.com/2012/07/… rằng Azul gửi một mô-đun hạt nhân cấp phát trước bộ nhớ cho việc sử dụng JVM. Điều này không đúng? Nếu đúng, không phải sửa đổi nhiều nhân nhưng vẫn là một sửa đổi.
Dan Pritts,

4
George, hai từ: bằng sáng chế được bảo vệ. Dan, khi bạn mua Zing, một phần của những gì bạn đang trả là nhờ những người hỗ trợ của họ điều chỉnh nó cho ứng dụng của bạn-- và điều đó bao gồm việc phân bổ mức sử dụng bộ nhớ hệ thống tổng thể. Bản thân mô-đun hạt nhân ngăn ghi vào khối bộ nhớ đang được thu gom rác. Đó là nước sốt bí mật khiến nó trở nên "tạm dừng": các chuỗi chỉ tạm dừng nếu chúng cố gắng ghi vào một trong những khối đó, và sau đó chỉ đủ dài để thu gọn khối đó.
David Leppik

13

Chúng tôi đã sử dụng G1GC, từ gần hai năm. Nó hoạt động rất tốt trong hệ thống xử lý giao dịch quan trọng trong sứ mệnh của chúng tôi và Nó được chứng minh là một hỗ trợ tuyệt vời với thông lượng cao, số lần tạm dừng thấp, đồng thời và quản lý bộ nhớ nặng được tối ưu hóa.

Chúng tôi đang sử dụng các cài đặt JVM sau:

-server -Xms512m -Xmx3076m -XX:NewRatio=50 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -XX:+AggressiveOpts -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=400 -XX:GCPauseIntervalMillis=8000 -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime

Đã cập nhật

-d64 -server -Xss4m -Xms1024m -Xmx4096m -XX:NewRatio=50 -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:+HeapDumpOnOutOfMemoryError -XX:-DisableExplicitGC -XX:+AggressiveOpts -Xnoclassgc -XX:+UseNUMA -XX:+UseFastAccessorMethods -XX:ReservedCodeCacheSize=48m -XX:+UseStringCache -XX:+UseStringDeduplication -XX:MaxGCPauseMillis=400 -XX:GCPauseIntervalMillis=8000

5
Ở Java 8, bạn không cần đặt -XX: + UseCompressedOops hoặc -XX: + DoEscapeAnalysis, gian hàng được bật như mặc định. Xem: docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
Mirko Ebert

8

Bộ sưu tập G1 giảm tác động của các bộ sưu tập đầy đủ. Nếu bạn có một ứng dụng mà bạn đã giảm nhu cầu về các bộ sưu tập đầy đủ, thì bộ sưu tập Đồng thời quét bản đồ cũng tốt như vậy và theo kinh nghiệm của tôi, thời gian thu thập nhỏ hơn.


"lưu ý rằng chỉ cho phép sử dụng sản xuất G1 khi hợp đồng hỗ trợ Java đã được mua.", groups.google.com/forum/#!topic/javaposse/Vm0a4H-QY54 , vậy nó có phải là hoang đường hay không?
Christophe Roussy

1
@ChristopheRoussy Tôi không biết điều này có đúng nữa không (hoặc thực sự có bằng chứng rằng nó đã từng đúng) Nó không yêu cầu -XX: + UnlockCommercialFeatures nên tôi nghi ngờ rằng G1 không yêu cầu giấy phép.
Peter Lawrey


5

Gần đây tôi đã được chuyển đến từ

CMS đến G1GC với bộ xử lý 4 nhân 4G & 8 lõi trên máy chủ với JDK 1.7.45 .

(JDK 1.8.x G1GC được ưa thích hơn 1.7 nhưng do một số hạn chế, tôi phải sử dụng phiên bản 1.7.45)

Tôi đã định cấu hình các thông số chính bên dưới và giữ tất cả các thông số khác thành giá trị mặc định.

-XX:G1HeapRegionSize=n, XX:MaxGCPauseMillis=m, -XX:ParallelGCThreads=n, 
-XX:ConcGCThreads=n apart from -Xms and -Xmx

Nếu bạn muốn tinh chỉnh các thông số này, hãy xem bài viết này của oracle .

Các quan sát chính:

  1. Sử dụng bộ nhớ phù hợp với G1GC không giống như mức cao và mức thấp với CMS
  2. Thời gian tạm dừng tối đa GC ít hơn so với CMS
  3. Thời gian dành cho việc thu gom rác ở G1GC cao hơn một chút so với CMS.
  4. Số lượng bộ sưu tập chính hầu như không đáng kể so với CMS
  5. Số lượng bộ sưu tập nhỏ ở mức cao hơn so với CMS

Nhưng tôi vẫn thấy vui vì thời gian tạm dừng của Max GC ít hơn so với CMS. Tôi đã đặt thời gian tạm dừng Max GC là 1,5 giây và giá trị này vẫn chưa bị vượt qua.

Câu hỏi SE liên quan:

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


4

CMS có thể dẫn đến hiệu suất bị giảm sút từ từ ngay cả khi bạn đang chạy nó mà không tích lũy các đối tượng có thời hạn sử dụng. Điều này là do phân mảnh bộ nhớ mà G1 được cho là tránh.

Huyền thoại về G1 chỉ có sẵn với hỗ trợ trả phí chỉ có vậy, một huyền thoại. Sun và bây giờ là Oracle đã làm rõ điều này trên trang JDK.


4

G1 GC được cho là hoạt động tốt hơn. Nhưng nếu thiết lập -XX: MaxGCPauseMillis quá mạnh, rác sẽ được thu thập quá chậm. Và đó là lý do tại sao GC đầy đủ được kích hoạt trong ví dụ của David Leppik.


4

Tôi vừa triển khai Trình thu gom rác G1 trong dự án Bộ nhớ lớn bằng đất nung của chúng tôi. Trong khi làm việc trên các loại bộ thu khác nhau, G1 đã cho chúng tôi kết quả tốt nhất với thời gian phản hồi dưới 600ms.

Bạn có thể tìm thấy kết quả kiểm tra (tổng số 26) tại đây

Hy vọng nó giúp.


3

Gần đây tôi đã di chuyển một phần của Twicsy sang một máy chủ mới với RAM 128GB và quyết định sử dụng 1.7. Tôi đã bắt đầu sử dụng tất cả các cài đặt bộ nhớ tương tự như tôi đã sử dụng với 1.6 (tôi có một số trường hợp đang chạy làm nhiều việc khác nhau, bất cứ nơi nào từ 500mb bộ nhớ lên đến 15GB và bây giờ là một cái mới với 40GB) và điều đó không hoạt động tốt chút nào . 1.7 dường như sử dụng nhiều heap hơn 1.6 và tôi đã gặp phải rất nhiều vấn đề trong vài ngày đầu tiên. Tôi may mắn có nhiều RAM để làm việc và tăng RAM cho hầu hết các quy trình của mình, nhưng vẫn gặp một số vấn đề. MO bình thường của tôi là sử dụng kích thước heap tối thiểu rất nhỏ là 16m, ngay cả với heap tối đa là vài gigabyte, sau đó bật GC tăng dần. Điều này giữ cho việc tạm dừng ở mức tối thiểu. Tuy nhiên, điều đó hiện không hoạt động và tôi đã phải tăng kích thước tối thiểu lên khoảng những gì tôi dự kiến ​​sẽ sử dụng trung bình trong đống, và điều đó đã diễn ra rất tốt. Tôi vẫn bật GC gia tăng, nhưng tôi sẽ thử mà không có. Bây giờ không có gì tạm dừng và mọi thứ dường như đang chạy rất nhanh. Vì vậy, tôi nghĩ đạo lý của câu chuyện là đừng mong đợi cài đặt bộ nhớ của bạn dịch hoàn hảo từ 1,6 sang 1,7.


2

G1 làm cho ứng dụng nhanh nhẹn hơn rất nhiều: độ trễ của ứng dụng sẽ tăng lên - ứng dụng có thể được đặt tên là "thời gian thực mềm". Điều này được thực hiện bằng cách thay thế hai loại chạy GC (loại nhỏ nhỏ và một loại lớn trên Tenured Gen) thành loại nhỏ có kích thước bằng nhau.

Để biết thêm chi tiết, hãy xem tại đây: http://geekroom.de/java/java-expertise-g1-fur-java-7/


1

Tôi đang làm việc với Java, cho Heap nhỏ và lớn, và câu hỏi về GC và Full GC xuất hiện hàng ngày, vì các ràng buộc có thể nghiêm ngặt hơn các ràng buộc khác: trong một số môi trường nhất định, 0,1 giây của GC hoặc Full GC, kill chỉ đơn giản là fonctionnalité, và có cấu hình và khả năng chi tiết là rất quan trọng (CMS, iCMS, các loại khác ... mục tiêu là ở đây để có thời gian phản hồi tốt nhất có thể với xử lý gần như thời gian thực (ở đây xử lý thời gian thực thường là 25 mili giây) Vì vậy, về cơ bản, mọi cải tiến trong GC ergonomy ans heuristique đều được hoan nghênh!


1

Tôi sử dụng G1GC trên Java 8 và cũng với Groovy (cũng là Java 8), và tôi đang thực hiện nhiều loại khối lượng công việc khác nhau và nói chung G1GC hoạt động như thế này:

  • Việc sử dụng bộ nhớ rất thấp, ví dụ: 100MB thay vì 500MB so với cài đặt Java mặc định

  • Thời gian phản hồi nhất quán và rất thấp

  • Hiệu suất giữa cài đặt mặc định và G1GC bị chậm lại 20% khi sử dụng G1GC trong trường hợp xấu nhất (không điều chỉnh, ứng dụng đơn luồng). Nó không nhiều khi xem xét thời gian phản hồi tốt và sử dụng bộ nhớ thấp.

  • Khi chạy từ Tomcat đa luồng, hiệu suất tổng thể tốt hơn 30% và sử dụng bộ nhớ thấp hơn nhiều cũng như thời gian phản hồi cũng thấp hơn nhiều.

Vì vậy, nhìn chung, khi sử dụng các khối lượng công việc thực sự khác nhau, G1GC là bộ sưu tập rất tốt cho Java 8 cho các ứng dụng đa luồng và ngay cả đối với một luồng cũng có một số lợi ích.


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.