OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "platform/globals.h" | 5 #include "platform/globals.h" |
6 | 6 |
7 #include "platform/assert.h" | 7 #include "platform/assert.h" |
8 #include "vm/become.h" | 8 #include "vm/become.h" |
9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
10 #include "vm/globals.h" | 10 #include "vm/globals.h" |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 EXPECT(!Dart_IsNull(result)); | 66 EXPECT(!Dart_IsNull(result)); |
67 EXPECT(Dart_IsList(result)); | 67 EXPECT(Dart_IsList(result)); |
68 TransitionNativeToVM transition(thread); | 68 TransitionNativeToVM transition(thread); |
69 Isolate* isolate = Isolate::Current(); | 69 Isolate* isolate = Isolate::Current(); |
70 Heap* heap = isolate->heap(); | 70 Heap* heap = isolate->heap(); |
71 heap->CollectGarbage(Heap::kOld); | 71 heap->CollectGarbage(Heap::kOld); |
72 Dart_ExitScope(); | 72 Dart_ExitScope(); |
73 heap->CollectGarbage(Heap::kOld); | 73 heap->CollectGarbage(Heap::kOld); |
74 } | 74 } |
75 | 75 |
76 | |
77 #ifndef PRODUCT | 76 #ifndef PRODUCT |
78 class ClassHeapStatsTestHelper { | 77 class ClassHeapStatsTestHelper { |
79 public: | 78 public: |
80 static ClassHeapStats* GetHeapStatsForCid(ClassTable* class_table, | 79 static ClassHeapStats* GetHeapStatsForCid(ClassTable* class_table, |
81 intptr_t cid) { | 80 intptr_t cid) { |
82 return class_table->PreliminaryStatsAt(cid); | 81 return class_table->PreliminaryStatsAt(cid); |
83 } | 82 } |
84 | 83 |
85 static void DumpClassHeapStats(ClassHeapStats* stats) { | 84 static void DumpClassHeapStats(ClassHeapStats* stats) { |
86 OS::Print("%" Pd " ", stats->recent.new_count); | 85 OS::Print("%" Pd " ", stats->recent.new_count); |
87 OS::Print("%" Pd " ", stats->post_gc.new_count); | 86 OS::Print("%" Pd " ", stats->post_gc.new_count); |
88 OS::Print("%" Pd " ", stats->pre_gc.new_count); | 87 OS::Print("%" Pd " ", stats->pre_gc.new_count); |
89 OS::Print("\n"); | 88 OS::Print("\n"); |
90 } | 89 } |
91 }; | 90 }; |
92 | 91 |
93 | |
94 static RawClass* GetClass(const Library& lib, const char* name) { | 92 static RawClass* GetClass(const Library& lib, const char* name) { |
95 const Class& cls = Class::Handle( | 93 const Class& cls = Class::Handle( |
96 lib.LookupClass(String::Handle(Symbols::New(Thread::Current(), name)))); | 94 lib.LookupClass(String::Handle(Symbols::New(Thread::Current(), name)))); |
97 EXPECT(!cls.IsNull()); // No ambiguity error expected. | 95 EXPECT(!cls.IsNull()); // No ambiguity error expected. |
98 return cls.raw(); | 96 return cls.raw(); |
99 } | 97 } |
100 | 98 |
101 | |
102 TEST_CASE(ClassHeapStats) { | 99 TEST_CASE(ClassHeapStats) { |
103 const char* kScriptChars = | 100 const char* kScriptChars = |
104 "class A {\n" | 101 "class A {\n" |
105 " var a;\n" | 102 " var a;\n" |
106 " var b;\n" | 103 " var b;\n" |
107 "}\n" | 104 "}\n" |
108 "" | 105 "" |
109 "main() {\n" | 106 "main() {\n" |
110 " var x = new A();\n" | 107 " var x = new A();\n" |
111 " return new A();\n" | 108 " return new A();\n" |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 EXPECT_EQ(1, class_stats->pre_gc.old_count); | 182 EXPECT_EQ(1, class_stats->pre_gc.old_count); |
186 EXPECT_EQ(0, class_stats->post_gc.old_count); | 183 EXPECT_EQ(0, class_stats->post_gc.old_count); |
187 EXPECT_EQ(0, class_stats->recent.old_count); | 184 EXPECT_EQ(0, class_stats->recent.old_count); |
188 // Perform GC. | 185 // Perform GC. |
189 heap->CollectGarbage(Heap::kOld); | 186 heap->CollectGarbage(Heap::kOld); |
190 EXPECT_EQ(0, class_stats->pre_gc.old_count); | 187 EXPECT_EQ(0, class_stats->pre_gc.old_count); |
191 EXPECT_EQ(0, class_stats->post_gc.old_count); | 188 EXPECT_EQ(0, class_stats->post_gc.old_count); |
192 EXPECT_EQ(0, class_stats->recent.old_count); | 189 EXPECT_EQ(0, class_stats->recent.old_count); |
193 } | 190 } |
194 | 191 |
195 | |
196 TEST_CASE(ArrayHeapStats) { | 192 TEST_CASE(ArrayHeapStats) { |
197 const char* kScriptChars = | 193 const char* kScriptChars = |
198 "List f(int len) {\n" | 194 "List f(int len) {\n" |
199 " return new List(len);\n" | 195 " return new List(len);\n" |
200 "}\n" | 196 "}\n" |
201 "" | 197 "" |
202 "main() {\n" | 198 "main() {\n" |
203 " return f(1234);\n" | 199 " return f(1234);\n" |
204 "}\n"; | 200 "}\n"; |
205 Dart_Handle h_lib = TestCase::LoadTestScript(kScriptChars, NULL); | 201 Dart_Handle h_lib = TestCase::LoadTestScript(kScriptChars, NULL); |
(...skipping 19 matching lines...) Expand all Loading... |
225 const intptr_t expected_size = Array::InstanceSize(1234); | 221 const intptr_t expected_size = Array::InstanceSize(1234); |
226 // Invoking the method might involve some additional tiny array allocations, | 222 // Invoking the method might involve some additional tiny array allocations, |
227 // so we allow slightly more than expected. | 223 // so we allow slightly more than expected. |
228 static const intptr_t kTolerance = 10 * kWordSize; | 224 static const intptr_t kTolerance = 10 * kWordSize; |
229 EXPECT_LE(expected_size, after - before); | 225 EXPECT_LE(expected_size, after - before); |
230 EXPECT_GT(expected_size + kTolerance, after - before); | 226 EXPECT_GT(expected_size + kTolerance, after - before); |
231 Dart_ExitScope(); | 227 Dart_ExitScope(); |
232 } | 228 } |
233 #endif // !PRODUCT | 229 #endif // !PRODUCT |
234 | 230 |
235 | |
236 class FindOnly : public FindObjectVisitor { | 231 class FindOnly : public FindObjectVisitor { |
237 public: | 232 public: |
238 explicit FindOnly(RawObject* target) : target_(target) { | 233 explicit FindOnly(RawObject* target) : target_(target) { |
239 #if defined(DEBUG) | 234 #if defined(DEBUG) |
240 EXPECT_GT(Thread::Current()->no_safepoint_scope_depth(), 0); | 235 EXPECT_GT(Thread::Current()->no_safepoint_scope_depth(), 0); |
241 #endif | 236 #endif |
242 } | 237 } |
243 virtual ~FindOnly() {} | 238 virtual ~FindOnly() {} |
244 | 239 |
245 virtual bool FindObject(RawObject* obj) const { return obj == target_; } | 240 virtual bool FindObject(RawObject* obj) const { return obj == target_; } |
246 | 241 |
247 private: | 242 private: |
248 RawObject* target_; | 243 RawObject* target_; |
249 }; | 244 }; |
250 | 245 |
251 | |
252 class FindNothing : public FindObjectVisitor { | 246 class FindNothing : public FindObjectVisitor { |
253 public: | 247 public: |
254 FindNothing() {} | 248 FindNothing() {} |
255 virtual ~FindNothing() {} | 249 virtual ~FindNothing() {} |
256 virtual bool FindObject(RawObject* obj) const { return false; } | 250 virtual bool FindObject(RawObject* obj) const { return false; } |
257 }; | 251 }; |
258 | 252 |
259 | |
260 TEST_CASE(FindObject) { | 253 TEST_CASE(FindObject) { |
261 Isolate* isolate = Isolate::Current(); | 254 Isolate* isolate = Isolate::Current(); |
262 Heap* heap = isolate->heap(); | 255 Heap* heap = isolate->heap(); |
263 Heap::Space spaces[2] = {Heap::kOld, Heap::kNew}; | 256 Heap::Space spaces[2] = {Heap::kOld, Heap::kNew}; |
264 for (size_t space = 0; space < ARRAY_SIZE(spaces); ++space) { | 257 for (size_t space = 0; space < ARRAY_SIZE(spaces); ++space) { |
265 const String& obj = String::Handle(String::New("x", spaces[space])); | 258 const String& obj = String::Handle(String::New("x", spaces[space])); |
266 { | 259 { |
267 NoSafepointScope no_safepoint; | 260 NoSafepointScope no_safepoint; |
268 FindOnly find_only(obj.raw()); | 261 FindOnly find_only(obj.raw()); |
269 EXPECT(obj.raw() == heap->FindObject(&find_only)); | 262 EXPECT(obj.raw() == heap->FindObject(&find_only)); |
270 } | 263 } |
271 } | 264 } |
272 { | 265 { |
273 NoSafepointScope no_safepoint; | 266 NoSafepointScope no_safepoint; |
274 FindNothing find_nothing; | 267 FindNothing find_nothing; |
275 EXPECT(Object::null() == heap->FindObject(&find_nothing)); | 268 EXPECT(Object::null() == heap->FindObject(&find_nothing)); |
276 } | 269 } |
277 } | 270 } |
278 | 271 |
279 | |
280 TEST_CASE(IterateReadOnly) { | 272 TEST_CASE(IterateReadOnly) { |
281 const String& obj = String::Handle(String::New("x", Heap::kOld)); | 273 const String& obj = String::Handle(String::New("x", Heap::kOld)); |
282 Heap* heap = Thread::Current()->isolate()->heap(); | 274 Heap* heap = Thread::Current()->isolate()->heap(); |
283 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); | 275 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); |
284 heap->WriteProtect(true); | 276 heap->WriteProtect(true); |
285 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); | 277 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); |
286 heap->WriteProtect(false); | 278 heap->WriteProtect(false); |
287 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); | 279 EXPECT(heap->Contains(RawObject::ToAddr(obj.raw()))); |
288 } | 280 } |
289 | 281 |
290 | |
291 void TestBecomeForward(Heap::Space before_space, Heap::Space after_space) { | 282 void TestBecomeForward(Heap::Space before_space, Heap::Space after_space) { |
292 Isolate* isolate = Isolate::Current(); | 283 Isolate* isolate = Isolate::Current(); |
293 Heap* heap = isolate->heap(); | 284 Heap* heap = isolate->heap(); |
294 | 285 |
295 const String& before_obj = String::Handle(String::New("old", before_space)); | 286 const String& before_obj = String::Handle(String::New("old", before_space)); |
296 const String& after_obj = String::Handle(String::New("new", after_space)); | 287 const String& after_obj = String::Handle(String::New("new", after_space)); |
297 | 288 |
298 EXPECT(before_obj.raw() != after_obj.raw()); | 289 EXPECT(before_obj.raw() != after_obj.raw()); |
299 | 290 |
300 // Allocate the arrays in old space to test the remembered set. | 291 // Allocate the arrays in old space to test the remembered set. |
301 const Array& before = Array::Handle(Array::New(1, Heap::kOld)); | 292 const Array& before = Array::Handle(Array::New(1, Heap::kOld)); |
302 before.SetAt(0, before_obj); | 293 before.SetAt(0, before_obj); |
303 const Array& after = Array::Handle(Array::New(1, Heap::kOld)); | 294 const Array& after = Array::Handle(Array::New(1, Heap::kOld)); |
304 after.SetAt(0, after_obj); | 295 after.SetAt(0, after_obj); |
305 | 296 |
306 Become::ElementsForwardIdentity(before, after); | 297 Become::ElementsForwardIdentity(before, after); |
307 | 298 |
308 EXPECT(before_obj.raw() == after_obj.raw()); | 299 EXPECT(before_obj.raw() == after_obj.raw()); |
309 | 300 |
310 heap->CollectAllGarbage(); | 301 heap->CollectAllGarbage(); |
311 | 302 |
312 EXPECT(before_obj.raw() == after_obj.raw()); | 303 EXPECT(before_obj.raw() == after_obj.raw()); |
313 } | 304 } |
314 | 305 |
315 | |
316 ISOLATE_UNIT_TEST_CASE(BecomeFowardOldToOld) { | 306 ISOLATE_UNIT_TEST_CASE(BecomeFowardOldToOld) { |
317 TestBecomeForward(Heap::kOld, Heap::kOld); | 307 TestBecomeForward(Heap::kOld, Heap::kOld); |
318 } | 308 } |
319 | 309 |
320 | |
321 ISOLATE_UNIT_TEST_CASE(BecomeFowardNewToNew) { | 310 ISOLATE_UNIT_TEST_CASE(BecomeFowardNewToNew) { |
322 TestBecomeForward(Heap::kNew, Heap::kNew); | 311 TestBecomeForward(Heap::kNew, Heap::kNew); |
323 } | 312 } |
324 | 313 |
325 | |
326 ISOLATE_UNIT_TEST_CASE(BecomeFowardOldToNew) { | 314 ISOLATE_UNIT_TEST_CASE(BecomeFowardOldToNew) { |
327 TestBecomeForward(Heap::kOld, Heap::kNew); | 315 TestBecomeForward(Heap::kOld, Heap::kNew); |
328 } | 316 } |
329 | 317 |
330 | |
331 ISOLATE_UNIT_TEST_CASE(BecomeFowardNewToOld) { | 318 ISOLATE_UNIT_TEST_CASE(BecomeFowardNewToOld) { |
332 TestBecomeForward(Heap::kNew, Heap::kOld); | 319 TestBecomeForward(Heap::kNew, Heap::kOld); |
333 } | 320 } |
334 | 321 |
335 | |
336 ISOLATE_UNIT_TEST_CASE(BecomeForwardRememberedObject) { | 322 ISOLATE_UNIT_TEST_CASE(BecomeForwardRememberedObject) { |
337 Isolate* isolate = Isolate::Current(); | 323 Isolate* isolate = Isolate::Current(); |
338 Heap* heap = isolate->heap(); | 324 Heap* heap = isolate->heap(); |
339 | 325 |
340 const String& new_element = String::Handle(String::New("new", Heap::kNew)); | 326 const String& new_element = String::Handle(String::New("new", Heap::kNew)); |
341 const String& old_element = String::Handle(String::New("old", Heap::kOld)); | 327 const String& old_element = String::Handle(String::New("old", Heap::kOld)); |
342 const Array& before_obj = Array::Handle(Array::New(1, Heap::kOld)); | 328 const Array& before_obj = Array::Handle(Array::New(1, Heap::kOld)); |
343 const Array& after_obj = Array::Handle(Array::New(1, Heap::kOld)); | 329 const Array& after_obj = Array::Handle(Array::New(1, Heap::kOld)); |
344 before_obj.SetAt(0, new_element); | 330 before_obj.SetAt(0, new_element); |
345 after_obj.SetAt(0, old_element); | 331 after_obj.SetAt(0, old_element); |
(...skipping 10 matching lines...) Expand all Loading... |
356 Become::ElementsForwardIdentity(before, after); | 342 Become::ElementsForwardIdentity(before, after); |
357 | 343 |
358 EXPECT(before_obj.raw() == after_obj.raw()); | 344 EXPECT(before_obj.raw() == after_obj.raw()); |
359 EXPECT(!after_obj.raw()->IsRemembered()); | 345 EXPECT(!after_obj.raw()->IsRemembered()); |
360 | 346 |
361 heap->CollectAllGarbage(); | 347 heap->CollectAllGarbage(); |
362 | 348 |
363 EXPECT(before_obj.raw() == after_obj.raw()); | 349 EXPECT(before_obj.raw() == after_obj.raw()); |
364 } | 350 } |
365 | 351 |
366 | |
367 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadOldToNew) { | 352 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadOldToNew) { |
368 Isolate* isolate = Isolate::Current(); | 353 Isolate* isolate = Isolate::Current(); |
369 Heap* heap = isolate->heap(); | 354 Heap* heap = isolate->heap(); |
370 | 355 |
371 heap->CollectAllGarbage(); | 356 heap->CollectAllGarbage(); |
372 intptr_t size_before = | 357 intptr_t size_before = |
373 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 358 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
374 | 359 |
375 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 360 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
376 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 361 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
377 old.SetAt(0, neu); | 362 old.SetAt(0, neu); |
378 old = Array::null(); | 363 old = Array::null(); |
379 neu = Array::null(); | 364 neu = Array::null(); |
380 | 365 |
381 heap->CollectAllGarbage(); | 366 heap->CollectAllGarbage(); |
382 | 367 |
383 intptr_t size_after = | 368 intptr_t size_after = |
384 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 369 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
385 | 370 |
386 EXPECT(size_before == size_after); | 371 EXPECT(size_before == size_after); |
387 } | 372 } |
388 | 373 |
389 | |
390 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadNewToOld) { | 374 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadNewToOld) { |
391 Isolate* isolate = Isolate::Current(); | 375 Isolate* isolate = Isolate::Current(); |
392 Heap* heap = isolate->heap(); | 376 Heap* heap = isolate->heap(); |
393 | 377 |
394 heap->CollectAllGarbage(); | 378 heap->CollectAllGarbage(); |
395 intptr_t size_before = | 379 intptr_t size_before = |
396 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 380 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
397 | 381 |
398 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 382 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
399 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 383 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
400 neu.SetAt(0, old); | 384 neu.SetAt(0, old); |
401 old = Array::null(); | 385 old = Array::null(); |
402 neu = Array::null(); | 386 neu = Array::null(); |
403 | 387 |
404 heap->CollectAllGarbage(); | 388 heap->CollectAllGarbage(); |
405 | 389 |
406 intptr_t size_after = | 390 intptr_t size_after = |
407 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 391 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
408 | 392 |
409 EXPECT(size_before == size_after); | 393 EXPECT(size_before == size_after); |
410 } | 394 } |
411 | 395 |
412 | |
413 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadGenCycle) { | 396 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_DeadGenCycle) { |
414 Isolate* isolate = Isolate::Current(); | 397 Isolate* isolate = Isolate::Current(); |
415 Heap* heap = isolate->heap(); | 398 Heap* heap = isolate->heap(); |
416 | 399 |
417 heap->CollectAllGarbage(); | 400 heap->CollectAllGarbage(); |
418 intptr_t size_before = | 401 intptr_t size_before = |
419 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 402 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
420 | 403 |
421 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 404 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
422 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 405 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
423 neu.SetAt(0, old); | 406 neu.SetAt(0, old); |
424 old.SetAt(0, neu); | 407 old.SetAt(0, neu); |
425 old = Array::null(); | 408 old = Array::null(); |
426 neu = Array::null(); | 409 neu = Array::null(); |
427 | 410 |
428 heap->CollectAllGarbage(); | 411 heap->CollectAllGarbage(); |
429 | 412 |
430 intptr_t size_after = | 413 intptr_t size_after = |
431 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 414 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
432 | 415 |
433 EXPECT(size_before == size_after); | 416 EXPECT(size_before == size_after); |
434 } | 417 } |
435 | 418 |
436 | |
437 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewToOld) { | 419 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewToOld) { |
438 Isolate* isolate = Isolate::Current(); | 420 Isolate* isolate = Isolate::Current(); |
439 Heap* heap = isolate->heap(); | 421 Heap* heap = isolate->heap(); |
440 | 422 |
441 heap->CollectAllGarbage(); | 423 heap->CollectAllGarbage(); |
442 intptr_t size_before = | 424 intptr_t size_before = |
443 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 425 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
444 | 426 |
445 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 427 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
446 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 428 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
447 neu.SetAt(0, old); | 429 neu.SetAt(0, old); |
448 old = Array::null(); | 430 old = Array::null(); |
449 | 431 |
450 heap->CollectAllGarbage(); | 432 heap->CollectAllGarbage(); |
451 | 433 |
452 intptr_t size_after = | 434 intptr_t size_after = |
453 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 435 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
454 | 436 |
455 EXPECT(size_before < size_after); | 437 EXPECT(size_before < size_after); |
456 } | 438 } |
457 | 439 |
458 | |
459 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldToNew) { | 440 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldToNew) { |
460 Isolate* isolate = Isolate::Current(); | 441 Isolate* isolate = Isolate::Current(); |
461 Heap* heap = isolate->heap(); | 442 Heap* heap = isolate->heap(); |
462 | 443 |
463 heap->CollectAllGarbage(); | 444 heap->CollectAllGarbage(); |
464 intptr_t size_before = | 445 intptr_t size_before = |
465 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 446 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
466 | 447 |
467 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 448 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
468 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 449 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
469 old.SetAt(0, neu); | 450 old.SetAt(0, neu); |
470 neu = Array::null(); | 451 neu = Array::null(); |
471 | 452 |
472 heap->CollectAllGarbage(); | 453 heap->CollectAllGarbage(); |
473 | 454 |
474 intptr_t size_after = | 455 intptr_t size_after = |
475 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 456 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
476 | 457 |
477 EXPECT(size_before < size_after); | 458 EXPECT(size_before < size_after); |
478 } | 459 } |
479 | 460 |
480 | |
481 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldDeadNew) { | 461 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldDeadNew) { |
482 Isolate* isolate = Isolate::Current(); | 462 Isolate* isolate = Isolate::Current(); |
483 Heap* heap = isolate->heap(); | 463 Heap* heap = isolate->heap(); |
484 | 464 |
485 heap->CollectAllGarbage(); | 465 heap->CollectAllGarbage(); |
486 intptr_t size_before = | 466 intptr_t size_before = |
487 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 467 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
488 | 468 |
489 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 469 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
490 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 470 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
491 neu = Array::null(); | 471 neu = Array::null(); |
492 old.SetAt(0, old); | 472 old.SetAt(0, old); |
493 | 473 |
494 heap->CollectAllGarbage(); | 474 heap->CollectAllGarbage(); |
495 | 475 |
496 intptr_t size_after = | 476 intptr_t size_after = |
497 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 477 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
498 | 478 |
499 EXPECT(size_before < size_after); | 479 EXPECT(size_before < size_after); |
500 } | 480 } |
501 | 481 |
502 | |
503 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewDeadOld) { | 482 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewDeadOld) { |
504 Isolate* isolate = Isolate::Current(); | 483 Isolate* isolate = Isolate::Current(); |
505 Heap* heap = isolate->heap(); | 484 Heap* heap = isolate->heap(); |
506 | 485 |
507 heap->CollectAllGarbage(); | 486 heap->CollectAllGarbage(); |
508 intptr_t size_before = | 487 intptr_t size_before = |
509 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 488 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
510 | 489 |
511 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 490 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
512 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 491 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
513 old = Array::null(); | 492 old = Array::null(); |
514 neu.SetAt(0, neu); | 493 neu.SetAt(0, neu); |
515 | 494 |
516 heap->CollectAllGarbage(); | 495 heap->CollectAllGarbage(); |
517 | 496 |
518 intptr_t size_after = | 497 intptr_t size_after = |
519 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 498 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
520 | 499 |
521 EXPECT(size_before < size_after); | 500 EXPECT(size_before < size_after); |
522 } | 501 } |
523 | 502 |
524 | |
525 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewToOldChain) { | 503 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveNewToOldChain) { |
526 Isolate* isolate = Isolate::Current(); | 504 Isolate* isolate = Isolate::Current(); |
527 Heap* heap = isolate->heap(); | 505 Heap* heap = isolate->heap(); |
528 | 506 |
529 heap->CollectAllGarbage(); | 507 heap->CollectAllGarbage(); |
530 intptr_t size_before = | 508 intptr_t size_before = |
531 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 509 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
532 | 510 |
533 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 511 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
534 Array& old2 = Array::Handle(Array::New(1, Heap::kOld)); | 512 Array& old2 = Array::Handle(Array::New(1, Heap::kOld)); |
535 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 513 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
536 old.SetAt(0, old2); | 514 old.SetAt(0, old2); |
537 neu.SetAt(0, old); | 515 neu.SetAt(0, old); |
538 old = Array::null(); | 516 old = Array::null(); |
539 old2 = Array::null(); | 517 old2 = Array::null(); |
540 | 518 |
541 heap->CollectAllGarbage(); | 519 heap->CollectAllGarbage(); |
542 | 520 |
543 intptr_t size_after = | 521 intptr_t size_after = |
544 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 522 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
545 | 523 |
546 EXPECT(size_before < size_after); | 524 EXPECT(size_before < size_after); |
547 } | 525 } |
548 | 526 |
549 | |
550 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldToNewChain) { | 527 ISOLATE_UNIT_TEST_CASE(CollectAllGarbage_LiveOldToNewChain) { |
551 Isolate* isolate = Isolate::Current(); | 528 Isolate* isolate = Isolate::Current(); |
552 Heap* heap = isolate->heap(); | 529 Heap* heap = isolate->heap(); |
553 | 530 |
554 heap->CollectAllGarbage(); | 531 heap->CollectAllGarbage(); |
555 intptr_t size_before = | 532 intptr_t size_before = |
556 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 533 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
557 | 534 |
558 Array& old = Array::Handle(Array::New(1, Heap::kOld)); | 535 Array& old = Array::Handle(Array::New(1, Heap::kOld)); |
559 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); | 536 Array& neu = Array::Handle(Array::New(1, Heap::kNew)); |
560 Array& neu2 = Array::Handle(Array::New(1, Heap::kOld)); | 537 Array& neu2 = Array::Handle(Array::New(1, Heap::kOld)); |
561 neu.SetAt(0, neu2); | 538 neu.SetAt(0, neu2); |
562 old.SetAt(0, neu); | 539 old.SetAt(0, neu); |
563 neu = Array::null(); | 540 neu = Array::null(); |
564 neu2 = Array::null(); | 541 neu2 = Array::null(); |
565 | 542 |
566 heap->CollectAllGarbage(); | 543 heap->CollectAllGarbage(); |
567 | 544 |
568 intptr_t size_after = | 545 intptr_t size_after = |
569 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); | 546 heap->new_space()->UsedInWords() + heap->old_space()->UsedInWords(); |
570 | 547 |
571 EXPECT(size_before < size_after); | 548 EXPECT(size_before < size_after); |
572 } | 549 } |
573 | 550 |
574 } // namespace dart | 551 } // namespace dart |
OLD | NEW |