8143226: Minor updates to Event Based tracing

Reviewed-by: jbachorik, egahlin
This commit is contained in:
Markus Grönlund 2016-03-01 23:46:09 +01:00
parent 12d9b13eee
commit 0e44e963d2
34 changed files with 211 additions and 321 deletions

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -57,11 +57,6 @@ ifeq ($(HAS_ALT_SRC), true)
TraceGeneratedNames += \
traceRequestables.hpp \
traceEventControl.hpp
ifneq ($(INCLUDE_TRACE), false)
TraceGeneratedNames += traceProducer.cpp
endif
endif
TraceGeneratedFiles = $(TraceGeneratedNames:%=$(TraceOutDir)/%)
@ -100,9 +95,6 @@ else
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS)
$(GENERATE_CODE)
$(TraceOutDir)/traceProducer.cpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceProducer.xsl $(XML_DEPS)
$(GENERATE_CODE)
$(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS)
$(GENERATE_CODE)

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -57,11 +57,6 @@ ifeq ($(HAS_ALT_SRC), true)
TraceGeneratedNames += \
traceRequestables.hpp \
traceEventControl.hpp
ifneq ($(INCLUDE_TRACE), false)
TraceGeneratedNames += traceProducer.cpp
endif
endif
@ -101,9 +96,6 @@ else
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS)
$(GENERATE_CODE)
$(TraceOutDir)/traceProducer.cpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceProducer.xsl $(XML_DEPS)
$(GENERATE_CODE)
$(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS)
$(GENERATE_CODE)

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -57,11 +57,6 @@ ifeq ($(HAS_ALT_SRC), true)
TraceGeneratedNames += \
traceRequestables.hpp \
traceEventControl.hpp
ifneq ($(INCLUDE_TRACE), false)
TraceGeneratedNames += traceProducer.cpp
endif
endif
TraceGeneratedFiles = $(TraceGeneratedNames:%=$(TraceOutDir)/%)
@ -100,9 +95,6 @@ else
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS)
$(GENERATE_CODE)
$(TraceOutDir)/traceProducer.cpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceProducer.xsl $(XML_DEPS)
$(GENERATE_CODE)
$(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS)
$(GENERATE_CODE)

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -56,8 +56,7 @@ TraceGeneratedNames = \
ifeq ($(HAS_ALT_SRC), true)
TraceGeneratedNames += \
traceRequestables.hpp \
traceEventControl.hpp \
traceProducer.cpp
traceEventControl.hpp
endif
TraceGeneratedFiles = $(TraceGeneratedNames:%=$(TraceOutDir)/%)
@ -96,9 +95,6 @@ else
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS)
$(GENERATE_CODE)
$(TraceOutDir)/traceProducer.cpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceProducer.xsl $(XML_DEPS)
$(GENERATE_CODE)
$(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS)
$(GENERATE_CODE)

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@ -43,8 +43,7 @@ TraceGeneratedNames = \
!if EXISTS($(TraceAltSrcDir))
TraceGeneratedNames = $(TraceGeneratedNames) \
traceRequestables.hpp \
traceEventControl.hpp \
traceProducer.cpp
traceEventControl.hpp
!endif
@ -58,8 +57,7 @@ TraceGeneratedFiles = \
!if EXISTS($(TraceAltSrcDir))
TraceGeneratedFiles = $(TraceGeneratedFiles) \
$(TraceOutDir)/traceRequestables.hpp \
$(TraceOutDir)/traceEventControl.hpp \
$(TraceOutDir)/traceProducer.cpp
$(TraceOutDir)/traceEventControl.hpp
!endif
XSLT = $(QUIETLY) $(REMOTE) $(RUN_JAVA) -classpath $(JvmtiOutDir) jvmtiGen
@ -98,10 +96,6 @@ $(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)
@echo Generating AltSrc $@
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceEventClasses.xsl -OUT $(TraceOutDir)/traceEventClasses.hpp
$(TraceOutDir)/traceProducer.cpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceProducer.xsl $(XML_DEPS)
@echo Generating AltSrc $@
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceProducer.xsl -OUT $(TraceOutDir)/traceProducer.cpp
$(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS)
@echo Generating AltSrc $@
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceRequestables.xsl -OUT $(TraceOutDir)/traceRequestables.hpp

View File

@ -228,8 +228,6 @@ bool Compiler::is_intrinsic_supported(const methodHandle& method) {
case vmIntrinsics::_getCharStringU:
case vmIntrinsics::_putCharStringU:
#ifdef TRACE_HAVE_INTRINSICS
case vmIntrinsics::_classID:
case vmIntrinsics::_threadID:
case vmIntrinsics::_counterTime:
#endif
break;

View File

@ -43,6 +43,9 @@
#if INCLUDE_ALL_GCS
#include "gc/g1/heapRegion.hpp"
#endif // INCLUDE_ALL_GCS
#ifdef TRACE_HAVE_INTRINSICS
#include "trace/traceMacros.hpp"
#endif
#ifdef ASSERT
#define __ gen()->lir(__FILE__, __LINE__)->
@ -3067,42 +3070,7 @@ void LIRGenerator::do_RuntimeCall(address routine, Intrinsic* x) {
__ move(reg, result);
}
#ifdef TRACE_HAVE_INTRINSICS
void LIRGenerator::do_ThreadIDIntrinsic(Intrinsic* x) {
LIR_Opr thread = getThreadPointer();
LIR_Opr osthread = new_pointer_register();
__ move(new LIR_Address(thread, in_bytes(JavaThread::osthread_offset()), osthread->type()), osthread);
size_t thread_id_size = OSThread::thread_id_size();
if (thread_id_size == (size_t) BytesPerLong) {
LIR_Opr id = new_register(T_LONG);
__ move(new LIR_Address(osthread, in_bytes(OSThread::thread_id_offset()), T_LONG), id);
__ convert(Bytecodes::_l2i, id, rlock_result(x));
} else if (thread_id_size == (size_t) BytesPerInt) {
__ move(new LIR_Address(osthread, in_bytes(OSThread::thread_id_offset()), T_INT), rlock_result(x));
} else {
ShouldNotReachHere();
}
}
void LIRGenerator::do_ClassIDIntrinsic(Intrinsic* x) {
CodeEmitInfo* info = state_for(x);
CodeEmitInfo* info2 = new CodeEmitInfo(info); // Clone for the second null check
BasicType klass_pointer_type = NOT_LP64(T_INT) LP64_ONLY(T_LONG);
assert(info != NULL, "must have info");
LIRItem arg(x->argument_at(1), this);
arg.load_item();
LIR_Opr klass = new_pointer_register();
__ move(new LIR_Address(arg.result(), java_lang_Class::klass_offset_in_bytes(), klass_pointer_type), klass, info);
LIR_Opr id = new_register(T_LONG);
ByteSize offset = TRACE_ID_OFFSET;
LIR_Address* trace_id_addr = new LIR_Address(klass, in_bytes(offset), T_LONG);
__ move(trace_id_addr, id);
__ logical_or(id, LIR_OprFact::longConst(0x01l), id);
__ store(id, trace_id_addr);
__ logical_and(id, LIR_OprFact::longConst(~0x3l), id);
__ move(id, rlock_result(x));
}
#endif
void LIRGenerator::do_Intrinsic(Intrinsic* x) {
switch (x->id()) {
@ -3115,8 +3083,6 @@ void LIRGenerator::do_Intrinsic(Intrinsic* x) {
}
#ifdef TRACE_HAVE_INTRINSICS
case vmIntrinsics::_threadID: do_ThreadIDIntrinsic(x); break;
case vmIntrinsics::_classID: do_ClassIDIntrinsic(x); break;
case vmIntrinsics::_counterTime:
do_RuntimeCall(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), x);
break;

View File

@ -440,10 +440,7 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {
void do_SwitchRanges(SwitchRangeArray* x, LIR_Opr value, BlockBegin* default_sux);
void do_RuntimeCall(address routine, Intrinsic* x);
#ifdef TRACE_HAVE_INTRINSICS
void do_ThreadIDIntrinsic(Intrinsic* x);
void do_ClassIDIntrinsic(Intrinsic* x);
#endif
ciKlass* profile_type(ciMethodData* md, int md_first_offset, int md_offset, intptr_t profiled_k,
Value arg, LIR_Opr& mdp, bool not_null, ciKlass* signature_at_call_k,
ciKlass* callee_signature_k);

View File

@ -5380,7 +5380,7 @@ void ClassFileParser::fill_instance_klass(InstanceKlass* ik, TRAPS) {
}
}
TRACE_INIT_ID(ik);
TRACE_INIT_KLASS_ID(ik);
// If we reach here, all is well.
// Now remove the InstanceKlass* from the _klass_to_deallocate field

View File

@ -328,8 +328,6 @@ bool vmIntrinsics::preserves_state(vmIntrinsics::ID id) {
assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
switch(id) {
#ifdef TRACE_HAVE_INTRINSICS
case vmIntrinsics::_classID:
case vmIntrinsics::_threadID:
case vmIntrinsics::_counterTime:
#endif
case vmIntrinsics::_currentTimeMillis:

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -26,6 +26,7 @@
#define SHARE_VM_GC_SHARED_COPYFAILEDINFO_HPP
#include "runtime/thread.hpp"
#include "trace/traceMacros.hpp"
#include "utilities/globalDefinitions.hpp"
class CopyFailedInfo : public CHeapObj<mtGC> {
@ -63,26 +64,28 @@ class CopyFailedInfo : public CHeapObj<mtGC> {
};
class PromotionFailedInfo : public CopyFailedInfo {
OSThread* _thread;
traceid _thread_trace_id;
public:
PromotionFailedInfo() : CopyFailedInfo(), _thread(NULL) {}
PromotionFailedInfo() : CopyFailedInfo(), _thread_trace_id(0) {}
void register_copy_failure(size_t size) {
CopyFailedInfo::register_copy_failure(size);
if (_thread == NULL) {
_thread = Thread::current()->osthread();
if (_thread_trace_id == 0) {
_thread_trace_id = THREAD_TRACE_ID(Thread::current());
} else {
assert(_thread == Thread::current()->osthread(), "The PromotionFailedInfo should be thread local.");
assert(THREAD_TRACE_ID(Thread::current()) == _thread_trace_id,
"The PromotionFailedInfo should be thread local.");
}
}
void reset() {
CopyFailedInfo::reset();
_thread = NULL;
_thread_trace_id = 0;
}
OSThread* thread() const { return _thread; }
traceid thread_trace_id() const { return _thread_trace_id; }
};
class EvacuationFailedInfo : public CopyFailedInfo {};

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -174,7 +174,7 @@ void YoungGCTracer::send_promotion_failed_event(const PromotionFailedInfo& pf_in
if (e.should_commit()) {
e.set_gcId(GCId::current());
e.set_data(to_trace_struct(pf_info));
e.set_thread(pf_info.thread()->thread_id());
e.set_thread(pf_info.thread_trace_id());
e.commit();
}
}

View File

@ -89,7 +89,7 @@ ArrayKlass::ArrayKlass(Symbol* name) :
set_super(Universe::is_bootstrapping() ? (Klass*)NULL : SystemDictionary::Object_klass());
set_layout_helper(Klass::_lh_neutral_value);
set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5)
TRACE_INIT_ID(this);
TRACE_INIT_KLASS_ID(this);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -839,7 +839,7 @@ public:
// support for stub routines
static ByteSize init_state_offset() { return in_ByteSize(offset_of(InstanceKlass, _init_state)); }
TRACE_DEFINE_OFFSET;
TRACE_DEFINE_KLASS_TRACE_ID_OFFSET;
static ByteSize init_thread_offset() { return in_ByteSize(offset_of(InstanceKlass, _init_thread)); }
// subclass/subinterface checks

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -494,7 +494,7 @@ void Klass::remove_unshareable_info() {
}
void Klass::restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS) {
TRACE_INIT_ID(this);
TRACE_INIT_KLASS_ID(this);
// If an exception happened during CDS restore, some of these fields may already be
// set. We leave the class on the CLD list, even if incomplete so that we don't
// modify the CLD list outside a safepoint.

View File

@ -132,7 +132,7 @@ class Klass : public Metadata {
jint _modifier_flags; // Processed access flags, for use by Class.getModifiers.
AccessFlags _access_flags; // Access flags. The class/interface distinction is stored here.
TRACE_DEFINE_KLASS_TRACE_ID;
TRACE_DEFINE_TRACE_ID_FIELD;
// Biased locking implementation and statistics
// (the 64-bit chunk goes first, to avoid some fragmentation)
@ -569,7 +569,7 @@ protected:
jlong last_biased_lock_bulk_revocation_time() { return _last_biased_lock_bulk_revocation_time; }
void set_last_biased_lock_bulk_revocation_time(jlong cur_time) { _last_biased_lock_bulk_revocation_time = cur_time; }
TRACE_DEFINE_KLASS_METHODS;
TRACE_DEFINE_TRACE_ID_METHODS;
// garbage collection support
void oops_do(OopClosure* cl);

View File

@ -400,8 +400,6 @@ bool C2Compiler::is_intrinsic_supported(const methodHandle& method, bool is_virt
case vmIntrinsics::_currentThread:
case vmIntrinsics::_isInterrupted:
#ifdef TRACE_HAVE_INTRINSICS
case vmIntrinsics::_classID:
case vmIntrinsics::_threadID:
case vmIntrinsics::_counterTime:
#endif
case vmIntrinsics::_currentTimeMillis:

View File

@ -49,7 +49,9 @@
#include "opto/subnode.hpp"
#include "prims/nativeLookup.hpp"
#include "runtime/sharedRuntime.hpp"
#ifdef TRACE_HAVE_INTRINSICS
#include "trace/traceMacros.hpp"
#endif
class LibraryIntrinsic : public InlineCallGenerator {
// Extend the set of intrinsics known to the runtime:
@ -246,10 +248,7 @@ class LibraryCallKit : public GraphKit {
bool inline_unsafe_allocate();
bool inline_unsafe_copyMemory();
bool inline_native_currentThread();
#ifdef TRACE_HAVE_INTRINSICS
bool inline_native_classID();
bool inline_native_threadID();
#endif
bool inline_native_time_funcs(address method, const char* funcName);
bool inline_native_isInterrupted();
bool inline_native_Class_query(vmIntrinsics::ID id);
@ -642,8 +641,6 @@ bool LibraryCallKit::try_to_inline(int predicate) {
case vmIntrinsics::_isInterrupted: return inline_native_isInterrupted();
#ifdef TRACE_HAVE_INTRINSICS
case vmIntrinsics::_classID: return inline_native_classID();
case vmIntrinsics::_threadID: return inline_native_threadID();
case vmIntrinsics::_counterTime: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), "counterTime");
#endif
case vmIntrinsics::_currentTimeMillis: return inline_native_time_funcs(CAST_FROM_FN_PTR(address, os::javaTimeMillis), "currentTimeMillis");
@ -2932,52 +2929,6 @@ bool LibraryCallKit::inline_unsafe_allocate() {
return true;
}
#ifdef TRACE_HAVE_INTRINSICS
/*
* oop -> myklass
* myklass->trace_id |= USED
* return myklass->trace_id & ~0x3
*/
bool LibraryCallKit::inline_native_classID() {
null_check_receiver(); // null-check, then ignore
Node* cls = null_check(argument(1), T_OBJECT);
Node* kls = load_klass_from_mirror(cls, false, NULL, 0);
kls = null_check(kls, T_OBJECT);
ByteSize offset = TRACE_ID_OFFSET;
Node* insp = basic_plus_adr(kls, in_bytes(offset));
Node* tvalue = make_load(NULL, insp, TypeLong::LONG, T_LONG, MemNode::unordered);
Node* bits = longcon(~0x03l); // ignore bit 0 & 1
Node* andl = _gvn.transform(new AndLNode(tvalue, bits));
Node* clsused = longcon(0x01l); // set the class bit
Node* orl = _gvn.transform(new OrLNode(tvalue, clsused));
const TypePtr *adr_type = _gvn.type(insp)->isa_ptr();
store_to_memory(control(), insp, orl, T_LONG, adr_type, MemNode::unordered);
set_result(andl);
return true;
}
bool LibraryCallKit::inline_native_threadID() {
Node* tls_ptr = NULL;
Node* cur_thr = generate_current_thread(tls_ptr);
Node* p = basic_plus_adr(top()/*!oop*/, tls_ptr, in_bytes(JavaThread::osthread_offset()));
Node* osthread = make_load(NULL, p, TypeRawPtr::NOTNULL, T_ADDRESS, MemNode::unordered);
p = basic_plus_adr(top()/*!oop*/, osthread, in_bytes(OSThread::thread_id_offset()));
Node* threadid = NULL;
size_t thread_id_size = OSThread::thread_id_size();
if (thread_id_size == (size_t) BytesPerLong) {
threadid = ConvL2I(make_load(control(), p, TypeLong::LONG, T_LONG, MemNode::unordered));
} else if (thread_id_size == (size_t) BytesPerInt) {
threadid = make_load(control(), p, TypeInt::INT, T_INT, MemNode::unordered);
} else {
ShouldNotReachHere();
}
set_result(threadid);
return true;
}
#endif
//------------------------inline_native_time_funcs--------------
// inline code for System.currentTimeMillis() and System.nanoTime()
// these have the same type and signature

View File

@ -73,6 +73,7 @@
#include "runtime/vm_operations.hpp"
#include "services/memTracker.hpp"
#include "services/runtimeService.hpp"
#include "trace/traceMacros.hpp"
#include "trace/tracing.hpp"
#include "utilities/defaultStream.hpp"
#include "utilities/dtrace.hpp"
@ -3929,7 +3930,7 @@ static jint JNI_CreateJavaVM_inner(JavaVM **vm, void **penv, void *args) {
EventThreadStart event;
if (event.should_commit()) {
event.set_javalangthread(java_lang_Thread::thread_id(thread->threadObj()));
event.set_thread(THREAD_TRACE_ID(thread));
event.commit();
}
@ -4149,7 +4150,7 @@ static jint attach_current_thread(JavaVM *vm, void **penv, void *_args, bool dae
EventThreadStart event;
if (event.should_commit()) {
event.set_javalangthread(java_lang_Thread::thread_id(thread->threadObj()));
event.set_thread(THREAD_TRACE_ID(thread));
event.commit();
}

View File

@ -64,6 +64,7 @@
#include "runtime/timer.hpp"
#include "runtime/vm_operations.hpp"
#include "services/memTracker.hpp"
#include "trace/traceMacros.hpp"
#include "trace/tracing.hpp"
#include "utilities/dtrace.hpp"
#include "utilities/globalDefinitions.hpp"
@ -485,7 +486,7 @@ void before_exit(JavaThread* thread) {
EventThreadEnd event;
if (event.should_commit()) {
event.set_javalangthread(java_lang_Thread::thread_id(thread->threadObj()));
event.set_thread(THREAD_TRACE_ID(thread));
event.commit();
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -401,7 +401,7 @@ void NOINLINE ObjectMonitor::enter(TRAPS) {
if (event.should_commit()) {
event.set_klass(((oop)this->object())->klass());
event.set_previousOwner((TYPE_JAVALANGTHREAD)_previous_owner_tid);
event.set_previousOwner((TYPE_THREAD)_previous_owner_tid);
event.set_address((TYPE_ADDRESS)(uintptr_t)(this->object_addr()));
event.commit();
}
@ -937,7 +937,7 @@ void NOINLINE ObjectMonitor::exit(bool not_suspended, TRAPS) {
// get the owner's thread id for the MonitorEnter event
// if it is enabled and the thread isn't suspended
if (not_suspended && Tracing::is_event_enabled(TraceJavaMonitorEnterEvent)) {
_previous_owner_tid = SharedRuntime::get_java_tid(Self);
_previous_owner_tid = THREAD_TRACE_ID(Self);
}
#endif
@ -1391,11 +1391,12 @@ void ObjectMonitor::post_monitor_wait_event(EventJavaMonitorWait* event,
jlong notifier_tid,
jlong timeout,
bool timedout) {
assert(event != NULL, "invariant");
event->set_klass(((oop)this->object())->klass());
event->set_timeout((TYPE_ULONG)timeout);
event->set_address((TYPE_ADDRESS)(uintptr_t)(this->object_addr()));
event->set_notifier((TYPE_OSTHREAD)notifier_tid);
event->set_timedOut((TYPE_BOOLEAN)timedout);
event->set_timeout(timeout);
event->set_address((TYPE_ADDRESS)this->object_addr());
event->set_notifier(notifier_tid);
event->set_timedOut(timedout);
event->commit();
}
@ -1655,7 +1656,7 @@ void ObjectMonitor::INotify(Thread * Self) {
iterator->TState = ObjectWaiter::TS_ENTER;
}
iterator->_notified = 1;
iterator->_notifier_tid = Self->osthread()->thread_id();
iterator->_notifier_tid = THREAD_TRACE_ID(Self);
ObjectWaiter * list = _EntryList;
if (list != NULL) {

View File

@ -1694,7 +1694,7 @@ void JavaThread::run() {
EventThreadStart event;
if (event.should_commit()) {
event.set_javalangthread(java_lang_Thread::thread_id(this->threadObj()));
event.set_thread(THREAD_TRACE_ID(this));
event.commit();
}
@ -1799,7 +1799,7 @@ void JavaThread::exit(bool destroy_vm, ExitType exit_type) {
// from java_lang_Thread object
EventThreadEnd event;
if (event.should_commit()) {
event.set_javalangthread(java_lang_Thread::thread_id(this->threadObj()));
event.set_thread(THREAD_TRACE_ID(this));
event.commit();
}
@ -3554,6 +3554,10 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
return status;
}
if (TRACE_INITIALIZE() != JNI_OK) {
vm_exit_during_initialization("Failed to initialize tracing backend");
}
// Should be done after the heap is fully created
main_thread->cache_global_variables();
@ -3622,11 +3626,6 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
quicken_jni_functions();
// Must be run after init_ft which initializes ft_enabled
if (TRACE_INITIALIZE() != JNI_OK) {
vm_exit_during_initialization("Failed to initialize tracing backend");
}
// No more stub generation allowed after that point.
StubCodeDesc::freeze();

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -448,7 +448,8 @@ class Thread: public ThreadShadow {
void incr_allocated_bytes(jlong size) { _allocated_bytes += size; }
inline jlong cooked_allocated_bytes();
TRACE_DATA* trace_data() { return &_trace_data; }
TRACE_DEFINE_THREAD_TRACE_DATA_OFFSET;
TRACE_DATA* trace_data() const { return &_trace_data; }
const ThreadExt& ext() const { return _ext; }
ThreadExt& ext() { return _ext; }

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -359,7 +359,7 @@ void VMThread::evaluate_operation(VM_Operation* op) {
// Only write caller thread information for non-concurrent vm operations.
// For concurrent vm operations, the thread id is set to 0 indicating thread is unknown.
// This is because the caller thread could have exited already.
event.set_caller(is_concurrent ? 0 : op->calling_thread()->osthread()->thread_id());
event.set_caller(is_concurrent ? 0 : THREAD_TRACE_ID(op->calling_thread()));
event.commit();
}

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
@ -73,12 +73,12 @@ Declares a structure type that can be used in other events.
<events>
<event id="ThreadStart" path="java/thread_start" label="Java Thread Start"
has_thread="true" is_instant="true">
<value type="JAVALANGTHREAD" field="javalangthread" label="Java Thread"/>
<value type="THREAD" field="thread" label="Java Thread"/>
</event>
<event id="ThreadEnd" path="java/thread_end" label="Java Thread End"
has_thread="true" is_instant="true">
<value type="JAVALANGTHREAD" field="javalangthread" label="Java Thread"/>
<value type="THREAD" field="thread" label="Java Thread"/>
</event>
<event id="ThreadSleep" path="java/thread_sleep" label="Java Thread Sleep"
@ -96,14 +96,14 @@ Declares a structure type that can be used in other events.
<event id="JavaMonitorEnter" path="java/monitor_enter" label="Java Monitor Blocked"
has_thread="true" has_stacktrace="true" is_instant="false">
<value type="CLASS" field="klass" label="Monitor Class"/>
<value type="JAVALANGTHREAD" field="previousOwner" label="Previous Monitor Owner"/>
<value type="THREAD" field="previousOwner" label="Previous Monitor Owner"/>
<value type="ADDRESS" field="address" label="Monitor Address" relation="JAVA_MONITOR_ADDRESS"/>
</event>
<event id="JavaMonitorWait" path="java/monitor_wait" label="Java Monitor Wait" description="Waiting on a Java monitor"
has_thread="true" has_stacktrace="true" is_instant="false">
<value type="CLASS" field="klass" label="Monitor Class" description="Class of object waited on"/>
<value type="OSTHREAD" field="notifier" label="Notifier Thread" description="Notifying Thread"/>
<value type="THREAD" field="notifier" label="Notifier Thread" description="Notifying Thread"/>
<value type="MILLIS" field="timeout" label="Timeout" description="Maximum wait time"/>
<value type="BOOLEAN" field="timedOut" label="Timed Out" description="Wait has been timed out"/>
<value type="ADDRESS" field="address" label="Monitor Address" description="Address of object waited on" relation="JAVA_MONITOR_ADDRESS"/>
@ -434,7 +434,7 @@ Declares a structure type that can be used in other events.
description="Promotion of an object failed">
<value type="UINT" field="gcId" label="GC ID" relation="GC_ID"/>
<structvalue type="CopyFailed" field="data" label="Data"/>
<value type="OSTHREAD" field="thread" label="Running thread"/>
<value type="THREAD" field="thread" label="Running thread"/>
</event>
<event id="EvacuationFailed" path="vm/gc/detailed/evacuation_failed" label="Evacuation Failed" is_instant="true"
@ -496,6 +496,11 @@ Declares a structure type that can be used in other events.
<value type="UINT" field="allocContext" label="Allocation Context" />
</event>
<event id="VMError" path="vm/runtime/vm_error" label="VM Error"
description="VM shutdown due to an error" has_stacktrace="true" has_thread="true">
<value type="BOOLEAN" field="out_of_java_memory" label="Java Out Of Memory"/>
</event>
<!-- Compiler events -->
<event id="Compilation" path="vm/compiler/compilation" label="Compilation"
@ -569,7 +574,7 @@ Declares a structure type that can be used in other events.
<value type="VMOPERATIONTYPE" field="operation" label="Operation" />
<value type="BOOLEAN" field="safepoint" label="At Safepoint" description="If the operation occured at a safepoint."/>
<value type="BOOLEAN" field="blocking" label="Caller Blocked" description="If the calling thread was blocked until the operation was complete."/>
<value type="OSTHREAD" field="caller" label="Caller" transition="FROM" description="Thread requesting operation. If non-blocking, will be set to 0 indicating thread is unknown."/>
<value type="THREAD" field="caller" label="Caller" transition="FROM" description="Thread requesting operation. If non-blocking, will be set to 0 indicating thread is unknown."/>
</event>
<!-- Allocation events -->

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -47,6 +47,10 @@ public:
static void on_unloading_classes(void) {
}
static void on_vm_error(bool) {
}
};
class TraceThreadData {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -31,39 +31,32 @@
enum {
CONTENT_TYPE_NONE = 0,
CONTENT_TYPE_BYTES = 1,
CONTENT_TYPE_EPOCHMILLIS = 2,
CONTENT_TYPE_MILLIS = 3,
CONTENT_TYPE_NANOS = 4,
CONTENT_TYPE_TICKS = 5,
CONTENT_TYPE_ADDRESS = 6,
CONTENT_TYPE_CLASS = 20,
CONTENT_TYPE_UTF8 = 21,
CONTENT_TYPE_THREAD = 22,
CONTENT_TYPE_STACKTRACE = 23,
CONTENT_TYPE_BYTES = 24,
CONTENT_TYPE_EPOCHMILLIS = 25,
CONTENT_TYPE_MILLIS = 26,
CONTENT_TYPE_NANOS = 27,
CONTENT_TYPE_TICKS = 28,
CONTENT_TYPE_ADDRESS = 29,
CONTENT_TYPE_PERCENTAGE = 30,
CONTENT_TYPE_OSTHREAD,
CONTENT_TYPE_JAVALANGTHREAD,
CONTENT_TYPE_STACKTRACE,
CONTENT_TYPE_CLASS,
CONTENT_TYPE_PERCENTAGE,
JVM_CONTENT_TYPES_START = 30,
JVM_CONTENT_TYPES_END = 100
JVM_CONTENT_TYPES_START = 33,
JVM_CONTENT_TYPES_END = 255
};
enum ReservedEvent {
EVENT_PRODUCERS,
EVENT_METADATA,
EVENT_CHECKPOINT,
EVENT_BUFFERLOST,
NUM_RESERVED_EVENTS
NUM_RESERVED_EVENTS = JVM_CONTENT_TYPES_END
};
typedef enum ReservedEvent ReservedEvent;
typedef u8 classid;
typedef u8 stacktraceid;
typedef u8 methodid;
typedef u8 fieldid;
class TraceUnicodeString;
class Symbol;
#endif // SHARE_VM_TRACE_TRACEDATATYPES_HPP

View File

@ -99,8 +99,13 @@ class TraceEvent : public StackObj {
cancel();
return;
}
if (_endTime == 0) {
static_cast<T*>(this)->set_endtime(Tracing::time());
if (_startTime == 0) {
static_cast<T*>(this)->set_starttime(Tracing::time());
} else {
if (_endTime == 0) {
static_cast<T*>(this)->set_endtime(Tracing::time());
}
}
if (static_cast<T*>(this)->should_write()) {
static_cast<T*>(this)->writeEvent();

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
@ -52,8 +52,8 @@
class TraceEvent {
public:
TraceEvent() {}
void set_starttime(const Ticks&amp; time) {}
void set_endtime(const Ticks&amp; time) {}
void set_starttime(const Ticks&amp; ignore) {}
void set_endtime(const Ticks&amp; ignore) {}
bool should_commit() const { return false; }
static bool is_enabled() { return false; }
void commit() {}

View File

@ -43,7 +43,7 @@ enum TraceEventId {
_traceeventbase = (NUM_RESERVED_EVENTS-1), // Make sure we start at right index.
// Events -> enum entry
<xsl:for-each select="trace/events/event">
<xsl:for-each select="trace/events/*">
<xsl:value-of select="concat(' Trace', @id, 'Event,', $newline)"/>
</xsl:for-each>
MaxTraceEventId

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -25,19 +25,28 @@
#ifndef SHARE_VM_TRACE_TRACEMACROS_HPP
#define SHARE_VM_TRACE_TRACEMACROS_HPP
typedef u8 traceid;
#define EVENT_THREAD_EXIT(thread)
#define EVENT_THREAD_DESTRUCT(thread)
#define TRACE_INIT_ID(k)
#define TRACE_INIT_KLASS_ID(k)
#define TRACE_INIT_THREAD_ID(td)
#define TRACE_DATA TraceThreadData
#define THREAD_TRACE_ID(thread) ((traceid)thread->osthread()->thread_id())
#define TRACE_START() JNI_OK
#define TRACE_INITIALIZE() JNI_OK
#define TRACE_DEFINE_KLASS_METHODS typedef int ___IGNORED_hs_trace_type1
#define TRACE_DEFINE_KLASS_TRACE_ID typedef int ___IGNORED_hs_trace_type2
#define TRACE_DEFINE_OFFSET typedef int ___IGNORED_hs_trace_type3
#define TRACE_ID_OFFSET in_ByteSize(0); ShouldNotReachHere()
#define TRACE_DEFINE_TRACE_ID_METHODS typedef int ___IGNORED_hs_trace_type1
#define TRACE_DEFINE_TRACE_ID_FIELD typedef int ___IGNORED_hs_trace_type2
#define TRACE_DEFINE_KLASS_TRACE_ID_OFFSET typedef int ___IGNORED_hs_trace_type3
#define TRACE_KLASS_TRACE_ID_OFFSET in_ByteSize(0); ShouldNotReachHere()
#define TRACE_DEFINE_THREAD_TRACE_DATA_OFFSET typedef int ___IGNORED_hs_trace_type4
#define TRACE_THREAD_TRACE_DATA_OFFSET in_ByteSize(0); ShouldNotReachHere()
#define TRACE_DEFINE_THREAD_TRACE_ID_OFFSET typedef int ___IGNORED_hs_trace_type5
#define TRACE_THREAD_TRACE_ID_OFFSET in_ByteSize(0); ShouldNotReachHere()
#define TRACE_DEFINE_THREAD_ID_SIZE typedef int ___IGNORED_hs_trace_type6
#define TRACE_TEMPLATES(template)
#define TRACE_INTRINSICS(do_intrinsic, do_class, do_name, do_signature, do_alias)

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
@ -60,27 +60,16 @@ Now we can use the content + data type in declaring event fields.
<types>
<content_types>
<content_type id="Thread" hr_name="Thread"
type="U4" builtin_type="OSTHREAD">
<value type="UTF8" field="name" label="Thread name"/>
</content_type>
<content_type id="VMThread" hr_name="VM Thread"
type="U8" jvm_type="VMTHREAD">
<value type="OSTHREAD" field="thread" label="VM Thread"/>
</content_type>
<content_type id="JavaThread" hr_name="Java thread"
type="U8" builtin_type="JAVALANGTHREAD">
<value type="OSTHREAD" field="thread" label="OS Thread ID"/>
<value type="BYTES64" field="allocInsideTla"
label="Allocated bytes inside TLAs"/>
<value type="BYTES64" field="allocOutsideTla"
label="Allocated bytes outside TLAs"/>
type="U8" builtin_type="THREAD">
<value type="UTF8" field="osName" label="OS Thread Name"/>
<value type="LONG" field="osThreadID" label="OS Thread ID"/>
<value type="UTF8" field="javaName" label="Java Lang Thread Name"/>
<value type="LONG" field="javaThreadID" label="Java Lang Thread ID"/>
<value type="THREADGROUP" field="group" label="Java Thread Group"/>
</content_type>
<content_type id="ThreadGroup" hr_name="Thread group"
type="U4" jvm_type="THREADGROUP">
type="U8" jvm_type="THREADGROUP">
<value type="THREADGROUP" field="parent" label="Parent"/>
<value type="UTF8" field="name" label="Name"/>
</content_type>
@ -107,82 +96,82 @@ Now we can use the content + data type in declaring event fields.
</content_type>
<content_type id="ThreadState" hr_name="Java Thread State"
type="U2" jvm_type="THREADSTATE">
type="U8" jvm_type="THREADSTATE">
<value type="UTF8" field="name" label="Name"/>
</content_type>
<content_type id="GCName" hr_name="GC Name"
type="U1" jvm_type="GCNAME">
type="U8" jvm_type="GCNAME">
<value type="UTF8" field="name" label="name" />
</content_type>
<content_type id="GCCause" hr_name="GC Cause"
type="U2" jvm_type="GCCAUSE">
type="U8" jvm_type="GCCAUSE">
<value type="UTF8" field="cause" label="cause" />
</content_type>
<content_type id="GCWhen" hr_name="GC When"
type="U1" jvm_type="GCWHEN">
type="U8" jvm_type="GCWHEN">
<value type="UTF8" field="when" label="when" />
</content_type>
<content_type id="G1HeapRegionType" hr_name="G1 Heap Region Type"
type="U1" jvm_type="G1HEAPREGIONTYPE">
type="U8" jvm_type="G1HEAPREGIONTYPE">
<value type="UTF8" field="type" label="type" />
</content_type>
<content_type id="G1YCType" hr_name="G1 YC Type"
type="U1" jvm_type="G1YCTYPE">
type="U8" jvm_type="G1YCTYPE">
<value type="UTF8" field="type" label="type" />
</content_type>
<content_type id="GCThresholdUpdater" hr_name="GC Treshold Updater"
type="U1" jvm_type="GCTHRESHOLDUPDATER">
type="U8" jvm_type="GCTHRESHOLDUPDATER">
<value type="UTF8" field="updater" label="updater" />
</content_type>
<content_type id="ReferenceType" hr_name="Reference Type"
type="U1" jvm_type="REFERENCETYPE">
type="U8" jvm_type="REFERENCETYPE">
<value type="UTF8" field="type" label="type" />
</content_type>
<content_type id="MetadataType" hr_name="Metadata Type"
type="U1" jvm_type="METADATATYPE">
type="U8" jvm_type="METADATATYPE">
<value type="UTF8" field="type" label="type" />
</content_type>
<content_type id="MetaspaceObjectType" hr_name="Metaspace Object Type"
type="U1" jvm_type="METASPACEOBJTYPE">
type="U8" jvm_type="METASPACEOBJTYPE">
<value type="UTF8" field="type" label="type" />
</content_type>
<content_type id="NARROW_OOP_MODE" hr_name="Narrow Oop Mode"
type="U1" jvm_type="NARROWOOPMODE">
type="U8" jvm_type="NARROWOOPMODE">
<value type="UTF8" field="mode" label="mode" />
</content_type>
<content_type id="VMOperationType" hr_name="VM Operation Type"
type="U2" jvm_type="VMOPERATIONTYPE">
type="U8" jvm_type="VMOPERATIONTYPE">
<value type="UTF8" field="type" label="type" />
</content_type>
<content_type id="CompilerPhaseType" hr_name="Compiler Phase Type"
type="U1" jvm_type="COMPILERPHASETYPE">
type="U8" jvm_type="COMPILERPHASETYPE">
<value type="UTF8" field="phase" label="phase" />
</content_type>
<content_type id="FlagValueOrigin" hr_name="Flag Value Origin"
type="U1" jvm_type="FLAGVALUEORIGIN">
type="U8" jvm_type="FLAGVALUEORIGIN">
<value type="UTF8" field="origin" label="origin" />
</content_type>
<content_type id="CodeBlobType" hr_name="Code Blob Type"
type="U1" jvm_type="CODEBLOBTYPE">
type="U8" jvm_type="CODEBLOBTYPE">
<value type="UTF8" field="type" label="type" />
</content_type>
<content_type id="InflateCause" hr_name="Inflation Cause"
type="U1" jvm_type="INFLATECAUSE">
type="U8" jvm_type="INFLATECAUSE">
<value type="UTF8" field="cause" label="cause" />
</content_type>
</content_types>
@ -245,11 +234,11 @@ Now we can use the content + data type in declaring event fields.
type="bool" sizeop="1"/>
<!-- 32-bit unsigned integer, SEMANTIC value BYTES -->
<primary_type symbol="BYTES" datatype="U4" contenttype="BYTES"
type="u4" sizeop="sizeof(u4)"/>
<primary_type symbol="BYTES" datatype="U8" contenttype="BYTES"
type="u8" sizeop="sizeof(u8)"/>
<primary_type symbol="IOBYTES" datatype="U4" contenttype="BYTES"
type="u4" sizeop="sizeof(u4)"/>
<primary_type symbol="IOBYTES" datatype="U8" contenttype="BYTES"
type="u8" sizeop="sizeof(u8)"/>
<!-- 64-bit unsigned integer, SEMANTIC value BYTES -->
<primary_type symbol="BYTES64" datatype="U8" contenttype="BYTES"
@ -280,122 +269,109 @@ Now we can use the content + data type in declaring event fields.
type="u8" sizeop="sizeof(u8)"/>
<!-- 32-bit float, SEMANTIC value PERCENTAGE (0.0-1.0) -->
<primary_type symbol="PERCENT" datatype="FLOAT" contenttype="PERCENTAGE"
<primary_type symbol="PERCENTAGE" datatype="FLOAT" contenttype="PERCENTAGE"
type="float" sizeop="sizeof(float)"/>
<!-- UTF-encoded string, max length 64k -->
<!-- UTF8-encoded string, max length Integer.MAX_VALUE -->
<primary_type symbol="UTF8" datatype="UTF8" contenttype="NONE"
type="const char *" sizeop="sizeof_utf(%)"/>
<!-- UTF-16 encoded (Unicode) string, max length maxjuint -->
<primary_type symbol="STRING" datatype="STRING" contenttype="NONE"
type="TraceUnicodeString*" sizeop="sizeof_unicode(%)"/>
type="const char*" sizeop="sizeof_utf(%)"/>
<!-- Symbol* constant. Note that this may currently ONLY be used by
classes, methods fields. This restriction might be lifted. -->
<primary_type symbol="SYMBOL" datatype="U8" contenttype="SYMBOL"
type="Symbol *" sizeop="sizeof(u8)"/>
type="const Symbol*" sizeop="sizeof(u8)"/>
<!-- A Klass *. The actual class is marked as "used" and will
eventually be written into the recording constant pool -->
<primary_type symbol="CLASS" datatype="U8" contenttype="CLASS"
type="Klass *" sizeop="sizeof(u8)"/>
type="const Klass*" sizeop="sizeof(u8)"/>
<!-- A Method *. The method is marked as "used" and will eventually be
written into the recording constant pool. -->
<primary_type symbol="METHOD" datatype="U8" contenttype="METHOD"
type="Method *" sizeop="sizeof(u8)"/>
type="const Method*" sizeop="sizeof(u8)"/>
<!-- The type for stacktraces in the recording. Shoudl not be used by
events explicitly -->
<primary_type symbol="STACKTRACE" datatype="U8" contenttype="STACKTRACE"
type="u8" sizeop="sizeof(u8)"/>
<!-- OS Thread ID -->
<primary_type symbol="OSTHREAD" datatype="U4" contenttype="OSTHREAD"
type="u4" sizeop="sizeof(u4)"/>
<!-- VM Thread ID Note: changed from U2 to U8 for hotspot -->
<primary_type symbol="VMTHREAD" datatype="U8" contenttype="VMTHREAD"
type="u8" sizeop="sizeof(u8)"/>
<!-- Java Thread ID -->
<primary_type symbol="JAVALANGTHREAD" datatype="LONG"
contenttype="JAVALANGTHREAD" type="s8"
sizeop="sizeof(s8)"/>
<!-- Thread ID -->
<primary_type symbol="THREAD" datatype="U8" contenttype="THREAD"
type="u8" sizeop="sizeof(u8)"/>
<!-- Threadgroup THIS TYPE MAY NOT BE USED IN NORMAL EVENTS (ATM). Only
for thread constant pool // KK TODO: u8 should be ObjectP -->
<primary_type symbol="THREADGROUP" datatype="U4" contenttype="THREADGROUP"
<primary_type symbol="THREADGROUP" datatype="U8" contenttype="THREADGROUP"
type="u8"
sizeop="sizeof(u4)"/>
sizeop="sizeof(u8)"/>
<!-- FRAMETYPE enum -->
<primary_type symbol="FRAMETYPE" datatype="U1" contenttype="FRAMETYPE"
type="u1" sizeop="sizeof(u1)"/>
<primary_type symbol="FRAMETYPE" datatype="U8" contenttype="FRAMETYPE"
type="u8" sizeop="sizeof(u8)"/>
<!-- THREADSTATE enum -->
<primary_type symbol="THREADSTATE" datatype="U2" contenttype="THREADSTATE"
type="u2" sizeop="sizeof(u2)"/>
<primary_type symbol="THREADSTATE" datatype="U8" contenttype="THREADSTATE"
type="u8" sizeop="sizeof(u8)"/>
<!-- GCName -->
<primary_type symbol="GCNAME" datatype="U1" contenttype="GCNAME"
type="u1" sizeop="sizeof(u1)" />
<primary_type symbol="GCNAME" datatype="U8" contenttype="GCNAME"
type="u8" sizeop="sizeof(u8)" />
<!-- GCCAUSE -->
<primary_type symbol="GCCAUSE" datatype="U2" contenttype="GCCAUSE"
type="u2" sizeop="sizeof(u2)" />
<primary_type symbol="GCCAUSE" datatype="U8" contenttype="GCCAUSE"
type="u8" sizeop="sizeof(u8)" />
<!-- GCWHEN -->
<primary_type symbol="GCWHEN" datatype="U1" contenttype="GCWHEN"
type="u1" sizeop="sizeof(u1)" />
<primary_type symbol="GCWHEN" datatype="U8" contenttype="GCWHEN"
type="u8" sizeop="sizeof(u8)" />
<!-- G1HEAPREGIONTYPE -->
<primary_type symbol="G1HEAPREGIONTYPE" datatype="U1" contenttype="G1HEAPREGIONTYPE"
type="u1" sizeop="sizeof(u1)" />
<primary_type symbol="G1HEAPREGIONTYPE" datatype="U8" contenttype="G1HEAPREGIONTYPE"
type="u8" sizeop="sizeof(u8)" />
<!-- G1YCType -->
<primary_type symbol="G1YCTYPE" datatype="U1" contenttype="G1YCTYPE"
type="u1" sizeop="sizeof(u1)" />
<primary_type symbol="G1YCTYPE" datatype="U8" contenttype="G1YCTYPE"
type="u8" sizeop="sizeof(u8)" />
<!-- GCTHRESHOLDUPDATER -->
<primary_type symbol="GCTHRESHOLDUPDATER" datatype="U1" contenttype="GCTHRESHOLDUPDATER"
type="u1" sizeop="sizeof(u1)" />
<primary_type symbol="GCTHRESHOLDUPDATER" datatype="U8" contenttype="GCTHRESHOLDUPDATER"
type="u8" sizeop="sizeof(u8)" />
<!-- REFERENCETYPE -->
<primary_type symbol="REFERENCETYPE" datatype="U1"
contenttype="REFERENCETYPE" type="u1" sizeop="sizeof(u1)" />
<primary_type symbol="REFERENCETYPE" datatype="U8"
contenttype="REFERENCETYPE" type="u8" sizeop="sizeof(u8)" />
<!-- METADATATYPE -->
<primary_type symbol="METADATATYPE" datatype="U1"
contenttype="METADATATYPE" type="u1" sizeop="sizeof(u1)" />
<primary_type symbol="METADATATYPE" datatype="U8"
contenttype="METADATATYPE" type="u8" sizeop="sizeof(u8)" />
<!-- METADATAOBJTYPE -->
<primary_type symbol="METASPACEOBJTYPE" datatype="U1"
contenttype="METASPACEOBJTYPE" type="u1" sizeop="sizeof(u1)" />
<primary_type symbol="METASPACEOBJTYPE" datatype="U8"
contenttype="METASPACEOBJTYPE" type="u8" sizeop="sizeof(u8)" />
<!-- NARROWOOPMODE -->
<primary_type symbol="NARROWOOPMODE" datatype="U1"
contenttype="NARROWOOPMODE" type="u1" sizeop="sizeof(u1)" />
<primary_type symbol="NARROWOOPMODE" datatype="U8"
contenttype="NARROWOOPMODE" type="u8" sizeop="sizeof(u8)" />
<!-- COMPILERPHASETYPE -->
<primary_type symbol="COMPILERPHASETYPE" datatype="U1"
contenttype="COMPILERPHASETYPE" type="u1" sizeop="sizeof(u1)" />
<primary_type symbol="COMPILERPHASETYPE" datatype="U8"
contenttype="COMPILERPHASETYPE" type="u8" sizeop="sizeof(u8)" />
<!-- VMOPERATIONTYPE -->
<primary_type symbol="VMOPERATIONTYPE" datatype="U2" contenttype="VMOPERATIONTYPE"
type="u2" sizeop="sizeof(u2)" />
<primary_type symbol="VMOPERATIONTYPE" datatype="U8" contenttype="VMOPERATIONTYPE"
type="u8" sizeop="sizeof(u8)" />
<!-- FLAGVALUEORIGIN -->
<primary_type symbol="FLAGVALUEORIGIN" datatype="U1"
contenttype="FLAGVALUEORIGIN" type="u1" sizeop="sizeof(u1)" />
<primary_type symbol="FLAGVALUEORIGIN" datatype="U8"
contenttype="FLAGVALUEORIGIN" type="u8" sizeop="sizeof(u8)" />
<!-- CODEBLOBTYPE -->
<primary_type symbol="CODEBLOBTYPE" datatype="U1"
contenttype="CODEBLOBTYPE" type="u1" sizeop="sizeof(u1)" />
<primary_type symbol="CODEBLOBTYPE" datatype="U8"
contenttype="CODEBLOBTYPE" type="u8" sizeop="sizeof(u8)" />
<!-- INFLATECAUSE -->
<primary_type symbol="INFLATECAUSE" datatype="U1"
contenttype="INFLATECAUSE" type="u1" sizeop="sizeof(u1)" />
<primary_type symbol="INFLATECAUSE" datatype="U8"
contenttype="INFLATECAUSE" type="u8" sizeop="sizeof(u8)" />
</primary_types>
</types>

View File

@ -51,9 +51,14 @@
#include "services/heapDumper.hpp"
#include "utilities/defaultStream.hpp"
#include "utilities/events.hpp"
#include "utilities/macros.hpp"
#include "utilities/top.hpp"
#include "utilities/vmError.hpp"
#if INCLUDE_TRACE
#include "trace/tracing.hpp"
#endif
#ifndef ASSERT
# ifdef _DEBUG
// NOTE: don't turn the lines below into a comment -- if you're getting
@ -280,6 +285,12 @@ void report_out_of_shared_space(SharedSpaceType shared_space) {
exit(2);
}
static void notify_tracing() {
#if INCLUDE_TRACE
Tracing::on_vm_error(true);
#endif
}
void report_insufficient_metaspace(size_t required_size) {
warning("\nThe MaxMetaspaceSize of " SIZE_FORMAT " bytes is not large enough.\n"
"Either don't specify the -XX:MaxMetaspaceSize=<size>\n"
@ -302,6 +313,8 @@ void report_java_out_of_memory(const char* message) {
HeapDumper::dump_heap_from_oome();
}
notify_tracing();
if (OnOutOfMemoryError && OnOutOfMemoryError[0]) {
VMError::report_java_out_of_memory(message);
}

View File

@ -383,4 +383,9 @@ template class BasicHashtable<mtClassShared>;
template class BasicHashtable<mtSymbol>;
template class BasicHashtable<mtCode>;
template class BasicHashtable<mtInternal>;
#if INCLUDE_TRACE
template class Hashtable<Symbol*, mtTracing>;
template class HashtableEntry<Symbol*, mtTracing>;
template class BasicHashtable<mtTracing>;
#endif
template class BasicHashtable<mtCompiler>;