提交 dcf201eb 编写于 作者: M mlarsson

8065331: Add trace events for failed allocations

Reviewed-by: ehelin, jwilhelm
上级 9c7225ab
...@@ -209,6 +209,18 @@ void VM_GenCollectFull::doit() { ...@@ -209,6 +209,18 @@ void VM_GenCollectFull::doit() {
gch->do_full_collection(gch->must_clear_all_soft_refs(), _max_level); gch->do_full_collection(gch->must_clear_all_soft_refs(), _max_level);
} }
VM_CollectForMetadataAllocation::VM_CollectForMetadataAllocation(ClassLoaderData* loader_data,
size_t size,
Metaspace::MetadataType mdtype,
uint gc_count_before,
uint full_gc_count_before,
GCCause::Cause gc_cause)
: VM_GC_Operation(gc_count_before, gc_cause, full_gc_count_before, true),
_loader_data(loader_data), _size(size), _mdtype(mdtype), _result(NULL) {
assert(_size != 0, "An allocation should always be requested with this operation.");
AllocTracer::send_allocation_requiring_gc_event(_size * HeapWordSize, GCId::peek());
}
// Returns true iff concurrent GCs unloads metadata. // Returns true iff concurrent GCs unloads metadata.
bool VM_CollectForMetadataAllocation::initiate_concurrent_GC() { bool VM_CollectForMetadataAllocation::initiate_concurrent_GC() {
#if INCLUDE_ALL_GCS #if INCLUDE_ALL_GCS
...@@ -313,3 +325,11 @@ void VM_CollectForMetadataAllocation::doit() { ...@@ -313,3 +325,11 @@ void VM_CollectForMetadataAllocation::doit() {
set_gc_locked(); set_gc_locked();
} }
} }
VM_CollectForAllocation::VM_CollectForAllocation(size_t word_size, uint gc_count_before, GCCause::Cause cause)
: VM_GC_Operation(gc_count_before, cause), _result(NULL), _word_size(word_size) {
// Only report if operation was really caused by an allocation.
if (_word_size != 0) {
AllocTracer::send_allocation_requiring_gc_event(_word_size * HeapWordSize, GCId::peek());
}
}
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#ifndef SHARE_VM_GC_IMPLEMENTATION_SHARED_VMGCOPERATIONS_HPP #ifndef SHARE_VM_GC_IMPLEMENTATION_SHARED_VMGCOPERATIONS_HPP
#define SHARE_VM_GC_IMPLEMENTATION_SHARED_VMGCOPERATIONS_HPP #define SHARE_VM_GC_IMPLEMENTATION_SHARED_VMGCOPERATIONS_HPP
#include "gc_implementation/shared/gcId.hpp"
#include "memory/heapInspection.hpp" #include "memory/heapInspection.hpp"
#include "runtime/handles.hpp" #include "runtime/handles.hpp"
#include "runtime/jniHandles.hpp" #include "runtime/jniHandles.hpp"
...@@ -168,8 +169,7 @@ class VM_CollectForAllocation : public VM_GC_Operation { ...@@ -168,8 +169,7 @@ class VM_CollectForAllocation : public VM_GC_Operation {
HeapWord* _result; // Allocation result (NULL if allocation failed) HeapWord* _result; // Allocation result (NULL if allocation failed)
public: public:
VM_CollectForAllocation(size_t word_size, uint gc_count_before, GCCause::Cause cause) VM_CollectForAllocation(size_t word_size, uint gc_count_before, GCCause::Cause cause);
: VM_GC_Operation(gc_count_before, cause), _result(NULL), _word_size(word_size) {}
HeapWord* result() const { HeapWord* result() const {
return _result; return _result;
...@@ -220,10 +220,7 @@ class VM_CollectForMetadataAllocation: public VM_GC_Operation { ...@@ -220,10 +220,7 @@ class VM_CollectForMetadataAllocation: public VM_GC_Operation {
size_t size, Metaspace::MetadataType mdtype, size_t size, Metaspace::MetadataType mdtype,
uint gc_count_before, uint gc_count_before,
uint full_gc_count_before, uint full_gc_count_before,
GCCause::Cause gc_cause) GCCause::Cause gc_cause);
: VM_GC_Operation(gc_count_before, gc_cause, full_gc_count_before, true),
_loader_data(loader_data), _size(size), _mdtype(mdtype), _result(NULL) {
}
virtual VMOp_Type type() const { return VMOp_CollectForMetadataAllocation; } virtual VMOp_Type type() const { return VMOp_CollectForMetadataAllocation; }
virtual void doit(); virtual void doit();
MetaWord* result() const { return _result; } MetaWord* result() const { return _result; }
......
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
*/ */
#include "precompiled.hpp" #include "precompiled.hpp"
#include "gc_implementation/shared/gcId.hpp"
#include "gc_interface/allocTracer.hpp" #include "gc_interface/allocTracer.hpp"
#include "trace/tracing.hpp" #include "trace/tracing.hpp"
#include "runtime/handles.hpp" #include "runtime/handles.hpp"
...@@ -46,3 +47,12 @@ void AllocTracer::send_allocation_in_new_tlab_event(KlassHandle klass, size_t tl ...@@ -46,3 +47,12 @@ void AllocTracer::send_allocation_in_new_tlab_event(KlassHandle klass, size_t tl
event.commit(); event.commit();
} }
} }
void AllocTracer::send_allocation_requiring_gc_event(size_t size, const GCId& gcId) {
EventAllocationRequiringGC event;
if (event.should_commit()) {
event.set_gcId(gcId.id());
event.set_size(size);
event.commit();
}
}
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -32,6 +32,7 @@ class AllocTracer : AllStatic { ...@@ -32,6 +32,7 @@ class AllocTracer : AllStatic {
public: public:
static void send_allocation_outside_tlab_event(KlassHandle klass, size_t alloc_size); static void send_allocation_outside_tlab_event(KlassHandle klass, size_t alloc_size);
static void send_allocation_in_new_tlab_event(KlassHandle klass, size_t tlab_size, size_t alloc_size); static void send_allocation_in_new_tlab_event(KlassHandle klass, size_t tlab_size, size_t alloc_size);
static void send_allocation_requiring_gc_event(size_t size, const GCId& gcId);
}; };
#endif /* SHARE_VM_GC_INTERFACE_ALLOCTRACER_HPP */ #endif /* SHARE_VM_GC_INTERFACE_ALLOCTRACER_HPP */
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
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. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it
...@@ -352,6 +352,12 @@ Declares a structure type that can be used in other events. ...@@ -352,6 +352,12 @@ Declares a structure type that can be used in other events.
<value type="UTF8" field="name" label="Name" /> <value type="UTF8" field="name" label="Name" />
</event> </event>
<event id="AllocationRequiringGC" path="vm/gc/detailed/allocation_requiring_gc" label="Allocation Requiring GC"
has_thread="true" has_stacktrace="true" is_instant="true">
<value type="UINT" field="gcId" label="Pending GC ID" relation="GC_ID" />
<value type="BYTES64" field="size" label="Allocation Size" />
</event>
<!-- Compiler events --> <!-- Compiler events -->
<event id="Compilation" path="vm/compiler/compilation" label="Compilation" <event id="Compilation" path="vm/compiler/compilation" label="Compilation"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册