--- old/src/share/vm/memory/metaspace.cpp 2014-03-13 17:22:18.578866405 +0100 +++ new/src/share/vm/memory/metaspace.cpp 2014-03-13 17:22:18.478866400 +0100 @@ -3371,7 +3371,7 @@ } if (result == NULL) { - report_metadata_oome(loader_data, word_size, mdtype, CHECK_NULL); + report_metadata_oome(loader_data, word_size, type, mdtype, CHECK_NULL); } // Zero initialize. @@ -3385,7 +3385,9 @@ return class_vsm()->calc_chunk_size(word_size); } -void Metaspace::report_metadata_oome(ClassLoaderData* loader_data, size_t word_size, MetadataType mdtype, TRAPS) { +void Metaspace::report_metadata_oome(ClassLoaderData* loader_data, size_t word_size, MetaspaceObj::Type type, MetadataType mdtype, TRAPS) { + tracer()->report_metadata_oom(loader_data, word_size, type, mdtype); + // If result is still null, we are out of memory. if (Verbose && TraceMetadataChunkAllocation) { gclog_or_tty->print_cr("Metaspace allocation failed for size " --- old/src/share/vm/memory/metaspace.hpp 2014-03-13 17:22:19.118866430 +0100 +++ new/src/share/vm/memory/metaspace.hpp 2014-03-13 17:22:19.018866425 +0100 @@ -239,7 +239,7 @@ static void purge(); static void report_metadata_oome(ClassLoaderData* loader_data, size_t word_size, - MetadataType mdtype, TRAPS); + MetaspaceObj::Type type, MetadataType mdtype, TRAPS); static const char* metadata_type_name(Metaspace::MetadataType mdtype); --- old/src/share/vm/memory/metaspaceTracer.cpp 2014-03-13 17:22:19.626866454 +0100 +++ new/src/share/vm/memory/metaspaceTracer.cpp 2014-03-13 17:22:19.526866449 +0100 @@ -44,7 +44,22 @@ size_t word_size, MetaspaceObj::Type objtype, Metaspace::MetadataType mdtype) const { - EventMetaspaceAllocationFailure event; + send_allocation_failure_event(cld, word_size, objtype, mdtype); +} + +void MetaspaceTracer::report_metadata_oom(ClassLoaderData *cld, + size_t word_size, + MetaspaceObj::Type objtype, + Metaspace::MetadataType mdtype) const { + send_allocation_failure_event(cld, word_size, objtype, mdtype); +} + +template +void MetaspaceTracer::send_allocation_failure_event(ClassLoaderData *cld, + size_t word_size, + MetaspaceObj::Type objtype, + Metaspace::MetadataType mdtype) const { + E event; if (event.should_commit()) { if (cld->is_anonymous()) { event.set_classLoader(NULL); --- old/src/share/vm/memory/metaspaceTracer.hpp 2014-03-13 17:22:20.130866477 +0100 +++ new/src/share/vm/memory/metaspaceTracer.hpp 2014-03-13 17:22:20.034866472 +0100 @@ -32,6 +32,11 @@ class ClassLoaderData; class MetaspaceTracer : public CHeapObj { + template + void send_allocation_failure_event(ClassLoaderData *cld, + size_t word_size, + MetaspaceObj::Type objtype, + Metaspace::MetadataType mdtype) const; public: void report_gc_threshold(size_t old_val, size_t new_val, @@ -40,6 +45,11 @@ size_t word_size, MetaspaceObj::Type objtype, Metaspace::MetadataType mdtype) const; + void report_metadata_oom(ClassLoaderData *cld, + size_t word_size, + MetaspaceObj::Type objtype, + Metaspace::MetadataType mdtype) const; + }; #endif // SHARE_VM_MEMORY_METASPACE_TRACER_HPP --- old/src/share/vm/trace/trace.xml 2014-03-13 17:22:20.642866501 +0100 +++ new/src/share/vm/trace/trace.xml 2014-03-13 17:22:20.542866496 +0100 @@ -213,6 +213,14 @@ + + + + + + + +