| OLD | NEW | 
|---|
| 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 2338 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2349     PrintF("Heap::SizeOfObjects: %" V8PRIdPTR | 2349     PrintF("Heap::SizeOfObjects: %" V8PRIdPTR | 
| 2350            ", " | 2350            ", " | 
| 2351            "Iterator: %" V8PRIdPTR | 2351            "Iterator: %" V8PRIdPTR | 
| 2352            ", " | 2352            ", " | 
| 2353            "delta: %" V8PRIdPTR "\n", | 2353            "delta: %" V8PRIdPTR "\n", | 
| 2354            size_of_objects_1, size_of_objects_2, delta); | 2354            size_of_objects_1, size_of_objects_2, delta); | 
| 2355     CHECK_GT(size_of_objects_2 / 20, delta); | 2355     CHECK_GT(size_of_objects_2 / 20, delta); | 
| 2356   } | 2356   } | 
| 2357 } | 2357 } | 
| 2358 | 2358 | 
| 2359 |  | 
| 2360 static void FillUpNewSpace(NewSpace* new_space) { |  | 
| 2361   // Fill up new space to the point that it is completely full. Make sure |  | 
| 2362   // that the scavenger does not undo the filling. |  | 
| 2363   Heap* heap = new_space->heap(); |  | 
| 2364   Isolate* isolate = heap->isolate(); |  | 
| 2365   Factory* factory = isolate->factory(); |  | 
| 2366   HandleScope scope(isolate); |  | 
| 2367   AlwaysAllocateScope always_allocate(isolate); |  | 
| 2368   intptr_t available = new_space->Capacity() - new_space->Size(); |  | 
| 2369   intptr_t number_of_fillers = (available / FixedArray::SizeFor(32)) - 1; |  | 
| 2370   for (intptr_t i = 0; i < number_of_fillers; i++) { |  | 
| 2371     CHECK(heap->InNewSpace(*factory->NewFixedArray(32, NOT_TENURED))); |  | 
| 2372   } |  | 
| 2373 } |  | 
| 2374 |  | 
| 2375 |  | 
| 2376 TEST(GrowAndShrinkNewSpace) { | 2359 TEST(GrowAndShrinkNewSpace) { | 
| 2377   // Avoid shrinking new space in GC epilogue. This can happen if allocation | 2360   // Avoid shrinking new space in GC epilogue. This can happen if allocation | 
| 2378   // throughput samples have been taken while executing the benchmark. | 2361   // throughput samples have been taken while executing the benchmark. | 
| 2379   FLAG_predictable = true; | 2362   FLAG_predictable = true; | 
| 2380 | 2363 | 
| 2381   CcTest::InitializeVM(); | 2364   CcTest::InitializeVM(); | 
| 2382   Heap* heap = CcTest::heap(); | 2365   Heap* heap = CcTest::heap(); | 
| 2383   NewSpace* new_space = heap->new_space(); | 2366   NewSpace* new_space = heap->new_space(); | 
| 2384 | 2367 | 
| 2385   if (heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) { | 2368   if (heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) { | 
| 2386     return; | 2369     return; | 
| 2387   } | 2370   } | 
| 2388 | 2371 | 
| 2389   // Explicitly growing should double the space capacity. | 2372   // Explicitly growing should double the space capacity. | 
| 2390   intptr_t old_capacity, new_capacity; | 2373   intptr_t old_capacity, new_capacity; | 
| 2391   old_capacity = new_space->TotalCapacity(); | 2374   old_capacity = new_space->TotalCapacity(); | 
| 2392   new_space->Grow(); | 2375   new_space->Grow(); | 
| 2393   new_capacity = new_space->TotalCapacity(); | 2376   new_capacity = new_space->TotalCapacity(); | 
| 2394   CHECK(2 * old_capacity == new_capacity); | 2377   CHECK_EQ(2 * old_capacity, new_capacity); | 
| 2395 | 2378 | 
| 2396   old_capacity = new_space->TotalCapacity(); | 2379   old_capacity = new_space->TotalCapacity(); | 
| 2397   FillUpNewSpace(new_space); | 2380   { | 
|  | 2381     v8::HandleScope temporary_scope(CcTest::isolate()); | 
|  | 2382     heap::SimulateFullSpace(new_space); | 
|  | 2383   } | 
| 2398   new_capacity = new_space->TotalCapacity(); | 2384   new_capacity = new_space->TotalCapacity(); | 
| 2399   CHECK(old_capacity == new_capacity); | 2385   CHECK_EQ(old_capacity, new_capacity); | 
| 2400 | 2386 | 
| 2401   // Explicitly shrinking should not affect space capacity. | 2387   // Explicitly shrinking should not affect space capacity. | 
| 2402   old_capacity = new_space->TotalCapacity(); | 2388   old_capacity = new_space->TotalCapacity(); | 
| 2403   new_space->Shrink(); | 2389   new_space->Shrink(); | 
| 2404   new_capacity = new_space->TotalCapacity(); | 2390   new_capacity = new_space->TotalCapacity(); | 
| 2405   CHECK(old_capacity == new_capacity); | 2391   CHECK_EQ(old_capacity, new_capacity); | 
| 2406 | 2392 | 
| 2407   // Let the scavenger empty the new space. | 2393   // Let the scavenger empty the new space. | 
| 2408   CcTest::CollectGarbage(NEW_SPACE); | 2394   CcTest::CollectGarbage(NEW_SPACE); | 
| 2409   CHECK_LE(new_space->Size(), old_capacity); | 2395   CHECK_LE(new_space->Size(), old_capacity); | 
| 2410 | 2396 | 
| 2411   // Explicitly shrinking should halve the space capacity. | 2397   // Explicitly shrinking should halve the space capacity. | 
| 2412   old_capacity = new_space->TotalCapacity(); | 2398   old_capacity = new_space->TotalCapacity(); | 
| 2413   new_space->Shrink(); | 2399   new_space->Shrink(); | 
| 2414   new_capacity = new_space->TotalCapacity(); | 2400   new_capacity = new_space->TotalCapacity(); | 
| 2415   CHECK(old_capacity == 2 * new_capacity); | 2401   CHECK_EQ(old_capacity, 2 * new_capacity); | 
| 2416 | 2402 | 
| 2417   // Consecutive shrinking should not affect space capacity. | 2403   // Consecutive shrinking should not affect space capacity. | 
| 2418   old_capacity = new_space->TotalCapacity(); | 2404   old_capacity = new_space->TotalCapacity(); | 
| 2419   new_space->Shrink(); | 2405   new_space->Shrink(); | 
| 2420   new_space->Shrink(); | 2406   new_space->Shrink(); | 
| 2421   new_space->Shrink(); | 2407   new_space->Shrink(); | 
| 2422   new_capacity = new_space->TotalCapacity(); | 2408   new_capacity = new_space->TotalCapacity(); | 
| 2423   CHECK(old_capacity == new_capacity); | 2409   CHECK_EQ(old_capacity, new_capacity); | 
| 2424 } | 2410 } | 
| 2425 | 2411 | 
| 2426 |  | 
| 2427 TEST(CollectingAllAvailableGarbageShrinksNewSpace) { | 2412 TEST(CollectingAllAvailableGarbageShrinksNewSpace) { | 
| 2428   CcTest::InitializeVM(); | 2413   CcTest::InitializeVM(); | 
| 2429   Heap* heap = CcTest::heap(); | 2414   Heap* heap = CcTest::heap(); | 
| 2430   if (heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) { | 2415   if (heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) { | 
| 2431     return; | 2416     return; | 
| 2432   } | 2417   } | 
| 2433 | 2418 | 
| 2434   v8::HandleScope scope(CcTest::isolate()); | 2419   v8::HandleScope scope(CcTest::isolate()); | 
| 2435   NewSpace* new_space = heap->new_space(); | 2420   NewSpace* new_space = heap->new_space(); | 
| 2436   intptr_t old_capacity, new_capacity; | 2421   intptr_t old_capacity, new_capacity; | 
| 2437   old_capacity = new_space->TotalCapacity(); | 2422   old_capacity = new_space->TotalCapacity(); | 
| 2438   new_space->Grow(); | 2423   new_space->Grow(); | 
| 2439   new_capacity = new_space->TotalCapacity(); | 2424   new_capacity = new_space->TotalCapacity(); | 
| 2440   CHECK(2 * old_capacity == new_capacity); | 2425   CHECK_EQ(2 * old_capacity, new_capacity); | 
| 2441   FillUpNewSpace(new_space); | 2426   { | 
|  | 2427     v8::HandleScope temporary_scope(CcTest::isolate()); | 
|  | 2428     heap::SimulateFullSpace(new_space); | 
|  | 2429   } | 
| 2442   CcTest::CollectAllAvailableGarbage(); | 2430   CcTest::CollectAllAvailableGarbage(); | 
| 2443   new_capacity = new_space->TotalCapacity(); | 2431   new_capacity = new_space->TotalCapacity(); | 
| 2444   CHECK(old_capacity == new_capacity); | 2432   CHECK_EQ(old_capacity, new_capacity); | 
| 2445 } | 2433 } | 
| 2446 | 2434 | 
| 2447 |  | 
| 2448 static int NumberOfGlobalObjects() { | 2435 static int NumberOfGlobalObjects() { | 
| 2449   int count = 0; | 2436   int count = 0; | 
| 2450   HeapIterator iterator(CcTest::heap()); | 2437   HeapIterator iterator(CcTest::heap()); | 
| 2451   for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { | 2438   for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { | 
| 2452     if (obj->IsJSGlobalObject()) count++; | 2439     if (obj->IsJSGlobalObject()) count++; | 
| 2453   } | 2440   } | 
| 2454   return count; | 2441   return count; | 
| 2455 } | 2442 } | 
| 2456 | 2443 | 
| 2457 | 2444 | 
| (...skipping 4660 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 7118       chunk, chunk->area_end() - kPointerSize, chunk->area_end()); | 7105       chunk, chunk->area_end() - kPointerSize, chunk->area_end()); | 
| 7119   slots[chunk->area_end() - kPointerSize] = false; | 7106   slots[chunk->area_end() - kPointerSize] = false; | 
| 7120   RememberedSet<OLD_TO_NEW>::Iterate(chunk, [&slots](Address addr) { | 7107   RememberedSet<OLD_TO_NEW>::Iterate(chunk, [&slots](Address addr) { | 
| 7121     CHECK(slots[addr]); | 7108     CHECK(slots[addr]); | 
| 7122     return KEEP_SLOT; | 7109     return KEEP_SLOT; | 
| 7123   }); | 7110   }); | 
| 7124 } | 7111 } | 
| 7125 | 7112 | 
| 7126 }  // namespace internal | 7113 }  // namespace internal | 
| 7127 }  // namespace v8 | 7114 }  // namespace v8 | 
| OLD | NEW | 
|---|