26 #include "classfile/systemDictionary.hpp"
27 #include "gc/shared/allocTracer.hpp"
28 #include "gc/shared/barrierSet.hpp"
29 #include "gc/shared/collectedHeap.hpp"
30 #include "gc/shared/collectedHeap.inline.hpp"
31 #include "gc/shared/gcLocker.inline.hpp"
32 #include "gc/shared/gcHeapSummary.hpp"
33 #include "gc/shared/gcTrace.hpp"
34 #include "gc/shared/gcTraceTime.inline.hpp"
35 #include "gc/shared/gcVMOperations.hpp"
36 #include "gc/shared/gcWhen.hpp"
37 #include "gc/shared/memAllocator.hpp"
38 #include "logging/log.hpp"
39 #include "memory/metaspace.hpp"
40 #include "memory/resourceArea.hpp"
41 #include "memory/universe.hpp"
42 #include "oops/instanceMirrorKlass.hpp"
43 #include "oops/oop.inline.hpp"
44 #include "runtime/handles.inline.hpp"
45 #include "runtime/init.hpp"
46 #include "runtime/thread.inline.hpp"
47 #include "runtime/threadSMR.hpp"
48 #include "runtime/vmThread.hpp"
49 #include "services/heapDumper.hpp"
50 #include "utilities/align.hpp"
51 #include "utilities/copy.hpp"
52
53 class ClassLoaderData;
54
55 size_t CollectedHeap::_filler_array_max_size = 0;
56
57 template <>
58 void EventLogBase<GCMessage>::print(outputStream* st, GCMessage& m) {
59 st->print_cr("GC heap %s", m.is_before ? "before" : "after");
60 st->print_raw(m);
61 }
62
63 void GCHeapLog::log_heap(CollectedHeap* heap, bool before) {
64 if (!should_log()) {
65 return;
66 }
67
68 double timestamp = fetch_timestamp();
69 MutexLocker ml(&_mutex, Mutex::_no_safepoint_check_flag);
70 int index = compute_log_index();
71 _records[index].thread = NULL; // Its the GC thread so it's not that interesting.
72 _records[index].timestamp = timestamp;
73 _records[index].data.is_before = before;
74 stringStream st(_records[index].data.buffer(), _records[index].data.size());
75
|
26 #include "classfile/systemDictionary.hpp"
27 #include "gc/shared/allocTracer.hpp"
28 #include "gc/shared/barrierSet.hpp"
29 #include "gc/shared/collectedHeap.hpp"
30 #include "gc/shared/collectedHeap.inline.hpp"
31 #include "gc/shared/gcLocker.inline.hpp"
32 #include "gc/shared/gcHeapSummary.hpp"
33 #include "gc/shared/gcTrace.hpp"
34 #include "gc/shared/gcTraceTime.inline.hpp"
35 #include "gc/shared/gcVMOperations.hpp"
36 #include "gc/shared/gcWhen.hpp"
37 #include "gc/shared/memAllocator.hpp"
38 #include "logging/log.hpp"
39 #include "memory/metaspace.hpp"
40 #include "memory/resourceArea.hpp"
41 #include "memory/universe.hpp"
42 #include "oops/instanceMirrorKlass.hpp"
43 #include "oops/oop.inline.hpp"
44 #include "runtime/handles.inline.hpp"
45 #include "runtime/init.hpp"
46 #include "runtime/mutexLocker.inline.hpp"
47 #include "runtime/thread.inline.hpp"
48 #include "runtime/threadSMR.hpp"
49 #include "runtime/vmThread.hpp"
50 #include "services/heapDumper.hpp"
51 #include "utilities/align.hpp"
52 #include "utilities/copy.hpp"
53 #include "utilities/events.inline.hpp"
54
55 class ClassLoaderData;
56
57 size_t CollectedHeap::_filler_array_max_size = 0;
58
59 class GCHeapLog : public EventLogBase<GCMessage> {
60 private:
61 void log_heap(CollectedHeap* heap, bool before);
62
63 public:
64 GCHeapLog() : EventLogBase<GCMessage>("GC Heap History", "gc") {}
65
66 void log_heap_before(CollectedHeap* heap) {
67 log_heap(heap, true);
68 }
69 void log_heap_after(CollectedHeap* heap) {
70 log_heap(heap, false);
71 }
72 };
73
74 template <>
75 void EventLogBase<GCMessage>::print(outputStream* st, GCMessage& m) {
76 st->print_cr("GC heap %s", m.is_before ? "before" : "after");
77 st->print_raw(m);
78 }
79
80 void GCHeapLog::log_heap(CollectedHeap* heap, bool before) {
81 if (!should_log()) {
82 return;
83 }
84
85 double timestamp = fetch_timestamp();
86 MutexLocker ml(&_mutex, Mutex::_no_safepoint_check_flag);
87 int index = compute_log_index();
88 _records[index].thread = NULL; // Its the GC thread so it's not that interesting.
89 _records[index].timestamp = timestamp;
90 _records[index].data.is_before = before;
91 stringStream st(_records[index].data.buffer(), _records[index].data.size());
92
|