提交 dcf201eb 编写于 作者: M mlarsson

8065331: Add trace events for failed allocations

Reviewed-by: ehelin, jwilhelm
上级 9c7225ab
......@@ -209,6 +209,18 @@ void VM_GenCollectFull::doit() {
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.
bool VM_CollectForMetadataAllocation::initiate_concurrent_GC() {
#if INCLUDE_ALL_GCS
......@@ -313,3 +325,11 @@ void VM_CollectForMetadataAllocation::doit() {
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 @@
#ifndef 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 "runtime/handles.hpp"
#include "runtime/jniHandles.hpp"
......@@ -168,8 +169,7 @@ class VM_CollectForAllocation : public VM_GC_Operation {
HeapWord* _result; // Allocation result (NULL if allocation failed)
public:
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) {}
VM_CollectForAllocation(size_t word_size, uint gc_count_before, GCCause::Cause cause);
HeapWord* result() const {
return _result;
......@@ -220,10 +220,7 @@ class VM_CollectForMetadataAllocation: public VM_GC_Operation {
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) {
}
GCCause::Cause gc_cause);
virtual VMOp_Type type() const { return VMOp_CollectForMetadataAllocation; }
virtual void doit();
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.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
#include "gc_implementation/shared/gcId.hpp"
#include "gc_interface/allocTracer.hpp"
#include "trace/tracing.hpp"
#include "runtime/handles.hpp"
......@@ -46,3 +47,12 @@ void AllocTracer::send_allocation_in_new_tlab_event(KlassHandle klass, size_t tl
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.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -32,6 +32,7 @@ class AllocTracer : AllStatic {
public:
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_requiring_gc_event(size_t size, const GCId& gcId);
};
#endif /* SHARE_VM_GC_INTERFACE_ALLOCTRACER_HPP */
<?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.
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.
<value type="UTF8" field="name" label="Name" />
</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 -->
<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.
先完成此消息的编辑!
想要评论请 注册