Thông báo nhật ký thu gom rác Java


96

Tôi đã định cấu hình java để đổ thông tin thu thập rác vào nhật ký (chi tiết GC ). Tôi không chắc về ý nghĩa của các mục thu gom rác trong nhật ký. Dưới đây là một mẫu của những mục này. Tôi đã tìm kiếm trên Google và không tìm thấy lời giải thích chắc chắn.

Tôi có một số phỏng đoán hợp lý, nhưng tôi đang tìm kiếm câu trả lời cung cấp định nghĩa chặt chẽ về ý nghĩa của các con số trong các mục nhập, được sao lưu bởi các nguồn đáng tin cậy. +1 tự động cho tất cả các câu trả lời trích dẫn tài liệu về mặt trời. Câu hỏi của tôi là:

  1. PSYoungGen đề cập đến điều gì? Tôi cho rằng nó có liên quan gì đó đến thế hệ trước (trẻ hơn?), Nhưng chính xác thì sao?
  2. Sự khác biệt giữa bộ ba số thứ hai và số thứ nhất là gì?
  3. Tại sao tên (PSYoungGen) được chỉ định cho bộ ba số đầu tiên mà không phải tên thứ hai?
  4. Mỗi số (kích thước bộ nhớ) trong bộ ba có ý nghĩa gì. Ví dụ trong 109884K-> 14201K (139904K), là bộ nhớ trước GC 109884k và sau đó nó được giảm xuống 14201K. Số thứ ba có liên quan như thế nào? Tại sao chúng ta yêu cầu một bộ số thứ hai?

8109.128: [GC [PSYoungGen: 109884K-> 14201K (139904K)] 691015K-> 595332K (1119040K), 0,0454530 giây]

8112.111: [GC [PSYoungGen: 126649K-> 15528K (142336K)] 707780K-> 605892K (1121472K), 0,0934560 giây]

8112.802: [GC [PSYoungGen: 130344K-> 3732K (118592K)] 720708K-> 607895K (1097728K), 0,0682690 giây]


toàn bộ đống, một phần thế hệ trẻ của đống, gc nhỏ để biết cách hoạt động của gc, hãy kiểm tra ví dụ: cubrid.org/blog/dev-platform/…
MarianP

Câu trả lời:


90

Hầu hết nó được giải thích trong Hướng dẫn điều chỉnh GC (dù sao thì bạn cũng nên đọc).

Tùy chọn dòng lệnh -verbose:gckhiến thông tin về tập hợp đống và rác được in ở mỗi tập hợp. Ví dụ, đây là đầu ra từ một ứng dụng máy chủ lớn:

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]

Ở đây chúng ta thấy hai bộ sưu tập nhỏ tiếp theo là một bộ sưu tập chính. Các số trước và sau mũi tên (ví dụ: 325407K->83000Ktừ dòng đầu tiên) cho biết kích thước tổng hợp của các đối tượng sống trước và sau khi thu gom rác, tương ứng. Sau các bộ sưu tập nhỏ, kích thước bao gồm một số đối tượng là rác (không còn sống) nhưng không thể lấy lại được. Các đối tượng này hoặc được chứa trong thế hệ có quyền sử dụng hoặc được tham chiếu từ các thế hệ có quyền sử dụng hoặc vĩnh viễn.

Số tiếp theo trong dấu ngoặc đơn (ví dụ: (776768K)lại từ dòng đầu tiên) là kích thước đã cam kết của heap: lượng không gian có thể sử dụng cho các đối tượng java mà không yêu cầu thêm bộ nhớ từ hệ điều hành. Lưu ý rằng con số này không bao gồm một trong các không gian sống sót, vì chỉ một không gian có thể được sử dụng tại bất kỳ thời điểm nhất định nào và cũng không bao gồm thế hệ vĩnh viễn, chứa siêu dữ liệu được sử dụng bởi máy ảo.

Mục cuối cùng trên dòng (ví dụ 0.2300771 secs:) cho biết thời gian thực hiện việc thu thập; trong trường hợp này là khoảng một phần tư giây.

Định dạng cho bộ sưu tập chính trong dòng thứ ba là tương tự.

Định dạng của đầu ra được tạo ra -verbose:gccó thể thay đổi trong các bản phát hành trong tương lai.

Tôi không chắc tại sao lại có PSYoungGen trong bạn; bạn đã thay đổi người thu gom rác?


Tìm tệp nhật ký gc ở đâu?
Mr Lou

7
Câu trả lời này không thực sự giải quyết các câu hỏi ban đầu. Tôi cảm thấy câu trả lời của michaeljoseph hay hơn. Nó giải quyết các câu hỏi mà Ethan đặt ra và làm tốt hơn việc phá vỡ ví dụ ban đầu. Mặc dù có hai vấn đề trong câu trả lời của anh ấy (liên kết của anh ấy hiện đã chết và rafa.ferreria đã chỉ ra vấn đề còn lại), nó không chỉ khiến một tài liệu Oracle hồi sinh.
Dirk

127
  1. PSYoungGen đề cập đến bộ thu gom rác được sử dụng cho bộ sưu tập nhỏ. PS là viết tắt của Parallel Scavenge.
  2. Bộ số đầu tiên là kích thước trước / sau của thế hệ trẻ và bộ số thứ hai là cho toàn bộ đống. ( Chẩn đoán sự cố Thu gom rác nêu chi tiết định dạng)
  3. Tên cho biết thế hệ và bộ sưu tập được đề cập, bộ thứ hai dành cho toàn bộ đống.

Một ví dụ về GC đầy đủ được liên kết cũng cho thấy các bộ sưu tập được sử dụng cho các thế hệ cũ và lâu dài:

3.757: [Full GC [PSYoungGen: 2672K->0K(35584K)] 
            [ParOldGen: 3225K->5735K(43712K)] 5898K->5735K(79296K) 
            [PSPermGen: 13533K->13516K(27584K)], 0.0860402 secs]

Cuối cùng, chia nhỏ một dòng của đầu ra nhật ký mẫu của bạn:

8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs]
  • 107Mb được sử dụng trước GC, 14Mb được sử dụng sau GC, kích thước thế hệ trẻ tối đa 137Mb
  • 675Mb heap được sử dụng trước GC, 581Mb heap được sử dụng sau GC, kích thước heap tối đa 1Gb
  • GC nhỏ xảy ra 8109,188 giây kể từ khi bắt đầu JVM và mất 0,04 giây

8
chỉ là một nhận xét nhỏ, giá trị giữa '()' không phải là kích thước tối đa, mãi mãi, là kích thước tối đa tại thời điểm này. Nếu GC không thể giải phóng heap ít hơn thì giới hạn này sẽ cần nhiều không gian hơn cho hệ thống hoạt động và giá trị này sẽ tăng lên. Tôn trọng tất nhiên giới hạn xác định trên: -Xmx
rafa.ferreira

@ rafa.ferreira Tôi nghĩ giá trị trong paranthesis, tức là 1119040K là kích thước đống đã cam kết. Tôi không nghĩ, GC in kích thước 'max heap' ở bất kỳ đâu. Tài liệu tham khảo 1tài liệu tham khảo 2
rohitmohta

23

Tôi chỉ muốn đề cập rằng người ta có thể lấy nhật ký GC chi tiết với

-XX:+PrintGCDetails 

tham số. Sau đó, bạn thấy đầu ra PSYoungGen hoặc PSPermGen như trong câu trả lời.

Cũng -Xloggc:gc.logdường như tạo ra cùng một đầu ra giống như -verbose:gcnhưng bạn có thể chỉ định một tệp đầu ra trong đầu tiên.

Ví dụ sử dụng:

java -Xloggc:./memory.log -XX:+PrintGCDetails Memory

Để trực quan hóa dữ liệu tốt hơn, bạn có thể thử gcviewer (có thể tìm thấy phiên bản mới hơn trên github ).

Hãy cẩn thận để viết các tham số một cách chính xác, tôi đã quên dấu "+" và JBoss của tôi sẽ không khởi động mà không có bất kỳ thông báo lỗi nào!


3
Lưu ý rằng gc.log sẽ bị ghi đè khi java được khởi động lại (chẳng hạn như, nếu bạn khởi động lại tomcat của mình vì nó gặp sự cố về bộ nhớ và bạn rất thích xem gc.log đó). Hoặc ít nhất là như vậy nếu bạn xoay các bản ghi GC. Có rất nhiều tùy chọn khác kiểm soát việc ghi nhật ký gc. Xem oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html . Đặc biệt, hãy xem xét-XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<some number of files> -XX:GCLogFileSize=<some size> -XX:+PrintTenuringDistribution
Dan Pritts,
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.