Skip to content

Commit 98ab4b0

Browse files
author
Markus Grönlund
committedOct 19, 2021
8275445: RunThese30M.java failed "assert(ZAddress::is_marked(addr)) failed: Should be marked"
Reviewed-by: egahlin, coleenp
1 parent dcd6e0d commit 98ab4b0

File tree

4 files changed

+65
-45
lines changed

4 files changed

+65
-45
lines changed
 

‎src/hotspot/share/jfr/periodic/jfrFinalizerStatisticsEvent.cpp

+1-44
Original file line numberDiff line numberDiff line change
@@ -26,63 +26,20 @@
2626
#include "utilities/macros.hpp"
2727
#if INCLUDE_MANAGEMENT
2828
#include "classfile/classLoaderDataGraph.hpp"
29-
#include "classfile/javaClasses.inline.hpp"
3029
#include "jfr/jfrEvents.hpp"
31-
#include "jfr/jni/jfrJavaSupport.hpp"
3230
#include "jfr/periodic/jfrFinalizerStatisticsEvent.hpp"
3331
#include "jfr/support/jfrSymbolTable.hpp"
3432
#include "jfr/utilities/jfrTime.hpp"
3533
#include "jfr/utilities/jfrTypes.hpp"
36-
#include "oops/instanceKlass.inline.hpp"
3734
#include "runtime/mutexLocker.hpp"
3835
#include "runtime/thread.inline.hpp"
3936
#include "services/finalizerService.hpp"
4037

41-
static oop get_codesource(oop pd, Thread* thread) {
42-
assert(pd != NULL, "invariant");
43-
assert(thread != NULL, "invariant");
44-
JavaValue result(T_OBJECT);
45-
JfrJavaArguments args(&result);
46-
args.set_klass(pd->klass());
47-
args.set_name("codesource");
48-
args.set_signature("Ljava/security/CodeSource;");
49-
args.set_receiver(pd);
50-
JfrJavaSupport::get_field(&args, thread);
51-
return result.get_oop();
52-
}
53-
54-
// Caller needs ResourceMark
55-
static const char* get_locationNoFragString(oop codesource, Thread* thread) {
56-
assert(codesource != NULL, "invariant");
57-
assert(thread != NULL, "invariant");
58-
JavaValue result(T_OBJECT);
59-
JfrJavaArguments args(&result);
60-
args.set_klass(codesource->klass());
61-
args.set_name("locationNoFragString");
62-
args.set_signature("Ljava/lang/String;");
63-
args.set_receiver(codesource);
64-
JfrJavaSupport::get_field(&args, thread);
65-
const oop string_oop = result.get_oop();
66-
return string_oop != NULL ? JfrJavaSupport::c_str(string_oop, thread) : NULL;
67-
}
68-
69-
// Caller needs ResourceMark
70-
static const char* codesource(const InstanceKlass* ik, Thread* thread) {
71-
assert(ik != NULL, "invariant");
72-
assert(thread != NULL, "invariant");
73-
oop pd = java_lang_Class::protection_domain(ik->java_mirror());
74-
if (pd == NULL) {
75-
return NULL;
76-
}
77-
oop codesource = get_codesource(pd, thread);
78-
return codesource != NULL ? get_locationNoFragString(codesource, thread) : NULL;
79-
}
80-
8138
static void send_event(const FinalizerEntry* fe, const InstanceKlass* ik, const JfrTicks& timestamp, Thread* thread) {
8239
assert(ik != NULL, "invariant");
8340
assert(ik->has_finalizer(), "invariant");
8441
assert(thread != NULL, "invariant");
85-
const char* const url = codesource(ik, thread);
42+
const char* const url = fe != nullptr ? fe->codesource() : nullptr;
8643
const traceid url_symbol_id = url != NULL ? JfrSymbolTable::add(url) : 0;
8744
EventFinalizerStatistics event(UNTIMED);
8845
event.set_endtime(timestamp);

‎src/hotspot/share/services/finalizerService.cpp

+61
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,13 @@
2626
#include "utilities/macros.hpp"
2727
#if INCLUDE_MANAGEMENT
2828
#include "classfile/classLoaderDataGraph.inline.hpp"
29+
#include "classfile/javaClasses.inline.hpp"
30+
#include "classfile/symbolTable.hpp"
2931
#include "memory/resourceArea.hpp"
3032
#include "logging/log.hpp"
33+
#include "oops/instanceKlass.inline.hpp"
3134
#include "runtime/atomic.hpp"
35+
#include "runtime/fieldDescriptor.inline.hpp"
3236
#include "runtime/interfaceSupport.inline.hpp"
3337
#include "runtime/mutexLocker.hpp"
3438
#include "runtime/synchronizer.hpp"
@@ -37,15 +41,72 @@
3741
#include "utilities/concurrentHashTableTasks.inline.hpp"
3842
#include "utilities/debug.hpp"
3943

44+
static const char* allocate(oop string) {
45+
char* str = nullptr;
46+
const typeArrayOop value = java_lang_String::value(string);
47+
if (value != nullptr) {
48+
const int length = java_lang_String::utf8_length(string, value);
49+
str = NEW_C_HEAP_ARRAY(char, length, mtServiceability);
50+
java_lang_String::as_utf8_string(string, value, str, length + 1);
51+
}
52+
return str;
53+
}
54+
55+
static int compute_field_offset(const Klass* klass, const char* field_name, const char* field_signature) {
56+
assert(klass != nullptr, "invariant");
57+
Symbol* const name = SymbolTable::new_symbol(field_name);
58+
assert(name != nullptr, "invariant");
59+
Symbol* const signature = SymbolTable::new_symbol(field_signature);
60+
assert(signature != nullptr, "invariant");
61+
assert(klass->is_instance_klass(), "invariant");
62+
fieldDescriptor fd;
63+
InstanceKlass::cast(klass)->find_field(name, signature, false, &fd);
64+
return fd.offset();
65+
}
66+
67+
static const char* location_no_frag_string(oop codesource) {
68+
assert(codesource != nullptr, "invariant");
69+
static int loc_no_frag_offset = compute_field_offset(codesource->klass(), "locationNoFragString", "Ljava/lang/String;");
70+
oop string = codesource->obj_field(loc_no_frag_offset);
71+
return string != nullptr ? allocate(string) : nullptr;
72+
}
73+
74+
static oop codesource(oop pd) {
75+
assert(pd != nullptr, "invariant");
76+
static int codesource_offset = compute_field_offset(pd->klass(), "codesource", "Ljava/security/CodeSource;");
77+
return pd->obj_field(codesource_offset);
78+
}
79+
80+
static const char* get_codesource(const InstanceKlass* ik) {
81+
assert(ik != nullptr, "invariant");
82+
oop pd = java_lang_Class::protection_domain(ik->java_mirror());
83+
if (pd == nullptr) {
84+
return nullptr;
85+
}
86+
oop cs = codesource(pd);
87+
return cs != nullptr ? location_no_frag_string(cs) : nullptr;
88+
}
89+
4090
FinalizerEntry::FinalizerEntry(const InstanceKlass* ik) :
4191
_ik(ik),
92+
_codesource(get_codesource(ik)),
4293
_objects_on_heap(0),
4394
_total_finalizers_run(0) {}
4495

96+
FinalizerEntry::~FinalizerEntry() {
97+
if (_codesource != nullptr) {
98+
FREE_C_HEAP_ARRAY(char, _codesource);
99+
}
100+
}
101+
45102
const InstanceKlass* FinalizerEntry::klass() const {
46103
return _ik;
47104
}
48105

106+
const char* FinalizerEntry::codesource() const {
107+
return _codesource;
108+
}
109+
49110
uintptr_t FinalizerEntry::objects_on_heap() const {
50111
return Atomic::load(&_objects_on_heap);
51112
}

‎src/hotspot/share/services/finalizerService.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,14 @@ class Thread;
3535
class FinalizerEntry : public CHeapObj<mtServiceability> {
3636
private:
3737
const InstanceKlass* const _ik;
38+
const char* _codesource;
3839
uintptr_t _objects_on_heap;
3940
uintptr_t _total_finalizers_run;
4041
public:
4142
FinalizerEntry(const InstanceKlass* ik);
43+
~FinalizerEntry();
4244
const InstanceKlass* klass() const NOT_MANAGEMENT_RETURN_(nullptr);
45+
const char* codesource() const NOT_MANAGEMENT_RETURN_(nullptr);
4346
uintptr_t objects_on_heap() const NOT_MANAGEMENT_RETURN_(0L);
4447
uintptr_t total_finalizers_run() const NOT_MANAGEMENT_RETURN_(0L);
4548
void on_register() NOT_MANAGEMENT_RETURN;

‎test/jdk/jdk/jfr/event/runtime/TestFinalizerStatisticsEvent.java

-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ private static void verify(Recording recording) throws Throwable {
9999
break;
100100
}
101101
case TEST_CLASS_UNLOAD_NAME: {
102-
Asserts.assertTrue(event.getString("codeSource").startsWith("file://"));
103102
foundTestClassUnloadName = true;
104103
break;
105104
}

0 commit comments

Comments
 (0)
Please sign in to comment.