Có vẻ như nó có thể điều chỉnh được, nhưng không phải vậy. Bộ thu thập quét đánh dấu đồng thời treo trên thực hiện mặc định của heap là must_clear_all_soft_refs()
mà dường như chỉ là true
khi thực hiện _last_ditch_collection
.
bool GenCollectedHeap::must_clear_all_soft_refs() {
return _gc_cause == GCCause::_last_ditch_collection;
}
Trong khi xử lý bình thường của việc phân bổ không có ba cuộc gọi liên tiếp đến phương pháp của đống do_collect
, trong CollectorPolicy.cpp
HeapWord* GenCollectorPolicy::satisfy_failed_allocation(size_t size,
bool is_tlab) {
Những cố gắng để thu thập, cố gắng phân bổ lại, cố gắng mở rộng đống nếu thất bại , và sau đó như là một nỗ lực cuối cùng, cố gắng thu thập các tài liệu tham khảo mềm.
Các bình luận về bộ sưu tập cuối cùng là khá nói (và là người duy nhất gây nên thanh toán bù trừ refs mềm)
// If we reach this point, we're really out of memory. Try every trick
// we can to reclaim memory. Force collection of soft references. Force
// a complete compaction of the heap. Any additional methods for finding
// free memory should be here, especially if they are expensive. If this
// attempt fails, an OOM exception will be thrown.
{
IntFlagSetting flag_change(MarkSweepAlwaysCompactCount, 1); // Make sure the heap is fully compacted
gch->do_collection(true /* full */,
true /* clear_all_soft_refs */,
size /* size */,
is_tlab /* is_tlab */,
number_of_generations() - 1 /* max_level */);
}
--- Chỉnh sửa để đáp ứng với sự thật hiển nhiên, tôi đã mô tả tài liệu tham khảo yếu, những người không mềm ---
Trong thực tế, tôi sẽ tưởng tượng rằng SoftReferences chỉ "không" được theo sau khi JVM được gọi để thu thập rác để phản hồi lại khi chúng cố gắng tránh OutOfMemoryError
.
Đối với SoftReference
s để tương thích với tất cả bốn bộ thu gom rác Java 1.4 và với bộ thu G1 mới, quyết định phải nằm chỉ với xác định khả năng kết nối. Vào thời điểm gặt hái và nén chặt xảy ra, đã quá muộn để quyết định liệu một vật thể có thể tiếp cận được hay không.Điều này cho thấy (nhưng không yêu cầu) rằng một bộ sưu tập "bối cảnh" tồn tại mà xác định khả năng tiếp cận dựa trên sự sẵn có bộ nhớ miễn phí trong heap. Một bối cảnh như vậy sẽ phải chỉ ra không theo dõi SoftReference
s trước khi cố gắng theo dõi chúng.
Kể từ khi OutOfMemoryError
thu gom rác tránh được lập lịch đặc biệt theo cách thu thập đầy đủ, tạm dừng, sẽ không khó tưởng tượng được trường hợp người quản lý heap đặt cờ "không theo dõi SoftReference
" trước bộ sưu tập xảy ra.
--- Ok, vì vậy tôi quyết định rằng một "phải làm việc theo cách này" trả lời chỉ là không đủ tốt ---
Từ mã nguồn src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp (nổi bật là của tôi)
Các hoạt động để thực sự "làm" thu gom rác thải:
170 void VM_GenCollectFullConcurrent::doit() {
Chúng tôi tốt hơn là một chủ đề VM, nếu không một luồng "chương trình" là thu gom rác!
171 assert(Thread::current()->is_VM_thread(), "Should be VM thread");
Chúng tôi là một nhà sưu tập đồng thời, vì vậy chúng tôi sẽ được lên lịch đồng thời tốt hơn!
172 assert(GCLockerInvokesConcurrent || ExplicitGCInvokesConcurrent, "Unexpected");
173
Lấy đống (có đối tượng GCCause trong đó).
174 GenCollectedHeap* gch = GenCollectedHeap::heap();
Hãy kiểm tra để xem liệu chúng ta cần một tiền cảnh "trẻ" bộ sưu tập
175 if (_gc_count_before == gch->total_collections()) {
176 // The "full" of do_full_collection call below "forces"
177 // a collection; the second arg, 0, below ensures that
178 // only the young gen is collected. XXX In the future,
179 // we'll probably need to have something in this interface
180 // to say do this only if we are sure we will not bail
181 // out to a full collection in this attempt, but that's
182 // for the future.
Là những chủ đề chương trình không can thiệp với đống?
183 assert(SafepointSynchronize::is_at_safepoint(),
184 "We can only be executing this arm of if at a safepoint");
Lấy nguyên nhân thu gom rác (lý do cho bộ sưu tập này) từ đống.
185 GCCauseSetter gccs(gch, _gc_cause);
Làm một bộ sưu tập đầy đủ các không gian trẻ
Lưu ý rằng đèo mình về giá trị của must_clear_all_soft_refs của đống cờ nào trong một kịch bản OutOfMemory phải được thiết lập là true, và trong cả hai trường hợp chỉ đạo các "do_full_collection" để không làm theo các tài liệu tham khảo mềm
186 gch->do_full_collection(gch->must_clear_all_soft_refs(),
187 0 /* collect only youngest gen */);
các _gc_cause là một enum, đó là (phỏng đoán đây) thiết lập để _allocation_failure
trong nỗ lực đầu tiên tại tránh OutOfMemoryError
và _last_ditch_collection
sau thất bại (để cố gắng thu thập rác thoáng qua)
Một cái nhìn nhanh chóng trong memory "heap" module cho thấy rằng trong do_full_collection
trong đó kêu gọi do_collection
tài liệu tham khảo mềm bị xóa một cách rõ ràng (theo "đúng "điều kiện) với dòng
480 ClearedAllSoftRefs casr(do_clear_all_soft_refs, collector_policy());
--- Original post sau cho những ai muốn tìm hiểu về tài liệu tham khảo yếu ---
Trong Mark và Sweep thuật toán, tài liệu tham khảo mềm là không phải tiếp theo từ chuỗi Chính (và do đó không được đánh dấu trừ khi một nhánh khác có thể tiếp cận nó thông qua các tham chiếu không phải là phần mềm.
Trong thuật toán sao chép, tham chiếu mềm đối tượng trỏ đến là không được sao chép 01 () (trừ khi chúng được tiếp cận bằng tham chiếu không mềm khác).
Về cơ bản, khi theo dõi web tham chiếu từ chuỗi thực thi "chính", các tham chiếu mềm là không được theo dõi. Điều này cho phép các đối tượng của họ được thu gom rác như thể họ không có tài liệu tham khảo trỏ đến chúng.
Điều quan trọng cần lưu ý là các tham chiếu mềm gần như là không bao giờ được sử dụng riêng biệt. Chúng thường được sử dụng trong các đối tượng trong đó thiết kế có nhiều tham chiếu đến đối tượng, nhưng chỉ cần xóa một tham chiếu để kích hoạt thu gom rác (để dễ duy trì vùng chứa hoặc chạy hiệu suất thời gian không cần tìm kiếm tài liệu tham khảo đắt tiền) .
có liên quan? [Cách điểm phát sóng quyết định Clear SoftReferences] (http://jeremymanson.blogspot.com/2009/07/how-hotspot-decide-to-clear_07.html) –
@MiserableVariable Có, khá liên quan, mặc dù liên kết của bạn thiếu một chữ cái : http://jeremymanson.blogspot.com/2009/07/how-hotspot-decides-to-clear_07.html –
Nó không thiếu nó trước đó nhưng tôi đã phải hành động thông minh và tạo ra một liên kết từ nó .. Vì Tôi từ chối đọc tài liệu và muốn làm điều đó bằng cách dùng thử và lỗi một số nội dung thực sự bị xóa đôi khi. Ai quan tâm, miễn là nó trông đẹp, phải không? –