Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(460)

Side by Side Diff: test/cctest/heap/test-mark-compact.cc

Issue 2310143002: [heap] Introduce enum of garbage collection reasons. (Closed)
Patch Set: fix win Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 v8::HandleScope sc(CcTest::isolate()); 82 v8::HandleScope sc(CcTest::isolate());
83 Heap* heap = isolate->heap(); 83 Heap* heap = isolate->heap();
84 84
85 heap::SealCurrentObjects(heap); 85 heap::SealCurrentObjects(heap);
86 86
87 int array_length = heap::FixedArrayLenFromSize(kMaxRegularHeapObjectSize); 87 int array_length = heap::FixedArrayLenFromSize(kMaxRegularHeapObjectSize);
88 Handle<FixedArray> array = isolate->factory()->NewFixedArray(array_length); 88 Handle<FixedArray> array = isolate->factory()->NewFixedArray(array_length);
89 89
90 // Array should be in the new space. 90 // Array should be in the new space.
91 CHECK(heap->InSpace(*array, NEW_SPACE)); 91 CHECK(heap->InSpace(*array, NEW_SPACE));
92 heap->CollectAllGarbage(); 92 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
93 heap->CollectAllGarbage(); 93 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
94 CHECK(heap->InSpace(*array, OLD_SPACE)); 94 CHECK(heap->InSpace(*array, OLD_SPACE));
95 } 95 }
96 } 96 }
97 97
98 HEAP_TEST(NoPromotion) { 98 HEAP_TEST(NoPromotion) {
99 CcTest::InitializeVM(); 99 CcTest::InitializeVM();
100 Isolate* isolate = CcTest::i_isolate(); 100 Isolate* isolate = CcTest::i_isolate();
101 { 101 {
102 v8::HandleScope sc(CcTest::isolate()); 102 v8::HandleScope sc(CcTest::isolate());
103 Heap* heap = isolate->heap(); 103 Heap* heap = isolate->heap();
104 104
105 heap::SealCurrentObjects(heap); 105 heap::SealCurrentObjects(heap);
106 106
107 int array_length = heap::FixedArrayLenFromSize(kMaxRegularHeapObjectSize); 107 int array_length = heap::FixedArrayLenFromSize(kMaxRegularHeapObjectSize);
108 Handle<FixedArray> array = isolate->factory()->NewFixedArray(array_length); 108 Handle<FixedArray> array = isolate->factory()->NewFixedArray(array_length);
109 109
110 heap->set_force_oom(true); 110 heap->set_force_oom(true);
111 // Array should be in the new space. 111 // Array should be in the new space.
112 CHECK(heap->InSpace(*array, NEW_SPACE)); 112 CHECK(heap->InSpace(*array, NEW_SPACE));
113 heap->CollectAllGarbage(); 113 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
114 heap->CollectAllGarbage(); 114 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
115 CHECK(heap->InSpace(*array, NEW_SPACE)); 115 CHECK(heap->InSpace(*array, NEW_SPACE));
116 } 116 }
117 } 117 }
118 118
119 HEAP_TEST(MarkCompactCollector) { 119 HEAP_TEST(MarkCompactCollector) {
120 FLAG_incremental_marking = false; 120 FLAG_incremental_marking = false;
121 FLAG_retain_maps_for_n_gc = 0; 121 FLAG_retain_maps_for_n_gc = 0;
122 CcTest::InitializeVM(); 122 CcTest::InitializeVM();
123 Isolate* isolate = CcTest::i_isolate(); 123 Isolate* isolate = CcTest::i_isolate();
124 Heap* heap = CcTest::heap(); 124 Heap* heap = CcTest::heap();
125 Factory* factory = isolate->factory(); 125 Factory* factory = isolate->factory();
126 126
127 v8::HandleScope sc(CcTest::isolate()); 127 v8::HandleScope sc(CcTest::isolate());
128 Handle<JSGlobalObject> global(isolate->context()->global_object()); 128 Handle<JSGlobalObject> global(isolate->context()->global_object());
129 129
130 // call mark-compact when heap is empty 130 // call mark-compact when heap is empty
131 heap->CollectGarbage(OLD_SPACE, "trigger 1"); 131 CcTest::CollectGarbage(OLD_SPACE);
132 132
133 // keep allocating garbage in new space until it fails 133 // keep allocating garbage in new space until it fails
134 const int arraysize = 100; 134 const int arraysize = 100;
135 AllocationResult allocation; 135 AllocationResult allocation;
136 do { 136 do {
137 allocation = heap->AllocateFixedArray(arraysize); 137 allocation = heap->AllocateFixedArray(arraysize);
138 } while (!allocation.IsRetry()); 138 } while (!allocation.IsRetry());
139 heap->CollectGarbage(NEW_SPACE, "trigger 2"); 139 CcTest::CollectGarbage(NEW_SPACE);
140 heap->AllocateFixedArray(arraysize).ToObjectChecked(); 140 heap->AllocateFixedArray(arraysize).ToObjectChecked();
141 141
142 // keep allocating maps until it fails 142 // keep allocating maps until it fails
143 do { 143 do {
144 allocation = heap->AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); 144 allocation = heap->AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
145 } while (!allocation.IsRetry()); 145 } while (!allocation.IsRetry());
146 heap->CollectGarbage(MAP_SPACE, "trigger 3"); 146 CcTest::CollectGarbage(MAP_SPACE);
147 heap->AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize).ToObjectChecked(); 147 heap->AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize).ToObjectChecked();
148 148
149 { HandleScope scope(isolate); 149 { HandleScope scope(isolate);
150 // allocate a garbage 150 // allocate a garbage
151 Handle<String> func_name = factory->InternalizeUtf8String("theFunction"); 151 Handle<String> func_name = factory->InternalizeUtf8String("theFunction");
152 Handle<JSFunction> function = factory->NewFunction(func_name); 152 Handle<JSFunction> function = factory->NewFunction(func_name);
153 JSReceiver::SetProperty(global, func_name, function, SLOPPY).Check(); 153 JSReceiver::SetProperty(global, func_name, function, SLOPPY).Check();
154 154
155 factory->NewJSObject(function); 155 factory->NewJSObject(function);
156 } 156 }
157 157
158 heap->CollectGarbage(OLD_SPACE, "trigger 4"); 158 CcTest::CollectGarbage(OLD_SPACE);
159 159
160 { HandleScope scope(isolate); 160 { HandleScope scope(isolate);
161 Handle<String> func_name = factory->InternalizeUtf8String("theFunction"); 161 Handle<String> func_name = factory->InternalizeUtf8String("theFunction");
162 CHECK(Just(true) == JSReceiver::HasOwnProperty(global, func_name)); 162 CHECK(Just(true) == JSReceiver::HasOwnProperty(global, func_name));
163 Handle<Object> func_value = 163 Handle<Object> func_value =
164 Object::GetProperty(global, func_name).ToHandleChecked(); 164 Object::GetProperty(global, func_name).ToHandleChecked();
165 CHECK(func_value->IsJSFunction()); 165 CHECK(func_value->IsJSFunction());
166 Handle<JSFunction> function = Handle<JSFunction>::cast(func_value); 166 Handle<JSFunction> function = Handle<JSFunction>::cast(func_value);
167 Handle<JSObject> obj = factory->NewJSObject(function); 167 Handle<JSObject> obj = factory->NewJSObject(function);
168 168
169 Handle<String> obj_name = factory->InternalizeUtf8String("theObject"); 169 Handle<String> obj_name = factory->InternalizeUtf8String("theObject");
170 JSReceiver::SetProperty(global, obj_name, obj, SLOPPY).Check(); 170 JSReceiver::SetProperty(global, obj_name, obj, SLOPPY).Check();
171 Handle<String> prop_name = factory->InternalizeUtf8String("theSlot"); 171 Handle<String> prop_name = factory->InternalizeUtf8String("theSlot");
172 Handle<Smi> twenty_three(Smi::FromInt(23), isolate); 172 Handle<Smi> twenty_three(Smi::FromInt(23), isolate);
173 JSReceiver::SetProperty(obj, prop_name, twenty_three, SLOPPY).Check(); 173 JSReceiver::SetProperty(obj, prop_name, twenty_three, SLOPPY).Check();
174 } 174 }
175 175
176 heap->CollectGarbage(OLD_SPACE, "trigger 5"); 176 CcTest::CollectGarbage(OLD_SPACE);
177 177
178 { HandleScope scope(isolate); 178 { HandleScope scope(isolate);
179 Handle<String> obj_name = factory->InternalizeUtf8String("theObject"); 179 Handle<String> obj_name = factory->InternalizeUtf8String("theObject");
180 CHECK(Just(true) == JSReceiver::HasOwnProperty(global, obj_name)); 180 CHECK(Just(true) == JSReceiver::HasOwnProperty(global, obj_name));
181 Handle<Object> object = 181 Handle<Object> object =
182 Object::GetProperty(global, obj_name).ToHandleChecked(); 182 Object::GetProperty(global, obj_name).ToHandleChecked();
183 CHECK(object->IsJSObject()); 183 CHECK(object->IsJSObject());
184 Handle<String> prop_name = factory->InternalizeUtf8String("theSlot"); 184 Handle<String> prop_name = factory->InternalizeUtf8String("theSlot");
185 CHECK_EQ(*Object::GetProperty(object, prop_name).ToHandleChecked(), 185 CHECK_EQ(*Object::GetProperty(object, prop_name).ToHandleChecked(),
186 Smi::FromInt(23)); 186 Smi::FromInt(23));
(...skipping 22 matching lines...) Expand all
209 do { 209 do {
210 Handle<Map> map = CreateMap(); 210 Handle<Map> map = CreateMap();
211 map->set_prototype(*root); 211 map->set_prototype(*root);
212 root = factory->NewJSObjectFromMap(map); 212 root = factory->NewJSObjectFromMap(map);
213 } while (CcTest::heap()->map_space()->MapPointersEncodable()); 213 } while (CcTest::heap()->map_space()->MapPointersEncodable());
214 } 214 }
215 // Now, as we don't have any handles to just allocated maps, we should 215 // Now, as we don't have any handles to just allocated maps, we should
216 // be able to trigger map compaction. 216 // be able to trigger map compaction.
217 // To give an additional chance to fail, try to force compaction which 217 // To give an additional chance to fail, try to force compaction which
218 // should be impossible right now. 218 // should be impossible right now.
219 CcTest::heap()->CollectAllGarbage(Heap::kForceCompactionMask); 219 CcTest::CollectAllGarbage(Heap::kForceCompactionMask);
220 // And now map pointers should be encodable again. 220 // And now map pointers should be encodable again.
221 CHECK(CcTest::heap()->map_space()->MapPointersEncodable()); 221 CHECK(CcTest::heap()->map_space()->MapPointersEncodable());
222 } 222 }
223 #endif 223 #endif
224 224
225 225
226 static int NumberOfWeakCalls = 0; 226 static int NumberOfWeakCalls = 0;
227 static void WeakPointerCallback(const v8::WeakCallbackInfo<void>& data) { 227 static void WeakPointerCallback(const v8::WeakCallbackInfo<void>& data) {
228 std::pair<v8::Persistent<v8::Value>*, int>* p = 228 std::pair<v8::Persistent<v8::Value>*, int>* p =
229 reinterpret_cast<std::pair<v8::Persistent<v8::Value>*, int>*>( 229 reinterpret_cast<std::pair<v8::Persistent<v8::Value>*, int>*>(
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 Object** g1_objects[] = { g1s1.location(), g1s2.location() }; 290 Object** g1_objects[] = { g1s1.location(), g1s2.location() };
291 Object** g2_objects[] = { g2s1.location(), g2s2.location() }; 291 Object** g2_objects[] = { g2s1.location(), g2s2.location() };
292 global_handles->AddObjectGroup(g1_objects, 2, NULL); 292 global_handles->AddObjectGroup(g1_objects, 2, NULL);
293 global_handles->SetReference(Handle<HeapObject>::cast(g1s1).location(), 293 global_handles->SetReference(Handle<HeapObject>::cast(g1s1).location(),
294 g1c1.location()); 294 g1c1.location());
295 global_handles->AddObjectGroup(g2_objects, 2, NULL); 295 global_handles->AddObjectGroup(g2_objects, 2, NULL);
296 global_handles->SetReference(Handle<HeapObject>::cast(g2s1).location(), 296 global_handles->SetReference(Handle<HeapObject>::cast(g2s1).location(),
297 g2c1.location()); 297 g2c1.location());
298 } 298 }
299 // Do a full GC 299 // Do a full GC
300 heap->CollectGarbage(OLD_SPACE); 300 CcTest::CollectGarbage(OLD_SPACE);
301 301
302 // All object should be alive. 302 // All object should be alive.
303 CHECK_EQ(0, NumberOfWeakCalls); 303 CHECK_EQ(0, NumberOfWeakCalls);
304 304
305 // Weaken the root. 305 // Weaken the root.
306 std::pair<Handle<Object>*, int> root_and_id(&root, 1234); 306 std::pair<Handle<Object>*, int> root_and_id(&root, 1234);
307 GlobalHandles::MakeWeak( 307 GlobalHandles::MakeWeak(
308 root.location(), reinterpret_cast<void*>(&root_and_id), 308 root.location(), reinterpret_cast<void*>(&root_and_id),
309 &WeakPointerCallback, v8::WeakCallbackType::kParameter); 309 &WeakPointerCallback, v8::WeakCallbackType::kParameter);
310 // But make children strong roots---all the objects (except for children) 310 // But make children strong roots---all the objects (except for children)
311 // should be collectable now. 311 // should be collectable now.
312 global_handles->ClearWeakness(g1c1.location()); 312 global_handles->ClearWeakness(g1c1.location());
313 global_handles->ClearWeakness(g2c1.location()); 313 global_handles->ClearWeakness(g2c1.location());
314 314
315 // Groups are deleted, rebuild groups. 315 // Groups are deleted, rebuild groups.
316 { 316 {
317 Object** g1_objects[] = { g1s1.location(), g1s2.location() }; 317 Object** g1_objects[] = { g1s1.location(), g1s2.location() };
318 Object** g2_objects[] = { g2s1.location(), g2s2.location() }; 318 Object** g2_objects[] = { g2s1.location(), g2s2.location() };
319 global_handles->AddObjectGroup(g1_objects, 2, NULL); 319 global_handles->AddObjectGroup(g1_objects, 2, NULL);
320 global_handles->SetReference(Handle<HeapObject>::cast(g1s1).location(), 320 global_handles->SetReference(Handle<HeapObject>::cast(g1s1).location(),
321 g1c1.location()); 321 g1c1.location());
322 global_handles->AddObjectGroup(g2_objects, 2, NULL); 322 global_handles->AddObjectGroup(g2_objects, 2, NULL);
323 global_handles->SetReference(Handle<HeapObject>::cast(g2s1).location(), 323 global_handles->SetReference(Handle<HeapObject>::cast(g2s1).location(),
324 g2c1.location()); 324 g2c1.location());
325 } 325 }
326 326
327 heap->CollectGarbage(OLD_SPACE); 327 CcTest::CollectGarbage(OLD_SPACE);
328 328
329 // All objects should be gone. 5 global handles in total. 329 // All objects should be gone. 5 global handles in total.
330 CHECK_EQ(5, NumberOfWeakCalls); 330 CHECK_EQ(5, NumberOfWeakCalls);
331 331
332 // And now make children weak again and collect them. 332 // And now make children weak again and collect them.
333 GlobalHandles::MakeWeak( 333 GlobalHandles::MakeWeak(
334 g1c1.location(), reinterpret_cast<void*>(&g1c1_and_id), 334 g1c1.location(), reinterpret_cast<void*>(&g1c1_and_id),
335 &WeakPointerCallback, v8::WeakCallbackType::kParameter); 335 &WeakPointerCallback, v8::WeakCallbackType::kParameter);
336 GlobalHandles::MakeWeak( 336 GlobalHandles::MakeWeak(
337 g2c1.location(), reinterpret_cast<void*>(&g2c1_and_id), 337 g2c1.location(), reinterpret_cast<void*>(&g2c1_and_id),
338 &WeakPointerCallback, v8::WeakCallbackType::kParameter); 338 &WeakPointerCallback, v8::WeakCallbackType::kParameter);
339 339
340 heap->CollectGarbage(OLD_SPACE); 340 CcTest::CollectGarbage(OLD_SPACE);
341 CHECK_EQ(7, NumberOfWeakCalls); 341 CHECK_EQ(7, NumberOfWeakCalls);
342 } 342 }
343 343
344 344
345 class TestRetainedObjectInfo : public v8::RetainedObjectInfo { 345 class TestRetainedObjectInfo : public v8::RetainedObjectInfo {
346 public: 346 public:
347 TestRetainedObjectInfo() : has_been_disposed_(false) {} 347 TestRetainedObjectInfo() : has_been_disposed_(false) {}
348 348
349 bool has_been_disposed() { return has_been_disposed_; } 349 bool has_been_disposed() { return has_been_disposed_; }
350 350
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 475
476 476
477 TEST(RegressJoinThreadsOnIsolateDeinit) { 477 TEST(RegressJoinThreadsOnIsolateDeinit) {
478 intptr_t size_limit = ShortLivingIsolate() * 2; 478 intptr_t size_limit = ShortLivingIsolate() * 2;
479 for (int i = 0; i < 10; i++) { 479 for (int i = 0; i < 10; i++) {
480 CHECK_GT(size_limit, ShortLivingIsolate()); 480 CHECK_GT(size_limit, ShortLivingIsolate());
481 } 481 }
482 } 482 }
483 483
484 #endif // __linux__ and !USE_SIMULATOR 484 #endif // __linux__ and !USE_SIMULATOR
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698