27 #include "classfile/javaClasses.hpp"
28 #include "gc/shared/allocTracer.hpp"
29 #include "gc/shared/gcId.hpp"
30 #include "gc/shared/gcLocker.inline.hpp"
31 #include "gc/shared/genCollectedHeap.hpp"
32 #include "gc/shared/vmGCOperations.hpp"
33 #include "logging/log.hpp"
34 #include "memory/oopFactory.hpp"
35 #include "runtime/handles.inline.hpp"
36 #include "runtime/init.hpp"
37 #include "runtime/interfaceSupport.hpp"
38 #include "utilities/dtrace.hpp"
39 #include "utilities/macros.hpp"
40 #include "utilities/preserveException.hpp"
41 #if INCLUDE_ALL_GCS
42 #include "gc/g1/g1CollectedHeap.inline.hpp"
43 #include "gc/g1/g1Policy.hpp"
44 #endif // INCLUDE_ALL_GCS
45
46 VM_GC_Operation::~VM_GC_Operation() {
47 CollectedHeap* ch = Universe::heap();
48 ch->collector_policy()->set_all_soft_refs_clear(false);
49 }
50
51 // The same dtrace probe can't be inserted in two different files, so we
52 // have to call it here, so it's only in one file. Can't create new probes
53 // for the other file anymore. The dtrace probes have to remain stable.
54 void VM_GC_Operation::notify_gc_begin(bool full) {
55 HOTSPOT_GC_BEGIN(
56 full);
57 HS_DTRACE_WORKAROUND_TAIL_CALL_BUG();
58 }
59
60 void VM_GC_Operation::notify_gc_end() {
61 HOTSPOT_GC_END();
62 HS_DTRACE_WORKAROUND_TAIL_CALL_BUG();
63 }
64
65 // Allocations may fail in several threads at about the same time,
66 // resulting in multiple gc requests. We only want to do one of them.
67 // In case a GC locker is active and the need for a GC is already signaled,
68 // we want to skip this GC attempt altogether, without doing a futile
69 // safepoint operation.
70 bool VM_GC_Operation::skip_operation() const {
71 bool skip = (_gc_count_before != Universe::heap()->total_collections());
72 if (_full && skip) {
73 skip = (_full_gc_count_before != Universe::heap()->total_full_collections());
74 }
75 if (!skip && GCLocker::is_active_and_needs_gc()) {
76 skip = Universe::heap()->is_maximal_no_gc();
77 assert(!(skip && (_gc_cause == GCCause::_gc_locker)),
78 "GCLocker cannot be active when initiating GC");
79 }
80 return skip;
81 }
82
83 bool VM_GC_Operation::doit_prologue() {
84 assert(Thread::current()->is_Java_thread(), "just checking");
85 assert(((_gc_cause != GCCause::_no_gc) &&
86 (_gc_cause != GCCause::_no_cause_specified)), "Illegal GCCause");
87
88 // To be able to handle a GC the VM initialization needs to be completed.
89 if (!is_init_completed()) {
90 vm_exit_during_initialization(
91 err_msg("GC triggered before VM initialization completed. Try increasing "
92 "NewSize, current value " SIZE_FORMAT "%s.",
93 byte_size_in_proper_unit(NewSize),
94 proper_unit_for_byte_size(NewSize)));
95 }
96
108 return _prologue_succeeded;
109 }
110
111
112 void VM_GC_Operation::doit_epilogue() {
113 assert(Thread::current()->is_Java_thread(), "just checking");
114 if (Universe::has_reference_pending_list()) {
115 Heap_lock->notify_all();
116 }
117 Heap_lock->unlock();
118 }
119
120 bool VM_GC_HeapInspection::skip_operation() const {
121 return false;
122 }
123
124 bool VM_GC_HeapInspection::collect() {
125 if (GCLocker::is_active()) {
126 return false;
127 }
128 Universe::heap()->collect_as_vm_thread(GCCause::_heap_inspection);
129 return true;
130 }
131
132 void VM_GC_HeapInspection::doit() {
133 HandleMark hm;
134 Universe::heap()->ensure_parsability(false); // must happen, even if collection does
135 // not happen (e.g. due to GCLocker)
136 // or _full_gc being false
137 if (_full_gc) {
138 if (!collect()) {
139 // The collection attempt was skipped because the gc locker is held.
140 // The following dump may then be a tad misleading to someone expecting
141 // only live objects to show up in the dump (see CR 6944195). Just issue
142 // a suitable warning in that case and do not attempt to do a collection.
143 // The latter is a subtle point, because even a failed attempt
144 // to GC will, in fact, induce one in the future, which we
145 // probably want to avoid in this case because the GC that we may
146 // be about to attempt holds value for us only
147 // if it happens now and not if it happens in the eventual
148 // future.
149 log_warning(gc)("GC locker is held; pre-dump GC was skipped");
150 }
151 }
152 HeapInspection inspect(_csv_format, _print_help, _print_class_stats,
153 _columns);
154 inspect.heap_inspection(_out);
203 GCCauseSetter x(g1h, _gc_cause);
204
205 // At this point we are supposed to start a concurrent cycle. We
206 // will do so if one is not already in progress.
207 bool should_start = g1h->g1_policy()->force_initial_mark_if_outside_cycle(_gc_cause);
208
209 if (should_start) {
210 double pause_target = g1h->g1_policy()->max_pause_time_ms();
211 g1h->do_collection_pause_at_safepoint(pause_target);
212 }
213 return true;
214 }
215 #endif
216
217 return false;
218 }
219
220 void VM_CollectForMetadataAllocation::doit() {
221 SvcGCMarker sgcm(SvcGCMarker::FULL);
222
223 CollectedHeap* heap = Universe::heap();
224 GCCauseSetter gccs(heap, _gc_cause);
225
226 // Check again if the space is available. Another thread
227 // may have similarly failed a metadata allocation and induced
228 // a GC that freed space for the allocation.
229 if (!MetadataAllocationFailALot) {
230 _result = _loader_data->metaspace_non_null()->allocate(_size, _mdtype);
231 if (_result != NULL) {
232 return;
233 }
234 }
235
236 if (initiate_concurrent_GC()) {
237 // For CMS and G1 expand since the collection is going to be concurrent.
238 _result = _loader_data->metaspace_non_null()->expand_and_allocate(_size, _mdtype);
239 if (_result != NULL) {
240 return;
241 }
242
243 log_debug(gc)("%s full GC for Metaspace", UseConcMarkSweepGC ? "CMS" : "G1");
|
27 #include "classfile/javaClasses.hpp"
28 #include "gc/shared/allocTracer.hpp"
29 #include "gc/shared/gcId.hpp"
30 #include "gc/shared/gcLocker.inline.hpp"
31 #include "gc/shared/genCollectedHeap.hpp"
32 #include "gc/shared/vmGCOperations.hpp"
33 #include "logging/log.hpp"
34 #include "memory/oopFactory.hpp"
35 #include "runtime/handles.inline.hpp"
36 #include "runtime/init.hpp"
37 #include "runtime/interfaceSupport.hpp"
38 #include "utilities/dtrace.hpp"
39 #include "utilities/macros.hpp"
40 #include "utilities/preserveException.hpp"
41 #if INCLUDE_ALL_GCS
42 #include "gc/g1/g1CollectedHeap.inline.hpp"
43 #include "gc/g1/g1Policy.hpp"
44 #endif // INCLUDE_ALL_GCS
45
46 VM_GC_Operation::~VM_GC_Operation() {
47 CollectedHeap* ch = GC::gc()->heap();
48 ch->collector_policy()->set_all_soft_refs_clear(false);
49 }
50
51 // The same dtrace probe can't be inserted in two different files, so we
52 // have to call it here, so it's only in one file. Can't create new probes
53 // for the other file anymore. The dtrace probes have to remain stable.
54 void VM_GC_Operation::notify_gc_begin(bool full) {
55 HOTSPOT_GC_BEGIN(
56 full);
57 HS_DTRACE_WORKAROUND_TAIL_CALL_BUG();
58 }
59
60 void VM_GC_Operation::notify_gc_end() {
61 HOTSPOT_GC_END();
62 HS_DTRACE_WORKAROUND_TAIL_CALL_BUG();
63 }
64
65 // Allocations may fail in several threads at about the same time,
66 // resulting in multiple gc requests. We only want to do one of them.
67 // In case a GC locker is active and the need for a GC is already signaled,
68 // we want to skip this GC attempt altogether, without doing a futile
69 // safepoint operation.
70 bool VM_GC_Operation::skip_operation() const {
71 bool skip = (_gc_count_before != GC::gc()->heap()->total_collections());
72 if (_full && skip) {
73 skip = (_full_gc_count_before != GC::gc()->heap()->total_full_collections());
74 }
75 if (!skip && GCLocker::is_active_and_needs_gc()) {
76 skip = GC::gc()->heap()->is_maximal_no_gc();
77 assert(!(skip && (_gc_cause == GCCause::_gc_locker)),
78 "GCLocker cannot be active when initiating GC");
79 }
80 return skip;
81 }
82
83 bool VM_GC_Operation::doit_prologue() {
84 assert(Thread::current()->is_Java_thread(), "just checking");
85 assert(((_gc_cause != GCCause::_no_gc) &&
86 (_gc_cause != GCCause::_no_cause_specified)), "Illegal GCCause");
87
88 // To be able to handle a GC the VM initialization needs to be completed.
89 if (!is_init_completed()) {
90 vm_exit_during_initialization(
91 err_msg("GC triggered before VM initialization completed. Try increasing "
92 "NewSize, current value " SIZE_FORMAT "%s.",
93 byte_size_in_proper_unit(NewSize),
94 proper_unit_for_byte_size(NewSize)));
95 }
96
108 return _prologue_succeeded;
109 }
110
111
112 void VM_GC_Operation::doit_epilogue() {
113 assert(Thread::current()->is_Java_thread(), "just checking");
114 if (Universe::has_reference_pending_list()) {
115 Heap_lock->notify_all();
116 }
117 Heap_lock->unlock();
118 }
119
120 bool VM_GC_HeapInspection::skip_operation() const {
121 return false;
122 }
123
124 bool VM_GC_HeapInspection::collect() {
125 if (GCLocker::is_active()) {
126 return false;
127 }
128 GC::gc()->heap()->collect_as_vm_thread(GCCause::_heap_inspection);
129 return true;
130 }
131
132 void VM_GC_HeapInspection::doit() {
133 HandleMark hm;
134 GC::gc()->heap()->ensure_parsability(false); // must happen, even if collection does
135 // not happen (e.g. due to GCLocker)
136 // or _full_gc being false
137 if (_full_gc) {
138 if (!collect()) {
139 // The collection attempt was skipped because the gc locker is held.
140 // The following dump may then be a tad misleading to someone expecting
141 // only live objects to show up in the dump (see CR 6944195). Just issue
142 // a suitable warning in that case and do not attempt to do a collection.
143 // The latter is a subtle point, because even a failed attempt
144 // to GC will, in fact, induce one in the future, which we
145 // probably want to avoid in this case because the GC that we may
146 // be about to attempt holds value for us only
147 // if it happens now and not if it happens in the eventual
148 // future.
149 log_warning(gc)("GC locker is held; pre-dump GC was skipped");
150 }
151 }
152 HeapInspection inspect(_csv_format, _print_help, _print_class_stats,
153 _columns);
154 inspect.heap_inspection(_out);
203 GCCauseSetter x(g1h, _gc_cause);
204
205 // At this point we are supposed to start a concurrent cycle. We
206 // will do so if one is not already in progress.
207 bool should_start = g1h->g1_policy()->force_initial_mark_if_outside_cycle(_gc_cause);
208
209 if (should_start) {
210 double pause_target = g1h->g1_policy()->max_pause_time_ms();
211 g1h->do_collection_pause_at_safepoint(pause_target);
212 }
213 return true;
214 }
215 #endif
216
217 return false;
218 }
219
220 void VM_CollectForMetadataAllocation::doit() {
221 SvcGCMarker sgcm(SvcGCMarker::FULL);
222
223 CollectedHeap* heap = GC::gc()->heap();
224 GCCauseSetter gccs(heap, _gc_cause);
225
226 // Check again if the space is available. Another thread
227 // may have similarly failed a metadata allocation and induced
228 // a GC that freed space for the allocation.
229 if (!MetadataAllocationFailALot) {
230 _result = _loader_data->metaspace_non_null()->allocate(_size, _mdtype);
231 if (_result != NULL) {
232 return;
233 }
234 }
235
236 if (initiate_concurrent_GC()) {
237 // For CMS and G1 expand since the collection is going to be concurrent.
238 _result = _loader_data->metaspace_non_null()->expand_and_allocate(_size, _mdtype);
239 if (_result != NULL) {
240 return;
241 }
242
243 log_debug(gc)("%s full GC for Metaspace", UseConcMarkSweepGC ? "CMS" : "G1");
|