Thuật ngữ heap Java: thế hệ trẻ, già và vĩnh viễn?


318

Tôi đang cố gắng hiểu các khái niệm về thế hệ trẻ , giàvĩnh viễn là gì trong thuật ngữ heap Java và cụ thể hơn là các tương tác giữa ba thế hệ.

Câu hỏi của tôi là:

  • Thế hệ trẻ là gì?
  • Thế hệ cũ là gì?
  • Thế hệ vĩnh viễn là gì?
  • Làm thế nào để ba thế hệ tương tác / liên quan với nhau?

Giả sử bạn đang nói về Sun JDK / OpenJDK, hãy xem trang trên trang web OpenJDK trên Quản lý lưu trữ . Có một vài liên kết đến nhiều thông tin hơn ở phía dưới.
Nicholas Riley

1
cũng liên quan đến câu hỏi này "thế hệ được thuê"
gstackoverflow

Câu trả lời:


304

Đây dường như là một sự hiểu lầm phổ biến. Trong JVM của Oracle, thế hệ vĩnh viễn không phải là một phần của đống. Đó là một không gian riêng cho các định nghĩa lớp và dữ liệu liên quan. Trong Java 6 trở về trước, các chuỗi nội bộ cũng được lưu trữ trong thế hệ cố định. Trong Java 7, các chuỗi nội bộ được lưu trữ trong heap đối tượng chính.

Đây là một bài viết tốt về thế hệ vĩnh viễn .

Tôi thích các mô tả được cung cấp cho từng không gian trong hướng dẫn của Oracle trên JConsole :

Đối với máy ảo Java HotSpot, nhóm bộ nhớ cho bộ sưu tập rác nối tiếp là như sau.

  • Eden Space (heap): Nhóm từ đó bộ nhớ ban đầu được phân bổ cho hầu hết các đối tượng.
  • Survivor Space (heap): Bể chứa các vật thể sống sót sau bộ sưu tập rác của không gian Eden.
  • Tenured Generation (heap): Nhóm chứa các đối tượng đã tồn tại một thời gian trong không gian sống sót.
  • Thế hệ vĩnh viễn (không phải heap): Nhóm chứa tất cả dữ liệu phản chiếu của chính máy ảo, chẳng hạn như các đối tượng lớp và phương thức. Với các máy ảo Java sử dụng chia sẻ dữ liệu lớp, thế hệ này được chia thành các khu vực chỉ đọc và đọc.
  • Bộ đệm mã (không phải heap): Máy ảo Java HotSpot cũng bao gồm bộ đệm mã, chứa bộ nhớ được sử dụng để biên dịch và lưu trữ mã gốc.

Java sử dụng bộ sưu tập rác thế hệ. Điều này có nghĩa là nếu bạn có một đối tượng foo (là một thể hiện của một số lớp), thì càng có nhiều sự kiện thu gom rác tồn tại (nếu vẫn còn các tham chiếu đến nó), nó càng được quảng bá. Nó bắt đầu ở thế hệ trẻ (được chia thành nhiều không gian - Eden và Survivor) và cuối cùng sẽ kết thúc ở thế hệ được thuê nếu nó tồn tại đủ lâu.


2
Tôi tin rằng kể từ Java 7, các chuỗi không còn được thực hiện trong thế hệ vĩnh viễn.
Tim Goodman

Bạn nói đúng, tôi ngạc nhiên khi điều này tồn tại rất lâu trước khi được đề cập. Sau đó, trong thế hệ Java 8 vĩnh viễn sẽ được thay thế bằng metaspace (mặc dù tôi không chắc nó sẽ thực sự khác biệt như thế nào, ngoài việc không bị ràng buộc theo mặc định)
Joshua McKinnon

9
Joshua - là "cũ" đồng nghĩa với "được thuê", và "mới" đồng nghĩa với "người sống sót?"
joadha

1
gen perm chỉ được áp dụng trước Java 8.
lwpro2

2
Trong trường hợp bạn vẫn đang chờ câu trả lời, vâng, bạn đúng @joadha. Kiểm tra liên kết này: codeahoy.com/2017/08/06/basics-of-java-garbage-collection
recepinanc

197

Heap được chia thành các thế hệ trẻ và già như sau:

Thế hệ trẻ : Đó là nơi sống trong thời gian ngắn và được chia thành hai không gian:

  • Eden Space : Khi đối tượng được tạo bằng bộ nhớ từ khóa mới được phân bổ trên không gian này.
  • Không gian sống sót : Đây là hồ chứa các đối tượng đã sống sót sau khi thu gom rác java từ không gian Eden.

Thế hệ cũ : Nhóm này về cơ bản chứa không gian được thuê và ảo (dành riêng) và sẽ giữ những vật thể còn sót lại sau khi thu gom rác từ Thế hệ trẻ.

  • Tenured Space: Nhóm bộ nhớ này chứa các đối tượng tồn tại sau nhiều lần thu gom rác có nghĩa là đối tượng sống sót sau khi thu gom rác từ không gian Survivor.

Tạo vĩnh viễn: Nhóm bộ nhớ như tên này cũng cho biết chứa thông tin mô tả và siêu dữ liệu lớp cố định để không gian PermGen luôn dành riêng cho các lớp và những thứ được gắn với các lớp ví dụ như các thành viên tĩnh.

Cập nhật Java8: PermGen được thay thế bằng Metaspace rất giống nhau.
Sự khác biệt chính là Metaspace kích thước lại động tức là, Nó có thể mở rộng khi chạy.
Không gian Metaspace của Java: không giới hạn (mặc định)

Bộ đệm mã (ảo hoặc dành riêng): Nếu bạn đang sử dụng HotSpot Java VM, vùng này bao gồm vùng bộ đệm mã chứa bộ nhớ sẽ được sử dụng để biên dịch và lưu trữ mã gốc.

nhập mô tả hình ảnh ở đây

Phép lịch sự


@Premraj nghĩa là gì Metaspace kích thước lại một cách linh hoạt tức là, Nó có thể mở rộng khi chạy. ? Sự khác biệt duy nhất mà theo mặc định nó không có biên giới?
gstackoverflow

1
xuất sắc..may tôi biết khu vực phương thức, nativestack và pool hằng số nằm trong hình này? và những gì họ giữ cho phù hợp?

nếu bộ đệm mã được sử dụng cho mã phương thức gốc, thì ngăn xếp phương thức riêng (mỗi luồng sẽ có một) sẽ có gì?

49

Thế hệ trẻ là gì?

Các thế hệ trẻ là nơi mà tất cả các đối tượng mới được phân bổ và niên. Khi thế hệ trẻ lấp đầy, điều này gây ra một bộ sưu tập rác nhỏ. Một thế hệ trẻ đầy những đồ vật chết được thu thập rất nhanh. Một số đối tượng sống sót đã già và cuối cùng chuyển sang thế hệ cũ.

Thế hệ cũ là gì?

Các thế hệ cũ được sử dụng để lưu trữ đối tượng lâu còn sống sót. Thông thường, một ngưỡng được đặt cho đối tượng thế hệ trẻ và khi tuổi đó được đáp ứng, đối tượng sẽ được chuyển sang thế hệ cũ. Cuối cùng, thế hệ cũ cần phải được thu thập. Sự kiện này được gọi là bộ sưu tập rác lớn

Thế hệ vĩnh viễn là gì?

Thế hệ thường trực chứa siêu dữ liệu theo yêu cầu của JVM để mô tả các lớp và phương thức được sử dụng trong ứng dụng. Thế hệ vĩnh viễn được JVM cư trú trong thời gian chạy dựa trên các lớp được ứng dụng sử dụng.

PermGen đã được thay thế bằng Metaspace kể từ khi phát hành Java 8.

Các tham số PermSize & MaxPermSize sẽ bị bỏ qua ngay bây giờ

Làm thế nào để ba thế hệ tương tác / liên quan với nhau?

nhập mô tả hình ảnh ở đây

Nguồn hình ảnh & bài viết hướng dẫn kỹ thuật oracle: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

" Quy trình thu gom rác chung " trong bài viết trên giải thích các tương tác giữa chúng với nhiều sơ đồ.

Hãy xem sơ đồ tóm tắt:

nhập mô tả hình ảnh ở đây


xuất sắc..may tôi biết khu vực phương thức, nativestack và pool hằng số nằm trong hình này? và những gì họ giữ cho phù hợp?

tham khảo docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html để biết thêm chi tiết. Vùng phương thức được tạo khi khởi động máy ảo. Mặc dù khu vực phương thức là một phần logic của heap, các triển khai đơn giản có thể chọn không thu gom rác hoặc nén nó. Mỗi nhóm hằng số thời gian chạy được phân bổ từ khu vực phương thức của Máy ảo Java
Ravindra babu

bạn có chắc chắn ... tôi đã đọc rằng đó là một phần của không gian permgen (không phải là đống)? journaldev.com/2856/ từ

Tài liệu của Oracle là xác thực hơn
Ravindra babu

Là ngưỡng được đặt cho đối tượng thế hệ trẻ theo đơn vị thời gian (ví dụ: ms)? hoặc vòng GC?
Rất khách quan

16

Máy ảo Java được tổ chức thành ba thế hệ: một thế hệ trẻ, một thế hệ cũ và một thế hệ vĩnh viễn. Hầu hết các đối tượng ban đầu được phân bổ trong thế hệ trẻ. Thế hệ cũ chứa các đối tượng đã sống sót qua một số bộ sưu tập thế hệ trẻ, cũng như một số đối tượng lớn có thể được phân bổ trực tiếp trong thế hệ cũ. Thế hệ cố định chứa các đối tượng mà JVM thấy thuận tiện để quản lý trình thu gom rác, chẳng hạn như các đối tượng mô tả các lớp và phương thức, cũng như chính các lớp và phương thức.


1

Bộ nhớ trong SunVMSpot JVM được tổ chức thành ba thế hệ: thế hệ trẻ, thế hệ cũ và thế hệ vĩnh viễn.

  • Thế hệ trẻ: các đối tượng mới được tạo ra được phân bổ cho thế hệ trẻ.
  • Thế hệ cũ: Nếu đối tượng mới yêu cầu không gian heap lớn hơn, nó sẽ được phân bổ trực tiếp vào gen cũ. Ngoài ra các đối tượng đã sống sót qua một vài chu kỳ GC được thăng cấp lên gen cũ, tức là các đối tượng sống lâu trong nhà cũ.
  • Tạo vĩnh viễn: Thế hệ vĩnh viễn chứa các đối tượng mà JVM thấy thuận tiện để quản lý trình thu gom rác, chẳng hạn như các đối tượng mô tả các lớp và phương thức, cũng như chính các lớp và phương thức.

FYI: Gen vĩnh viễn không được coi là một phần của đống Java.

Làm thế nào để ba thế hệ tương tác / liên quan với nhau? Các đối tượng (trừ những đối tượng lớn) được phân bổ đầu tiên cho thế hệ trẻ. Nếu một đối tượng vẫn còn sống sau x không. trong các chu kỳ thu gom rác, nó được quảng bá đến thế hệ cũ / được thuê. Do đó, chúng ta có thể nói rằng gen trẻ chứa các đối tượng sống ngắn trong khi gen cũ chứa các đối tượng có tuổi thọ dài. Các gen vĩnh viễn không tương tác với hai thế hệ khác.

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.