sla@5237: /* sla@5237: * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. sla@5237: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. sla@5237: * sla@5237: * This code is free software; you can redistribute it and/or modify it sla@5237: * under the terms of the GNU General Public License version 2 only, as sla@5237: * published by the Free Software Foundation. sla@5237: * sla@5237: * This code is distributed in the hope that it will be useful, but WITHOUT sla@5237: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or sla@5237: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License sla@5237: * version 2 for more details (a copy is included in the LICENSE file that sla@5237: * accompanied this code). sla@5237: * sla@5237: * You should have received a copy of the GNU General Public License version sla@5237: * 2 along with this work; if not, write to the Free Software Foundation, sla@5237: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. sla@5237: * sla@5237: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA sla@5237: * or visit www.oracle.com if you need additional information or have any sla@5237: * questions. sla@5237: * sla@5237: */ sla@5237: sla@5237: #ifndef SHARE_VM_GC_IMPLEMENTATION_SHARED_GCTRACE_HPP sla@5237: #define SHARE_VM_GC_IMPLEMENTATION_SHARED_GCTRACE_HPP sla@5237: sla@5237: #include "gc_interface/gcCause.hpp" sla@5237: #include "gc_interface/gcName.hpp" brutisso@6904: #include "gc_implementation/shared/gcId.hpp" sla@5237: #include "gc_implementation/shared/gcWhen.hpp" sla@5237: #include "gc_implementation/shared/copyFailedInfo.hpp" sla@5237: #include "memory/allocation.hpp" ehelin@6420: #include "memory/metaspace.hpp" sla@5237: #include "memory/referenceType.hpp" sla@5237: #if INCLUDE_ALL_GCS sla@5237: #include "gc_implementation/g1/g1YCTypes.hpp" sla@5237: #endif sla@5237: #include "utilities/macros.hpp" mgronlun@6131: #include "utilities/ticks.hpp" sla@5237: sla@5237: sla@5237: class EvacuationInfo; sla@5237: class GCHeapSummary; ehelin@6420: class MetaspaceChunkFreeListSummary; sla@5237: class MetaspaceSummary; sla@5237: class PSHeapSummary; sla@5237: class ReferenceProcessorStats; sla@5237: class TimePartitions; sla@5237: class BoolObjectClosure; sla@5237: sla@5237: class SharedGCInfo VALUE_OBJ_CLASS_SPEC { sla@5237: private: brutisso@6904: GCId _gc_id; sla@5237: GCName _name; sla@5237: GCCause::Cause _cause; mgronlun@6131: Ticks _start_timestamp; mgronlun@6131: Ticks _end_timestamp; mgronlun@6131: Tickspan _sum_of_pauses; mgronlun@6131: Tickspan _longest_pause; sla@5237: sla@5237: public: mgronlun@6131: SharedGCInfo(GCName name) : brutisso@6904: _gc_id(GCId::undefined()), mgronlun@6131: _name(name), mgronlun@6131: _cause(GCCause::_last_gc_cause), mgronlun@6131: _start_timestamp(), mgronlun@6131: _end_timestamp(), mgronlun@6131: _sum_of_pauses(), mgronlun@6131: _longest_pause() { mgronlun@6131: } sla@5237: brutisso@6904: void set_gc_id(GCId gc_id) { _gc_id = gc_id; } brutisso@6904: const GCId& gc_id() const { return _gc_id; } sla@5237: mgronlun@6131: void set_start_timestamp(const Ticks& timestamp) { _start_timestamp = timestamp; } mgronlun@6131: const Ticks start_timestamp() const { return _start_timestamp; } sla@5237: mgronlun@6131: void set_end_timestamp(const Ticks& timestamp) { _end_timestamp = timestamp; } mgronlun@6131: const Ticks end_timestamp() const { return _end_timestamp; } sla@5237: sla@5237: void set_name(GCName name) { _name = name; } sla@5237: GCName name() const { return _name; } sla@5237: sla@5237: void set_cause(GCCause::Cause cause) { _cause = cause; } sla@5237: GCCause::Cause cause() const { return _cause; } sla@5237: mgronlun@6131: void set_sum_of_pauses(const Tickspan& duration) { _sum_of_pauses = duration; } mgronlun@6131: const Tickspan sum_of_pauses() const { return _sum_of_pauses; } sla@5237: mgronlun@6131: void set_longest_pause(const Tickspan& duration) { _longest_pause = duration; } mgronlun@6131: const Tickspan longest_pause() const { return _longest_pause; } sla@5237: }; sla@5237: sla@5237: class ParallelOldGCInfo VALUE_OBJ_CLASS_SPEC { sla@5237: void* _dense_prefix; sla@5237: public: sla@5237: ParallelOldGCInfo() : _dense_prefix(NULL) {} sla@5237: void report_dense_prefix(void* addr) { sla@5237: _dense_prefix = addr; sla@5237: } sla@5237: void* dense_prefix() const { return _dense_prefix; } sla@5237: }; sla@5237: sla@5237: #if INCLUDE_ALL_GCS sla@5237: sla@5237: class G1YoungGCInfo VALUE_OBJ_CLASS_SPEC { sla@5237: G1YCType _type; sla@5237: public: sla@5237: G1YoungGCInfo() : _type(G1YCTypeEndSentinel) {} sla@5237: void set_type(G1YCType type) { sla@5237: _type = type; sla@5237: } sla@5237: G1YCType type() const { return _type; } sla@5237: }; sla@5237: sla@5237: #endif // INCLUDE_ALL_GCS sla@5237: sla@5237: class GCTracer : public ResourceObj { sla@5237: protected: sla@5237: SharedGCInfo _shared_gc_info; sla@5237: sla@5237: public: mgronlun@6131: void report_gc_start(GCCause::Cause cause, const Ticks& timestamp); mgronlun@6131: void report_gc_end(const Ticks& timestamp, TimePartitions* time_partitions); ehelin@6420: void report_gc_heap_summary(GCWhen::Type when, const GCHeapSummary& heap_summary) const; ehelin@6420: void report_metaspace_summary(GCWhen::Type when, const MetaspaceSummary& metaspace_summary) const; sla@5237: void report_gc_reference_stats(const ReferenceProcessorStats& rp) const; sla@5237: void report_object_count_after_gc(BoolObjectClosure* object_filter) NOT_SERVICES_RETURN; sla@5237: bool has_reported_gc_start() const; brutisso@6904: const GCId& gc_id() { return _shared_gc_info.gc_id(); } sla@5237: sla@5237: protected: sla@5237: GCTracer(GCName name) : _shared_gc_info(name) {} brutisso@6904: void report_gc_start_impl(GCCause::Cause cause, const Ticks& timestamp); mgronlun@6131: virtual void report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions); sla@5237: sla@5237: private: sla@5237: void send_garbage_collection_event() const; sla@5237: void send_gc_heap_summary_event(GCWhen::Type when, const GCHeapSummary& heap_summary) const; sla@5237: void send_meta_space_summary_event(GCWhen::Type when, const MetaspaceSummary& meta_space_summary) const; ehelin@6420: void send_metaspace_chunk_free_list_summary(GCWhen::Type when, Metaspace::MetadataType mdtype, const MetaspaceChunkFreeListSummary& summary) const; sla@5237: void send_reference_stats_event(ReferenceType type, size_t count) const; sla@5237: void send_phase_events(TimePartitions* time_partitions) const; sla@5237: }; sla@5237: sla@5237: class YoungGCTracer : public GCTracer { sla@5237: static const uint UNSET_TENURING_THRESHOLD = (uint) -1; sla@5237: sla@5237: uint _tenuring_threshold; sla@5237: sla@5237: protected: sla@5237: YoungGCTracer(GCName name) : GCTracer(name), _tenuring_threshold(UNSET_TENURING_THRESHOLD) {} mgronlun@6131: virtual void report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions); sla@5237: sla@5237: public: sla@5237: void report_promotion_failed(const PromotionFailedInfo& pf_info); sla@5237: void report_tenuring_threshold(const uint tenuring_threshold); sla@5237: sla@5237: private: sla@5237: void send_young_gc_event() const; sla@5237: void send_promotion_failed_event(const PromotionFailedInfo& pf_info) const; sla@5237: }; sla@5237: sla@5237: class OldGCTracer : public GCTracer { sla@5237: protected: sla@5237: OldGCTracer(GCName name) : GCTracer(name) {} mgronlun@6131: virtual void report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions); sla@5237: sla@5237: public: sla@5237: void report_concurrent_mode_failure(); sla@5237: sla@5237: private: sla@5237: void send_old_gc_event() const; sla@5237: void send_concurrent_mode_failure_event(); sla@5237: }; sla@5237: sla@5237: class ParallelOldTracer : public OldGCTracer { sla@5237: ParallelOldGCInfo _parallel_old_gc_info; sla@5237: sla@5237: public: sla@5237: ParallelOldTracer() : OldGCTracer(ParallelOld) {} sla@5237: void report_dense_prefix(void* dense_prefix); sla@5237: sla@5237: protected: mgronlun@6131: void report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions); sla@5237: sla@5237: private: sla@5237: void send_parallel_old_event() const; sla@5237: }; sla@5237: sla@5237: class SerialOldTracer : public OldGCTracer { sla@5237: public: sla@5237: SerialOldTracer() : OldGCTracer(SerialOld) {} sla@5237: }; sla@5237: sla@5237: class ParallelScavengeTracer : public YoungGCTracer { sla@5237: public: sla@5237: ParallelScavengeTracer() : YoungGCTracer(ParallelScavenge) {} sla@5237: }; sla@5237: sla@5237: class DefNewTracer : public YoungGCTracer { sla@5237: public: sla@5237: DefNewTracer() : YoungGCTracer(DefNew) {} sla@5237: }; sla@5237: sla@5237: class ParNewTracer : public YoungGCTracer { sla@5237: public: sla@5237: ParNewTracer() : YoungGCTracer(ParNew) {} sla@5237: }; sla@5237: sla@5237: #if INCLUDE_ALL_GCS sla@5237: class G1NewTracer : public YoungGCTracer { sla@5237: G1YoungGCInfo _g1_young_gc_info; sla@5237: sla@5237: public: sla@5237: G1NewTracer() : YoungGCTracer(G1New) {} sla@5237: sla@5237: void report_yc_type(G1YCType type); mgronlun@6131: void report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions); sla@5237: void report_evacuation_info(EvacuationInfo* info); sla@5237: void report_evacuation_failed(EvacuationFailedInfo& ef_info); sla@5237: sla@5237: private: sla@5237: void send_g1_young_gc_event(); sla@5237: void send_evacuation_info_event(EvacuationInfo* info); sla@5237: void send_evacuation_failed_event(const EvacuationFailedInfo& ef_info) const; sla@5237: }; sla@5237: #endif sla@5237: sla@5237: class CMSTracer : public OldGCTracer { sla@5237: public: sla@5237: CMSTracer() : OldGCTracer(ConcurrentMarkSweep) {} sla@5237: }; sla@5237: sla@5237: class G1OldTracer : public OldGCTracer { sla@5237: public: sla@5237: G1OldTracer() : OldGCTracer(G1Old) {} sla@5237: }; sla@5237: sla@5237: #endif // SHARE_VM_GC_IMPLEMENTATION_SHARED_GCTRACE_HPP