29 #include "gc/shared/gcCause.hpp" |
29 #include "gc/shared/gcCause.hpp" |
30 #include "gc/shared/gcName.hpp" |
30 #include "gc/shared/gcName.hpp" |
31 #include "gc/shared/gcTrace.hpp" |
31 #include "gc/shared/gcTrace.hpp" |
32 #include "gc/shared/gcWhen.hpp" |
32 #include "gc/shared/gcWhen.hpp" |
33 #include "jfr/leakprofiler/leakProfiler.hpp" |
33 #include "jfr/leakprofiler/leakProfiler.hpp" |
34 #include "jfr/recorder/checkpoint/jfrCheckpointManager.hpp" |
34 #include "jfr/recorder/checkpoint/jfrCheckpointWriter.hpp" |
35 #include "jfr/recorder/checkpoint/types/jfrType.hpp" |
35 #include "jfr/recorder/checkpoint/types/jfrType.hpp" |
36 #include "jfr/recorder/jfrRecorder.hpp" |
36 #include "jfr/recorder/jfrRecorder.hpp" |
37 #include "jfr/recorder/checkpoint/types/jfrThreadGroup.hpp" |
37 #include "jfr/recorder/checkpoint/types/jfrThreadGroup.hpp" |
38 #include "jfr/recorder/checkpoint/types/jfrThreadState.hpp" |
38 #include "jfr/recorder/checkpoint/types/jfrThreadState.hpp" |
39 #include "jfr/recorder/checkpoint/types/jfrTypeSet.hpp" |
39 #include "jfr/support/jfrThreadLocal.hpp" |
|
40 #include "jfr/writers/jfrJavaEventWriter.hpp" |
40 #include "jfr/utilities/jfrThreadIterator.hpp" |
41 #include "jfr/utilities/jfrThreadIterator.hpp" |
41 #include "memory/metaspaceGCThresholdUpdater.hpp" |
42 #include "memory/metaspaceGCThresholdUpdater.hpp" |
42 #include "memory/referenceType.hpp" |
43 #include "memory/referenceType.hpp" |
43 #include "memory/universe.hpp" |
44 #include "memory/universe.hpp" |
44 #include "oops/compressedOops.hpp" |
45 #include "oops/compressedOops.hpp" |
263 for (u4 i = 0; i < nof_entries; ++i) { |
264 for (u4 i = 0; i < nof_entries; ++i) { |
264 writer.write_key(i); |
265 writer.write_key(i); |
265 writer.write(VM_Operation::name(VM_Operation::VMOp_Type(i))); |
266 writer.write(VM_Operation::name(VM_Operation::VMOp_Type(i))); |
266 } |
267 } |
267 } |
268 } |
268 |
|
269 class TypeSetSerialization { |
|
270 private: |
|
271 JfrCheckpointWriter* _leakp_writer; |
|
272 size_t _elements; |
|
273 public: |
|
274 TypeSetSerialization(JfrCheckpointWriter* leakp_writer = NULL) : |
|
275 _leakp_writer(leakp_writer), _elements(0) {} |
|
276 void write(JfrCheckpointWriter& writer, bool class_unload, bool flushpoint) { |
|
277 assert_locked_or_safepoint(ClassLoaderDataGraph_lock); |
|
278 assert_locked_or_safepoint(Module_lock); |
|
279 _elements = JfrTypeSet::serialize(&writer, _leakp_writer, class_unload, flushpoint); |
|
280 } |
|
281 size_t elements() const { |
|
282 return _elements; |
|
283 } |
|
284 }; |
|
285 |
|
286 void ClassUnloadTypeSet::serialize(JfrCheckpointWriter& writer) { |
|
287 TypeSetSerialization type_set; |
|
288 type_set.write(writer, true, false); |
|
289 }; |
|
290 |
|
291 void FlushTypeSet::serialize(JfrCheckpointWriter& writer) { |
|
292 assert(!SafepointSynchronize::is_at_safepoint(), "invariant"); |
|
293 MutexLocker cld_lock(ClassLoaderDataGraph_lock); |
|
294 MutexLocker module_lock(Module_lock); |
|
295 TypeSetSerialization type_set; |
|
296 type_set.write(writer, false, true); |
|
297 _elements = type_set.elements(); |
|
298 } |
|
299 |
|
300 size_t FlushTypeSet::elements() const { |
|
301 return _elements; |
|
302 } |
|
303 |
|
304 TypeSet::TypeSet(JfrCheckpointWriter* leakp_writer) : _leakp_writer(leakp_writer) {} |
|
305 |
|
306 void TypeSet::clear() { |
|
307 JfrTypeSet::clear(); |
|
308 } |
|
309 |
|
310 void TypeSet::serialize(JfrCheckpointWriter& writer) { |
|
311 assert(!SafepointSynchronize::is_at_safepoint(), "invariant"); |
|
312 MutexLocker cld_lock(ClassLoaderDataGraph_lock); |
|
313 MutexLocker module_lock(Module_lock); |
|
314 TypeSetSerialization type_set(_leakp_writer); |
|
315 type_set.write(writer, false, false); |
|
316 }; |
|
317 |
269 |
318 void ThreadStateConstant::serialize(JfrCheckpointWriter& writer) { |
270 void ThreadStateConstant::serialize(JfrCheckpointWriter& writer) { |
319 JfrThreadState::serialize(writer); |
271 JfrThreadState::serialize(writer); |
320 } |
272 } |
321 |
273 |