author | mgronlun |
Wed, 30 Oct 2019 19:43:52 +0100 | |
changeset 58863 | c16ac7a2eba4 |
parent 58132 | caa25ab47aca |
permissions | -rw-r--r-- |
50113 | 1 |
/* |
54663
f03d5a093093
8074355: make MutexLocker smarter about non-JavaThreads
coleenp
parents:
50113
diff
changeset
|
2 |
* Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. |
50113 | 3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 |
* |
|
5 |
* This code is free software; you can redistribute it and/or modify it |
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
|
7 |
* published by the Free Software Foundation. |
|
8 |
* |
|
9 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
10 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
11 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
12 |
* version 2 for more details (a copy is included in the LICENSE file that |
|
13 |
* accompanied this code). |
|
14 |
* |
|
15 |
* You should have received a copy of the GNU General Public License version |
|
16 |
* 2 along with this work; if not, write to the Free Software Foundation, |
|
17 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
18 |
* |
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
20 |
* or visit www.oracle.com if you need additional information or have any |
|
21 |
* questions. |
|
22 |
* |
|
23 |
*/ |
|
24 |
||
25 |
#include "precompiled.hpp" |
|
26 |
#include "jfr/jfrEvents.hpp" |
|
27 |
#include "jfr/leakprofiler/chains/edgeStore.hpp" |
|
28 |
#include "jfr/leakprofiler/chains/objectSampleMarker.hpp" |
|
29 |
#include "jfr/leakprofiler/checkpoint/objectSampleCheckpoint.hpp" |
|
30 |
#include "jfr/leakprofiler/checkpoint/objectSampleWriter.hpp" |
|
31 |
#include "jfr/leakprofiler/leakProfiler.hpp" |
|
32 |
#include "jfr/leakprofiler/sampling/objectSample.hpp" |
|
33 |
#include "jfr/leakprofiler/sampling/objectSampler.hpp" |
|
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
34 |
#include "jfr/recorder/checkpoint/jfrCheckpointWriter.hpp" |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
35 |
#include "jfr/recorder/checkpoint/types/traceid/jfrTraceId.inline.hpp" |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
36 |
#include "jfr/recorder/service/jfrOptionSet.hpp" |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
37 |
#include "jfr/recorder/stacktrace/jfrStackTraceRepository.hpp" |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
38 |
#include "jfr/utilities/jfrHashtable.hpp" |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
39 |
#include "jfr/utilities/jfrTypes.hpp" |
58863 | 40 |
#include "runtime/mutexLocker.hpp" |
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
41 |
#include "runtime/safepoint.hpp" |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
42 |
#include "runtime/thread.hpp" |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
43 |
#include "utilities/growableArray.hpp" |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
44 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
45 |
static bool predicate(GrowableArray<traceid>* set, traceid id) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
46 |
assert(set != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
47 |
bool found = false; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
48 |
set->find_sorted<traceid, compare_traceid>(id, found); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
49 |
return found; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
50 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
51 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
52 |
static bool mutable_predicate(GrowableArray<traceid>* set, traceid id) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
53 |
assert(set != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
54 |
bool found = false; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
55 |
const int location = set->find_sorted<traceid, compare_traceid>(id, found); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
56 |
if (!found) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
57 |
set->insert_before(location, id); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
58 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
59 |
return found; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
60 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
61 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
62 |
static bool add(GrowableArray<traceid>* set, traceid id) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
63 |
assert(set != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
64 |
return mutable_predicate(set, id); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
65 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
66 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
67 |
const int initial_array_size = 64; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
68 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
69 |
template <typename T> |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
70 |
static GrowableArray<T>* c_heap_allocate_array(int size = initial_array_size) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
71 |
return new (ResourceObj::C_HEAP, mtTracing) GrowableArray<T>(size, true, mtTracing); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
72 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
73 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
74 |
static GrowableArray<traceid>* unloaded_thread_id_set = NULL; |
50113 | 75 |
|
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
76 |
class ThreadIdExclusiveAccess : public StackObj { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
77 |
private: |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
78 |
static Semaphore _mutex_semaphore; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
79 |
public: |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
80 |
ThreadIdExclusiveAccess() { _mutex_semaphore.wait(); } |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
81 |
~ThreadIdExclusiveAccess() { _mutex_semaphore.signal(); } |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
82 |
}; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
83 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
84 |
Semaphore ThreadIdExclusiveAccess::_mutex_semaphore(1); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
85 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
86 |
static bool has_thread_exited(traceid tid) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
87 |
assert(tid != 0, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
88 |
return unloaded_thread_id_set != NULL && predicate(unloaded_thread_id_set, tid); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
89 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
90 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
91 |
static void add_to_unloaded_thread_set(traceid tid) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
92 |
ThreadIdExclusiveAccess lock; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
93 |
if (unloaded_thread_id_set == NULL) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
94 |
unloaded_thread_id_set = c_heap_allocate_array<traceid>(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
95 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
96 |
add(unloaded_thread_id_set, tid); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
97 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
98 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
99 |
void ObjectSampleCheckpoint::on_thread_exit(JavaThread* jt) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
100 |
assert(jt != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
101 |
if (LeakProfiler::is_running()) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
102 |
add_to_unloaded_thread_set(jt->jfr_thread_local()->thread_id()); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
103 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
104 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
105 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
106 |
// Track the set of unloaded klasses during a chunk / epoch. |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
107 |
// Methods in stacktraces belonging to unloaded klasses must not be accessed. |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
108 |
static GrowableArray<traceid>* unloaded_klass_set = NULL; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
109 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
110 |
static void add_to_unloaded_klass_set(traceid klass_id) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
111 |
if (unloaded_klass_set == NULL) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
112 |
unloaded_klass_set = c_heap_allocate_array<traceid>(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
113 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
114 |
unloaded_klass_set->append(klass_id); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
115 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
116 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
117 |
static void sort_unloaded_klass_set() { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
118 |
if (unloaded_klass_set != NULL && unloaded_klass_set->length() > 1) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
119 |
unloaded_klass_set->sort(sort_traceid); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
120 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
121 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
122 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
123 |
void ObjectSampleCheckpoint::on_klass_unload(const Klass* k) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
124 |
assert(k != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
125 |
add_to_unloaded_klass_set(TRACE_ID(k)); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
126 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
127 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
128 |
template <typename Processor> |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
129 |
static void do_samples(ObjectSample* sample, const ObjectSample* end, Processor& processor) { |
50113 | 130 |
assert(sample != NULL, "invariant"); |
131 |
while (sample != end) { |
|
132 |
processor.sample_do(sample); |
|
133 |
sample = sample->next(); |
|
134 |
} |
|
135 |
} |
|
136 |
||
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
137 |
template <typename Processor> |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
138 |
static void iterate_samples(Processor& processor, bool all = false) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
139 |
ObjectSampler* const sampler = ObjectSampler::sampler(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
140 |
assert(sampler != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
141 |
ObjectSample* const last = sampler->last(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
142 |
assert(last != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
143 |
do_samples(last, all ? NULL : sampler->last_resolved(), processor); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
144 |
} |
50113 | 145 |
|
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
146 |
class SampleMarker { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
147 |
private: |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
148 |
ObjectSampleMarker& _marker; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
149 |
jlong _last_sweep; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
150 |
int _count; |
50113 | 151 |
public: |
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
152 |
SampleMarker(ObjectSampleMarker& marker, jlong last_sweep) : _marker(marker), _last_sweep(last_sweep), _count(0) {} |
50113 | 153 |
void sample_do(ObjectSample* sample) { |
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
154 |
if (sample->is_alive_and_older_than(_last_sweep)) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
155 |
_marker.mark(sample->object()); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
156 |
++_count; |
50113 | 157 |
} |
158 |
} |
|
159 |
int count() const { |
|
160 |
return _count; |
|
161 |
} |
|
162 |
}; |
|
163 |
||
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
164 |
int ObjectSampleCheckpoint::save_mark_words(const ObjectSampler* sampler, ObjectSampleMarker& marker, bool emit_all) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
165 |
assert(sampler != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
166 |
if (sampler->last() == NULL) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
167 |
return 0; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
168 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
169 |
SampleMarker sample_marker(marker, emit_all ? max_jlong : sampler->last_sweep().value()); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
170 |
iterate_samples(sample_marker, true); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
171 |
return sample_marker.count(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
172 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
173 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
174 |
class BlobCache { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
175 |
typedef HashTableHost<JfrBlobHandle, traceid, JfrHashtableEntry, BlobCache> BlobTable; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
176 |
typedef BlobTable::HashEntry BlobEntry; |
50113 | 177 |
private: |
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
178 |
BlobTable _table; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
179 |
traceid _lookup_id; |
50113 | 180 |
public: |
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
181 |
BlobCache(size_t size) : _table(this, size), _lookup_id(0) {} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
182 |
JfrBlobHandle get(const ObjectSample* sample); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
183 |
void put(const ObjectSample* sample, const JfrBlobHandle& blob); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
184 |
// Hash table callbacks |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
185 |
void on_link(const BlobEntry* entry) const; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
186 |
bool on_equals(uintptr_t hash, const BlobEntry* entry) const; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
187 |
void on_unlink(BlobEntry* entry) const; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
188 |
}; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
189 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
190 |
JfrBlobHandle BlobCache::get(const ObjectSample* sample) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
191 |
assert(sample != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
192 |
_lookup_id = sample->stack_trace_id(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
193 |
assert(_lookup_id != 0, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
194 |
BlobEntry* const entry = _table.lookup_only(sample->stack_trace_hash()); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
195 |
return entry != NULL ? entry->literal() : JfrBlobHandle(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
196 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
197 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
198 |
void BlobCache::put(const ObjectSample* sample, const JfrBlobHandle& blob) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
199 |
assert(sample != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
200 |
assert(_table.lookup_only(sample->stack_trace_hash()) == NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
201 |
_lookup_id = sample->stack_trace_id(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
202 |
assert(_lookup_id != 0, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
203 |
_table.put(sample->stack_trace_hash(), blob); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
204 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
205 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
206 |
inline void BlobCache::on_link(const BlobEntry* entry) const { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
207 |
assert(entry != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
208 |
assert(entry->id() == 0, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
209 |
entry->set_id(_lookup_id); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
210 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
211 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
212 |
inline bool BlobCache::on_equals(uintptr_t hash, const BlobEntry* entry) const { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
213 |
assert(entry != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
214 |
assert(entry->hash() == hash, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
215 |
return entry->id() == _lookup_id; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
216 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
217 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
218 |
inline void BlobCache::on_unlink(BlobEntry* entry) const { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
219 |
assert(entry != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
220 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
221 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
222 |
static GrowableArray<traceid>* id_set = NULL; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
223 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
224 |
static void prepare_for_resolution() { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
225 |
id_set = new GrowableArray<traceid>(JfrOptionSet::old_object_queue_size()); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
226 |
sort_unloaded_klass_set(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
227 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
228 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
229 |
static bool stack_trace_precondition(const ObjectSample* sample) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
230 |
assert(sample != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
231 |
return sample->has_stack_trace_id() && !sample->is_dead(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
232 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
233 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
234 |
class StackTraceBlobInstaller { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
235 |
private: |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
236 |
const JfrStackTraceRepository& _stack_trace_repo; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
237 |
BlobCache _cache; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
238 |
const JfrStackTrace* resolve(const ObjectSample* sample); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
239 |
void install(ObjectSample* sample); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
240 |
public: |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
241 |
StackTraceBlobInstaller(const JfrStackTraceRepository& stack_trace_repo); |
50113 | 242 |
void sample_do(ObjectSample* sample) { |
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
243 |
if (stack_trace_precondition(sample)) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
244 |
install(sample); |
50113 | 245 |
} |
246 |
} |
|
247 |
}; |
|
248 |
||
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
249 |
StackTraceBlobInstaller::StackTraceBlobInstaller(const JfrStackTraceRepository& stack_trace_repo) : |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
250 |
_stack_trace_repo(stack_trace_repo), _cache(JfrOptionSet::old_object_queue_size()) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
251 |
prepare_for_resolution(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
252 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
253 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
254 |
const JfrStackTrace* StackTraceBlobInstaller::resolve(const ObjectSample* sample) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
255 |
return _stack_trace_repo.lookup(sample->stack_trace_hash(), sample->stack_trace_id()); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
256 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
257 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
258 |
#ifdef ASSERT |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
259 |
static void validate_stack_trace(const ObjectSample* sample, const JfrStackTrace* stack_trace) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
260 |
assert(!sample->has_stacktrace(), "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
261 |
assert(stack_trace != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
262 |
assert(stack_trace->hash() == sample->stack_trace_hash(), "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
263 |
assert(stack_trace->id() == sample->stack_trace_id(), "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
264 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
265 |
#endif |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
266 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
267 |
void StackTraceBlobInstaller::install(ObjectSample* sample) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
268 |
JfrBlobHandle blob = _cache.get(sample); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
269 |
if (blob.valid()) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
270 |
sample->set_stacktrace(blob); |
50113 | 271 |
return; |
272 |
} |
|
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
273 |
const JfrStackTrace* const stack_trace = resolve(sample); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
274 |
DEBUG_ONLY(validate_stack_trace(sample, stack_trace)); |
58863 | 275 |
JfrCheckpointWriter writer; |
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
276 |
writer.write_type(TYPE_STACKTRACE); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
277 |
writer.write_count(1); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
278 |
ObjectSampleCheckpoint::write_stacktrace(stack_trace, writer); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
279 |
blob = writer.move(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
280 |
_cache.put(sample, blob); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
281 |
sample->set_stacktrace(blob); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
282 |
} |
50113 | 283 |
|
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
284 |
static void install_stack_traces(const ObjectSampler* sampler, JfrStackTraceRepository& stack_trace_repo) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
285 |
assert(sampler != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
286 |
const ObjectSample* const last = sampler->last(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
287 |
if (last != sampler->last_resolved()) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
288 |
StackTraceBlobInstaller installer(stack_trace_repo); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
289 |
iterate_samples(installer); |
50113 | 290 |
} |
291 |
} |
|
292 |
||
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
293 |
// caller needs ResourceMark |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
294 |
void ObjectSampleCheckpoint::on_rotation(const ObjectSampler* sampler, JfrStackTraceRepository& stack_trace_repo) { |
58863 | 295 |
assert(JfrStream_lock->owned_by_self(), "invariant"); |
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
296 |
assert(sampler != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
297 |
assert(LeakProfiler::is_running(), "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
298 |
install_stack_traces(sampler, stack_trace_repo); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
299 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
300 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
301 |
static traceid get_klass_id(traceid method_id) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
302 |
assert(method_id != 0, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
303 |
return method_id >> TRACE_ID_SHIFT; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
304 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
305 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
306 |
static bool is_klass_unloaded(traceid method_id) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
307 |
return unloaded_klass_set != NULL && predicate(unloaded_klass_set, get_klass_id(method_id)); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
308 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
309 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
310 |
static bool is_processed(traceid id) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
311 |
assert(id != 0, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
312 |
assert(id_set != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
313 |
return mutable_predicate(id_set, id); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
314 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
315 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
316 |
void ObjectSampleCheckpoint::add_to_leakp_set(const Method* method, traceid method_id) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
317 |
if (is_processed(method_id) || is_klass_unloaded(method_id)) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
318 |
return; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
319 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
320 |
JfrTraceId::set_leakp(method); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
321 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
322 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
323 |
void ObjectSampleCheckpoint::write_stacktrace(const JfrStackTrace* trace, JfrCheckpointWriter& writer) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
324 |
assert(trace != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
325 |
// JfrStackTrace |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
326 |
writer.write(trace->id()); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
327 |
writer.write((u1)!trace->_reached_root); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
328 |
writer.write(trace->_nr_of_frames); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
329 |
// JfrStackFrames |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
330 |
for (u4 i = 0; i < trace->_nr_of_frames; ++i) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
331 |
const JfrStackFrame& frame = trace->_frames[i]; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
332 |
frame.write(writer); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
333 |
add_to_leakp_set(frame._method, frame._methodid); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
334 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
335 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
336 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
337 |
static void write_blob(const JfrBlobHandle& blob, JfrCheckpointWriter& writer, bool reset) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
338 |
if (reset) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
339 |
blob->reset_write_state(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
340 |
return; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
341 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
342 |
blob->exclusive_write(writer); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
343 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
344 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
345 |
static void write_type_set_blob(const ObjectSample* sample, JfrCheckpointWriter& writer, bool reset) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
346 |
if (sample->has_type_set()) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
347 |
write_blob(sample->type_set(), writer, reset); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
348 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
349 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
350 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
351 |
static void write_thread_blob(const ObjectSample* sample, JfrCheckpointWriter& writer, bool reset) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
352 |
assert(sample->has_thread(), "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
353 |
if (has_thread_exited(sample->thread_id())) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
354 |
write_blob(sample->thread(), writer, reset); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
355 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
356 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
357 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
358 |
static void write_stacktrace_blob(const ObjectSample* sample, JfrCheckpointWriter& writer, bool reset) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
359 |
if (sample->has_stacktrace()) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
360 |
write_blob(sample->stacktrace(), writer, reset); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
361 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
362 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
363 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
364 |
static void write_blobs(const ObjectSample* sample, JfrCheckpointWriter& writer, bool reset) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
365 |
assert(sample != NULL, "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
366 |
write_stacktrace_blob(sample, writer, reset); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
367 |
write_thread_blob(sample, writer, reset); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
368 |
write_type_set_blob(sample, writer, reset); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
369 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
370 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
371 |
class BlobWriter { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
372 |
private: |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
373 |
const ObjectSampler* _sampler; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
374 |
JfrCheckpointWriter& _writer; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
375 |
const jlong _last_sweep; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
376 |
bool _reset; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
377 |
public: |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
378 |
BlobWriter(const ObjectSampler* sampler, JfrCheckpointWriter& writer, jlong last_sweep) : |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
379 |
_sampler(sampler), _writer(writer), _last_sweep(last_sweep), _reset(false) {} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
380 |
void sample_do(ObjectSample* sample) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
381 |
if (sample->is_alive_and_older_than(_last_sweep)) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
382 |
write_blobs(sample, _writer, _reset); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
383 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
384 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
385 |
void set_reset() { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
386 |
_reset = true; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
387 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
388 |
}; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
389 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
390 |
static void write_sample_blobs(const ObjectSampler* sampler, bool emit_all, Thread* thread) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
391 |
// sample set is predicated on time of last sweep |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
392 |
const jlong last_sweep = emit_all ? max_jlong : sampler->last_sweep().value(); |
58863 | 393 |
JfrCheckpointWriter writer(thread, false); |
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
394 |
BlobWriter cbw(sampler, writer, last_sweep); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
395 |
iterate_samples(cbw, true); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
396 |
// reset blob write states |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
397 |
cbw.set_reset(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
398 |
iterate_samples(cbw, true); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
399 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
400 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
401 |
void ObjectSampleCheckpoint::write(const ObjectSampler* sampler, EdgeStore* edge_store, bool emit_all, Thread* thread) { |
58863 | 402 |
assert_locked_or_safepoint(JfrStream_lock); |
55571
49102ba8cf14
8214542: JFR: Old Object Sample event slow on a deep heap in debug builds
mgronlun
parents:
54663
diff
changeset
|
403 |
assert(sampler != NULL, "invariant"); |
50113 | 404 |
assert(edge_store != NULL, "invariant"); |
405 |
assert(thread != NULL, "invariant"); |
|
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
406 |
write_sample_blobs(sampler, emit_all, thread); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
407 |
// write reference chains |
50113 | 408 |
if (!edge_store->is_empty()) { |
58863 | 409 |
JfrCheckpointWriter writer(thread); |
50113 | 410 |
ObjectSampleWriter osw(writer, edge_store); |
55571
49102ba8cf14
8214542: JFR: Old Object Sample event slow on a deep heap in debug builds
mgronlun
parents:
54663
diff
changeset
|
411 |
edge_store->iterate(osw); |
50113 | 412 |
} |
413 |
} |
|
414 |
||
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
415 |
static void clear_unloaded_klass_set() { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
416 |
if (unloaded_klass_set != NULL && unloaded_klass_set->is_nonempty()) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
417 |
unloaded_klass_set->clear(); |
55571
49102ba8cf14
8214542: JFR: Old Object Sample event slow on a deep heap in debug builds
mgronlun
parents:
54663
diff
changeset
|
418 |
} |
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
419 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
420 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
421 |
// A linked list of saved type set blobs for the epoch. |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
422 |
// The link consist of a reference counted handle. |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
423 |
static JfrBlobHandle saved_type_set_blobs; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
424 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
425 |
static void release_state_for_previous_epoch() { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
426 |
// decrements the reference count and the list is reinitialized |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
427 |
saved_type_set_blobs = JfrBlobHandle(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
428 |
clear_unloaded_klass_set(); |
50113 | 429 |
} |
430 |
||
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
431 |
class BlobInstaller { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
432 |
public: |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
433 |
~BlobInstaller() { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
434 |
release_state_for_previous_epoch(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
435 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
436 |
void sample_do(ObjectSample* sample) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
437 |
if (!sample->is_dead()) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
438 |
sample->set_type_set(saved_type_set_blobs); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
439 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
440 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
441 |
}; |
50113 | 442 |
|
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
443 |
static void install_type_set_blobs() { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
444 |
BlobInstaller installer; |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
445 |
iterate_samples(installer); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
446 |
} |
50113 | 447 |
|
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
448 |
static void save_type_set_blob(JfrCheckpointWriter& writer, bool copy = false) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
449 |
assert(writer.has_data(), "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
450 |
const JfrBlobHandle blob = copy ? writer.copy() : writer.move(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
451 |
if (saved_type_set_blobs.valid()) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
452 |
saved_type_set_blobs->set_next(blob); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
453 |
} else { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
454 |
saved_type_set_blobs = blob; |
50113 | 455 |
} |
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
456 |
} |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
457 |
|
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
458 |
void ObjectSampleCheckpoint::on_type_set(JfrCheckpointWriter& writer) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
459 |
assert(LeakProfiler::is_running(), "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
460 |
const ObjectSample* last = ObjectSampler::sampler()->last(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
461 |
if (writer.has_data() && last != NULL) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
462 |
save_type_set_blob(writer); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
463 |
install_type_set_blobs(); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
464 |
ObjectSampler::sampler()->set_last_resolved(last); |
50113 | 465 |
} |
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
466 |
} |
50113 | 467 |
|
58132
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
468 |
void ObjectSampleCheckpoint::on_type_set_unload(JfrCheckpointWriter& writer) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
469 |
assert(SafepointSynchronize::is_at_safepoint(), "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
470 |
assert(LeakProfiler::is_running(), "invariant"); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
471 |
if (writer.has_data() && ObjectSampler::sampler()->last() != NULL) { |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
472 |
save_type_set_blob(writer, true); |
caa25ab47aca
8225797: OldObjectSample event creates unexpected amount of checkpoint data
mgronlun
parents:
57644
diff
changeset
|
473 |
} |
50113 | 474 |
} |