| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/heap/object-stats.h" | 5 #include "src/heap/object-stats.h" |
| 6 | 6 |
| 7 #include "src/counters.h" | 7 #include "src/counters.h" |
| 8 #include "src/heap/heap-inl.h" | 8 #include "src/heap/heap-inl.h" |
| 9 #include "src/isolate.h" | 9 #include "src/isolate.h" |
| 10 #include "src/macro-assembler.h" | 10 #include "src/macro-assembler.h" |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 } | 267 } |
| 268 } | 268 } |
| 269 } | 269 } |
| 270 | 270 |
| 271 template <class HashTable> | 271 template <class HashTable> |
| 272 void ObjectStatsCollector::RecordHashTableHelper(HeapObject* parent, | 272 void ObjectStatsCollector::RecordHashTableHelper(HeapObject* parent, |
| 273 HashTable* array, | 273 HashTable* array, |
| 274 int subtype) { | 274 int subtype) { |
| 275 int used = array->NumberOfElements() * HashTable::kEntrySize; | 275 int used = array->NumberOfElements() * HashTable::kEntrySize; |
| 276 CHECK_GE(array->Size(), used); | 276 CHECK_GE(array->Size(), used); |
| 277 size_t overhead = array->Size() - used; | 277 size_t overhead = array->Size() - used - |
| 278 HashTable::kElementsStartIndex * kPointerSize - |
| 279 FixedArray::kHeaderSize; |
| 278 RecordFixedArrayHelper(parent, array, subtype, overhead); | 280 RecordFixedArrayHelper(parent, array, subtype, overhead); |
| 279 } | 281 } |
| 280 | 282 |
| 281 void ObjectStatsCollector::RecordJSObjectDetails(JSObject* object) { | 283 void ObjectStatsCollector::RecordJSObjectDetails(JSObject* object) { |
| 282 size_t overhead = 0; | 284 size_t overhead = 0; |
| 283 FixedArrayBase* elements = object->elements(); | 285 FixedArrayBase* elements = object->elements(); |
| 284 if (CanRecordFixedArray(heap_, elements) && !IsCowArray(heap_, elements)) { | 286 if (CanRecordFixedArray(heap_, elements) && !IsCowArray(heap_, elements)) { |
| 285 if (elements->IsDictionary() && SameLiveness(object, elements)) { | 287 if (elements->IsDictionary() && SameLiveness(object, elements)) { |
| 286 SeededNumberDictionary* dict = SeededNumberDictionary::cast(elements); | 288 SeededNumberDictionary* dict = SeededNumberDictionary::cast(elements); |
| 287 RecordHashTableHelper(object, dict, DICTIONARY_ELEMENTS_SUB_TYPE); | 289 RecordHashTableHelper(object, dict, DICTIONARY_ELEMENTS_SUB_TYPE); |
| 288 } else { | 290 } else { |
| 289 if (IsFastHoleyElementsKind(object->GetElementsKind())) { | 291 if (IsFastHoleyElementsKind(object->GetElementsKind())) { |
| 290 int used = object->GetFastElementsUsage() * kPointerSize; | 292 int used = object->GetFastElementsUsage() * kPointerSize; |
| 291 if (object->GetElementsKind() == FAST_HOLEY_DOUBLE_ELEMENTS) used *= 2; | 293 if (object->GetElementsKind() == FAST_HOLEY_DOUBLE_ELEMENTS) used *= 2; |
| 292 CHECK_GE(elements->Size(), used); | 294 CHECK_GE(elements->Size(), used); |
| 293 overhead = elements->Size() - used; | 295 overhead = elements->Size() - used - FixedArray::kHeaderSize; |
| 294 } | 296 } |
| 295 stats_->RecordFixedArraySubTypeStats(elements, FAST_ELEMENTS_SUB_TYPE, | 297 stats_->RecordFixedArraySubTypeStats(elements, FAST_ELEMENTS_SUB_TYPE, |
| 296 elements->Size(), overhead); | 298 elements->Size(), overhead); |
| 297 } | 299 } |
| 298 } | 300 } |
| 299 | 301 |
| 300 overhead = 0; | 302 overhead = 0; |
| 301 FixedArrayBase* properties = object->properties(); | 303 FixedArrayBase* properties = object->properties(); |
| 302 if (CanRecordFixedArray(heap_, properties) && | 304 if (CanRecordFixedArray(heap_, properties) && |
| 303 SameLiveness(object, properties) && !IsCowArray(heap_, properties)) { | 305 SameLiveness(object, properties) && !IsCowArray(heap_, properties)) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 315 JSWeakCollection* obj) { | 317 JSWeakCollection* obj) { |
| 316 if (obj->table()->IsHashTable()) { | 318 if (obj->table()->IsHashTable()) { |
| 317 ObjectHashTable* table = ObjectHashTable::cast(obj->table()); | 319 ObjectHashTable* table = ObjectHashTable::cast(obj->table()); |
| 318 int used = table->NumberOfElements() * ObjectHashTable::kEntrySize; | 320 int used = table->NumberOfElements() * ObjectHashTable::kEntrySize; |
| 319 size_t overhead = table->Size() - used; | 321 size_t overhead = table->Size() - used; |
| 320 RecordFixedArrayHelper(obj, table, JS_WEAK_COLLECTION_SUB_TYPE, overhead); | 322 RecordFixedArrayHelper(obj, table, JS_WEAK_COLLECTION_SUB_TYPE, overhead); |
| 321 } | 323 } |
| 322 } | 324 } |
| 323 | 325 |
| 324 void ObjectStatsCollector::RecordJSCollectionDetails(JSObject* obj) { | 326 void ObjectStatsCollector::RecordJSCollectionDetails(JSObject* obj) { |
| 327 // The JS versions use a different HashTable implementation that cannot use |
| 328 // the regular helper. Since overall impact is usually small just record |
| 329 // without overhead. |
| 325 if (obj->IsJSMap()) { | 330 if (obj->IsJSMap()) { |
| 326 RecordHashTableHelper(nullptr, | 331 RecordFixedArrayHelper(nullptr, FixedArray::cast(JSMap::cast(obj)->table()), |
| 327 OrderedHashMap::cast(JSMap::cast(obj)->table()), | 332 JS_COLLECTION_SUB_TYPE, 0); |
| 328 JS_COLLECTION_SUB_TYPE); | |
| 329 } | 333 } |
| 330 if (obj->IsJSSet()) { | 334 if (obj->IsJSSet()) { |
| 331 RecordHashTableHelper(nullptr, | 335 RecordFixedArrayHelper(nullptr, FixedArray::cast(JSSet::cast(obj)->table()), |
| 332 OrderedHashSet::cast(JSSet::cast(obj)->table()), | 336 JS_COLLECTION_SUB_TYPE, 0); |
| 333 JS_COLLECTION_SUB_TYPE); | |
| 334 } | 337 } |
| 335 } | 338 } |
| 336 | 339 |
| 337 void ObjectStatsCollector::RecordScriptDetails(Script* obj) { | 340 void ObjectStatsCollector::RecordScriptDetails(Script* obj) { |
| 338 Object* infos = WeakFixedArray::cast(obj->shared_function_infos()); | 341 Object* infos = WeakFixedArray::cast(obj->shared_function_infos()); |
| 339 if (infos->IsWeakFixedArray()) | 342 if (infos->IsWeakFixedArray()) |
| 340 RecordFixedArrayHelper(obj, WeakFixedArray::cast(infos), | 343 RecordFixedArrayHelper(obj, WeakFixedArray::cast(infos), |
| 341 SHARED_FUNCTION_INFOS_SUB_TYPE, 0); | 344 SHARED_FUNCTION_INFOS_SUB_TYPE, 0); |
| 342 } | 345 } |
| 343 | 346 |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 } | 461 } |
| 459 if (array->IsNativeContext()) { | 462 if (array->IsNativeContext()) { |
| 460 Context* native_ctx = Context::cast(array); | 463 Context* native_ctx = Context::cast(array); |
| 461 RecordHashTableHelper(array, native_ctx->template_instantiations_cache(), | 464 RecordHashTableHelper(array, native_ctx->template_instantiations_cache(), |
| 462 TEMPLATE_INSTANTIATIONS_CACHE_SUB_TYPE); | 465 TEMPLATE_INSTANTIATIONS_CACHE_SUB_TYPE); |
| 463 } | 466 } |
| 464 } | 467 } |
| 465 | 468 |
| 466 } // namespace internal | 469 } // namespace internal |
| 467 } // namespace v8 | 470 } // namespace v8 |
| OLD | NEW |