19d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes/* 29d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * Copyright (C) 2008 The Android Open Source Project 39d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * 49d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 59d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * you may not use this file except in compliance with the License. 69d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * You may obtain a copy of the License at 79d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * 89d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 99d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * 109d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * Unless required by applicable law or agreed to in writing, software 119d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 129d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * See the License for the specific language governing permissions and 149d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * limitations under the License. 159d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes */ 169d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_RUNTIME_STATS_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_RUNTIME_STATS_H_ 199d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 209d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes#include <stdint.h> 219d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 229d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughesnamespace art { 239d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 249d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes// These must match the values in dalvik.system.VMDebug. 259d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughesenum StatKinds { 269d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_ALLOCATED_OBJECTS = 1<<0, 279d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_ALLOCATED_BYTES = 1<<1, 289d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_FREED_OBJECTS = 1<<2, 299d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_FREED_BYTES = 1<<3, 309d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_GC_INVOCATIONS = 1<<4, 319d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_CLASS_INIT_COUNT = 1<<5, 329d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_CLASS_INIT_TIME = 1<<6, 339d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 349d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes // These values exist for backward compatibility. 359d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_EXT_ALLOCATED_OBJECTS = 1<<12, 369d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_EXT_ALLOCATED_BYTES = 1<<13, 379d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_EXT_FREED_OBJECTS = 1<<14, 389d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_EXT_FREED_BYTES = 1<<15, 399d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 409d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_GLOBAL_ALLOCATED_OBJECTS = KIND_ALLOCATED_OBJECTS, 419d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_GLOBAL_ALLOCATED_BYTES = KIND_ALLOCATED_BYTES, 429d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_GLOBAL_FREED_OBJECTS = KIND_FREED_OBJECTS, 439d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_GLOBAL_FREED_BYTES = KIND_FREED_BYTES, 449d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_GLOBAL_GC_INVOCATIONS = KIND_GC_INVOCATIONS, 459d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_GLOBAL_CLASS_INIT_COUNT = KIND_CLASS_INIT_COUNT, 469d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_GLOBAL_CLASS_INIT_TIME = KIND_CLASS_INIT_TIME, 479d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 489d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_THREAD_ALLOCATED_OBJECTS = KIND_ALLOCATED_OBJECTS << 16, 499d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_THREAD_ALLOCATED_BYTES = KIND_ALLOCATED_BYTES << 16, 509d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_THREAD_FREED_OBJECTS = KIND_FREED_OBJECTS << 16, 519d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_THREAD_FREED_BYTES = KIND_FREED_BYTES << 16, 529d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 539d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes KIND_THREAD_GC_INVOCATIONS = KIND_GC_INVOCATIONS << 16, 549d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 559d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes // TODO: failedAllocCount, failedAllocSize 569d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes}; 579d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 589d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes/* 599d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * Memory allocation profiler state. This is used both globally and 609d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * per-thread. 619d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes */ 62df1ce91ba97bc79a0637e5504b39318fb1c9f577Ian Rogersstruct PACKED(4) RuntimeStats { 639d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes RuntimeStats() { 649d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes Clear(~0); 659d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes } 669d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 679d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes void Clear(int flags) { 689d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes if ((flags & KIND_ALLOCATED_OBJECTS) != 0) { 699d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes allocated_objects = 0; 709d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes } 719d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes if ((flags & KIND_ALLOCATED_BYTES) != 0) { 729d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes allocated_bytes = 0; 739d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes } 749d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes if ((flags & KIND_FREED_OBJECTS) != 0) { 759d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes freed_objects = 0; 769d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes } 779d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes if ((flags & KIND_FREED_BYTES) != 0) { 789d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes freed_bytes = 0; 799d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes } 809d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes if ((flags & KIND_GC_INVOCATIONS) != 0) { 819d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes gc_for_alloc_count = 0; 829d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes } 839d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes if ((flags & KIND_CLASS_INIT_COUNT) != 0) { 849d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes class_init_count = 0; 859d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes } 869d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes if ((flags & KIND_CLASS_INIT_TIME) != 0) { 879d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes class_init_time_ns = 0; 889d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes } 899d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes } 909d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 919d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes // Number of objects allocated. 92dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers uint64_t allocated_objects; 939d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes // Cumulative size of all objects allocated. 94dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers uint64_t allocated_bytes; 959d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 969d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes // Number of objects freed. 97dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers uint64_t freed_objects; 989d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes // Cumulative size of all freed objects. 99dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers uint64_t freed_bytes; 1009d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 1019d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes // Number of times an allocation triggered a GC. 102dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers uint64_t gc_for_alloc_count; 1039d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 1049d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes // Number of initialized classes. 105dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers uint64_t class_init_count; 1069d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes // Cumulative time spent in class initialization. 1079d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes uint64_t class_init_time_ns; 1089d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 1099d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes DISALLOW_COPY_AND_ASSIGN(RuntimeStats); 1109d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes}; 1119d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 1129d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes} // namespace art 1139d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes 114fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_RUNTIME_STATS_H_ 115