2010-10-03 30 views
7

Tôi hiểu rằng thời gian thực hiện bởi YGC là tỷ lệ thuận với số lượng các đối tượng sống trong Eden. Tôi cũng hiểu rằng các đối tượng trực tiếp được tìm ra trong các bộ sưu tập chính như thế nào (Tất cả các đối tượng trong ngăn xếp chuỗi và các đối tượng tĩnh và các đối tượng khác có thể truy cập được từ các đối tượng đó quá mức.)cách các vật thể sống được tìm ra trong bộ sưu tập thế hệ trẻ?

Nhưng tôi không hiểu các đối tượng trực tiếp được tìm ra như thế nào bộ sưu tập thế hệ trẻ? nếu nó phân tích cú pháp ngăn xếp chủ đề, sau đó nó cần phải phân tích không gian eden + tenured đó không phải là trường hợp tôi nghĩ. Vậy làm thế nào để JVM tìm thấy các đối tượng trực tiếp trong eden và sao chép chúng trong không gian To Survivor?

Trả lời

7

cách các đối tượng trực tiếp được tìm ra trong bộ sưu tập thế hệ trẻ?

Mô tả cấp cao về cách bộ sưu tập thế hệ được triển khai trong HotSpot có thể được tìm thấy trong this article.

Nói chung một nhà sưu tập thế hệ đánh dấu thế hệ trẻ như sau (giả sử chúng tôi chỉ có hai thế hệ):

  1. Nó đánh dấu đối tượng trẻ và dấu vết tài liệu tham khảo bắt đầu với khung stack chủ đề và khung tĩnh. Khi nó tìm thấy một tham chiếu đến một đối tượng thế hệ cũ nó bỏ qua nó.
  2. Sau đó, nó lặp lại quá trình tham chiếu trong thế hệ cũ tham chiếu đến các đối tượng thế hệ trẻ. Bit khó hiểu là xác định các tham chiếu này trong thế hệ cũ mà không cần đánh dấu toàn bộ thế hệ cũ.
  3. Bây giờ chúng tôi đã đánh dấu tất cả các đối tượng trong thế hệ mới có thể truy cập được ... và phần còn lại (trong thế hệ đó) có thể được khai hoang.

Trong HotSpot, các đối tượng thế hệ cũ có chứa tham chiếu thế hệ trẻ được xác định bằng cách sử dụng "Bảng thẻ". Thế hệ cũ được chia thành các khu vực 512 byte, và mỗi khu vực có một "Thẻ". Nếu khu vực chứa bất kỳ cũ -> con trỏ thế hệ mới, một chút trong thẻ được thiết lập. Các đối tượng ở các vùng có tập bit thẻ sẽ được truy tìm trong bộ sưu tập thế hệ mới.

Điều khó khăn là duy trì bảng Thẻ dưới dạng tham chiếu không gian mới được ghi vào đối tượng thế hệ cũ. Trong HotSpot, điều này được thực hiện bằng cách sử dụng phần mềm ghi-rào cản đặt bit bẩn của Thẻ phù hợp bất cứ khi nào một tham chiếu không gian mới được ghi vào vùng bộ nhớ tương ứng với Thẻ. Khi bài viết được liên kết ghi chú, điều này làm cho việc thiết lập một trường tham chiếu trong một đối tượng đắt hơn, nhưng nó dường như đáng giá do thời gian được lưu lại bằng cách chỉ có thể thu thập các thế hệ mới hầu hết thời gian.

+0

Liên kết tốt, cảm ơn. – gkuzmin

+1

Một chút sửa lỗi kỹ thuật: bảng thẻ được cập nhật * vô điều kiện *, bất kể con trỏ mới có đề cập đến Thế hệ Mới hay không. Về cơ bản, ngữ nghĩa là một * cờ bẩn *. Ngoài ra, mặc dù một mục trong bảng thẻ là một byte đầy đủ, nó chỉ giữ một chút thông tin. Điều này là vì lợi ích của hiệu suất. –

+0

Thật vậy! http://psy-lob-saw.blogspot.com.au/2014/10/the-jvm-write-barrier-card-marking.html –

1

Tôi đang trích dẫn văn bản có liên quan từ article by Brian Goetz tại đây.

Tracing người thu gom rác, chẳng hạn như sao chép, đánh dấu quét, và đánh dấu nhỏ gọn, tất cả bắt đầu quét từ bộ rễ, tài liệu tham khảo traversing giữa các đối tượng, cho đến khi tất cả các đối tượng sống đã truy cập. Một bộ theo dõi thế hệ bộ thu bắt đầu từ bộ gốc, nhưng không đi qua các tham chiếu dẫn đến các đối tượng trong thế hệ cũ hơn, làm giảm kích thước của đồ thị đối tượng được truy tìm.

3

Để chỉ theo dõi thế hệ trẻ nhất, bộ thu gom rác quét cùng một bộ gốc (ngăn xếp và sổ đăng ký) và CSONG tất cả các thế hệ cũ (không thu thập) đã được sửa đổi từ lần quét thế hệ trẻ trước đó. Chỉ những đối tượng đã được sửa đổi mới có thể trỏ vào các đối tượng thế hệ trẻ, vì các đối tượng chưa sửa đổi không thể trỏ vào các đối tượng được tạo sau lần sửa đổi cuối cùng của chúng.

Vì vậy, phần khó khăn là, làm thế nào để GC biết các đối tượng nào đã được sửa đổi từ GC cuối cùng? Có một số kỹ thuật có thể được sử dụng, nhưng về cơ bản chúng đi xuống để theo dõi việc ghi vào các đối tượng thế hệ cũ. Điều này có thể được thực hiện bằng cách bẫy viết (viết các rào cản) hoặc chỉ theo dõi tất cả các mục tiêu ghi (viết bộ đệm, đánh dấu thẻ), tất cả đều bổ sung chi phí cho việc thực hiện chương trình trong khi GC không chạy (vì vậy nó không hiển thị dưới dạng thời gian tạm dừng GC, nhưng không hiển thị trong tổng thời gian đã trôi qua). Hỗ trợ phần cứng giúp rất nhiều, nếu nó có sẵn. Việc theo dõi không cần chính xác, miễn là mọi đối tượng thế hệ cũ được sửa đổi được quét (quét các đối tượng chưa sửa đổi là một sự lãng phí thời gian, nhưng sẽ không làm tổn thương gì cả).

Các vấn đề liên quan