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 1666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1677 | 1677 |
1678 | 1678 |
1679 static void FillUpNewSpace(NewSpace* new_space) { | 1679 static void FillUpNewSpace(NewSpace* new_space) { |
1680 // Fill up new space to the point that it is completely full. Make sure | 1680 // Fill up new space to the point that it is completely full. Make sure |
1681 // that the scavenger does not undo the filling. | 1681 // that the scavenger does not undo the filling. |
1682 Heap* heap = new_space->heap(); | 1682 Heap* heap = new_space->heap(); |
1683 Isolate* isolate = heap->isolate(); | 1683 Isolate* isolate = heap->isolate(); |
1684 Factory* factory = isolate->factory(); | 1684 Factory* factory = isolate->factory(); |
1685 HandleScope scope(isolate); | 1685 HandleScope scope(isolate); |
1686 AlwaysAllocateScope always_allocate(isolate); | 1686 AlwaysAllocateScope always_allocate(isolate); |
1687 intptr_t available = new_space->EffectiveCapacity() - new_space->Size(); | 1687 intptr_t available = new_space->Capacity() - new_space->Size(); |
1688 intptr_t number_of_fillers = (available / FixedArray::SizeFor(32)) - 1; | 1688 intptr_t number_of_fillers = (available / FixedArray::SizeFor(32)) - 1; |
1689 for (intptr_t i = 0; i < number_of_fillers; i++) { | 1689 for (intptr_t i = 0; i < number_of_fillers; i++) { |
1690 CHECK(heap->InNewSpace(*factory->NewFixedArray(32, NOT_TENURED))); | 1690 CHECK(heap->InNewSpace(*factory->NewFixedArray(32, NOT_TENURED))); |
1691 } | 1691 } |
1692 } | 1692 } |
1693 | 1693 |
1694 | 1694 |
1695 TEST(GrowAndShrinkNewSpace) { | 1695 TEST(GrowAndShrinkNewSpace) { |
1696 CcTest::InitializeVM(); | 1696 CcTest::InitializeVM(); |
1697 Heap* heap = CcTest::heap(); | 1697 Heap* heap = CcTest::heap(); |
1698 NewSpace* new_space = heap->new_space(); | 1698 NewSpace* new_space = heap->new_space(); |
1699 | 1699 |
1700 if (heap->ReservedSemiSpaceSize() == heap->InitialSemiSpaceSize() || | 1700 if (heap->ReservedSemiSpaceSize() == heap->InitialSemiSpaceSize() || |
1701 heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) { | 1701 heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) { |
1702 // The max size cannot exceed the reserved size, since semispaces must be | 1702 // The max size cannot exceed the reserved size, since semispaces must be |
1703 // always within the reserved space. We can't test new space growing and | 1703 // always within the reserved space. We can't test new space growing and |
1704 // shrinking if the reserved size is the same as the minimum (initial) size. | 1704 // shrinking if the reserved size is the same as the minimum (initial) size. |
1705 return; | 1705 return; |
1706 } | 1706 } |
1707 | 1707 |
1708 // Explicitly growing should double the space capacity. | 1708 // Explicitly growing should double the space capacity. |
1709 intptr_t old_capacity, new_capacity; | 1709 intptr_t old_capacity, new_capacity; |
1710 old_capacity = new_space->Capacity(); | 1710 old_capacity = new_space->TotalCapacity(); |
1711 new_space->Grow(); | 1711 new_space->Grow(); |
1712 new_capacity = new_space->Capacity(); | 1712 new_capacity = new_space->TotalCapacity(); |
1713 CHECK(2 * old_capacity == new_capacity); | 1713 CHECK(2 * old_capacity == new_capacity); |
1714 | 1714 |
1715 old_capacity = new_space->Capacity(); | 1715 old_capacity = new_space->TotalCapacity(); |
1716 FillUpNewSpace(new_space); | 1716 FillUpNewSpace(new_space); |
1717 new_capacity = new_space->Capacity(); | 1717 new_capacity = new_space->TotalCapacity(); |
1718 CHECK(old_capacity == new_capacity); | 1718 CHECK(old_capacity == new_capacity); |
1719 | 1719 |
1720 // Explicitly shrinking should not affect space capacity. | 1720 // Explicitly shrinking should not affect space capacity. |
1721 old_capacity = new_space->Capacity(); | 1721 old_capacity = new_space->TotalCapacity(); |
1722 new_space->Shrink(); | 1722 new_space->Shrink(); |
1723 new_capacity = new_space->Capacity(); | 1723 new_capacity = new_space->TotalCapacity(); |
1724 CHECK(old_capacity == new_capacity); | 1724 CHECK(old_capacity == new_capacity); |
1725 | 1725 |
1726 // Let the scavenger empty the new space. | 1726 // Let the scavenger empty the new space. |
1727 heap->CollectGarbage(NEW_SPACE); | 1727 heap->CollectGarbage(NEW_SPACE); |
1728 CHECK_LE(new_space->Size(), old_capacity); | 1728 CHECK_LE(new_space->Size(), old_capacity); |
1729 | 1729 |
1730 // Explicitly shrinking should halve the space capacity. | 1730 // Explicitly shrinking should halve the space capacity. |
1731 old_capacity = new_space->Capacity(); | 1731 old_capacity = new_space->TotalCapacity(); |
1732 new_space->Shrink(); | 1732 new_space->Shrink(); |
1733 new_capacity = new_space->Capacity(); | 1733 new_capacity = new_space->TotalCapacity(); |
1734 CHECK(old_capacity == 2 * new_capacity); | 1734 CHECK(old_capacity == 2 * new_capacity); |
1735 | 1735 |
1736 // Consecutive shrinking should not affect space capacity. | 1736 // Consecutive shrinking should not affect space capacity. |
1737 old_capacity = new_space->Capacity(); | 1737 old_capacity = new_space->TotalCapacity(); |
1738 new_space->Shrink(); | 1738 new_space->Shrink(); |
1739 new_space->Shrink(); | 1739 new_space->Shrink(); |
1740 new_space->Shrink(); | 1740 new_space->Shrink(); |
1741 new_capacity = new_space->Capacity(); | 1741 new_capacity = new_space->TotalCapacity(); |
1742 CHECK(old_capacity == new_capacity); | 1742 CHECK(old_capacity == new_capacity); |
1743 } | 1743 } |
1744 | 1744 |
1745 | 1745 |
1746 TEST(CollectingAllAvailableGarbageShrinksNewSpace) { | 1746 TEST(CollectingAllAvailableGarbageShrinksNewSpace) { |
1747 CcTest::InitializeVM(); | 1747 CcTest::InitializeVM(); |
1748 Heap* heap = CcTest::heap(); | 1748 Heap* heap = CcTest::heap(); |
1749 if (heap->ReservedSemiSpaceSize() == heap->InitialSemiSpaceSize() || | 1749 if (heap->ReservedSemiSpaceSize() == heap->InitialSemiSpaceSize() || |
1750 heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) { | 1750 heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) { |
1751 // The max size cannot exceed the reserved size, since semispaces must be | 1751 // The max size cannot exceed the reserved size, since semispaces must be |
1752 // always within the reserved space. We can't test new space growing and | 1752 // always within the reserved space. We can't test new space growing and |
1753 // shrinking if the reserved size is the same as the minimum (initial) size. | 1753 // shrinking if the reserved size is the same as the minimum (initial) size. |
1754 return; | 1754 return; |
1755 } | 1755 } |
1756 | 1756 |
1757 v8::HandleScope scope(CcTest::isolate()); | 1757 v8::HandleScope scope(CcTest::isolate()); |
1758 NewSpace* new_space = heap->new_space(); | 1758 NewSpace* new_space = heap->new_space(); |
1759 intptr_t old_capacity, new_capacity; | 1759 intptr_t old_capacity, new_capacity; |
1760 old_capacity = new_space->Capacity(); | 1760 old_capacity = new_space->TotalCapacity(); |
1761 new_space->Grow(); | 1761 new_space->Grow(); |
1762 new_capacity = new_space->Capacity(); | 1762 new_capacity = new_space->TotalCapacity(); |
1763 CHECK(2 * old_capacity == new_capacity); | 1763 CHECK(2 * old_capacity == new_capacity); |
1764 FillUpNewSpace(new_space); | 1764 FillUpNewSpace(new_space); |
1765 heap->CollectAllAvailableGarbage(); | 1765 heap->CollectAllAvailableGarbage(); |
1766 new_capacity = new_space->Capacity(); | 1766 new_capacity = new_space->TotalCapacity(); |
1767 CHECK(old_capacity == new_capacity); | 1767 CHECK(old_capacity == new_capacity); |
1768 } | 1768 } |
1769 | 1769 |
1770 | 1770 |
1771 static int NumberOfGlobalObjects() { | 1771 static int NumberOfGlobalObjects() { |
1772 int count = 0; | 1772 int count = 0; |
1773 HeapIterator iterator(CcTest::heap()); | 1773 HeapIterator iterator(CcTest::heap()); |
1774 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { | 1774 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { |
1775 if (obj->IsGlobalObject()) count++; | 1775 if (obj->IsGlobalObject()) count++; |
1776 } | 1776 } |
(...skipping 2595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4372 // and will create promotion queue entries at the end of the second | 4372 // and will create promotion queue entries at the end of the second |
4373 // semi-space page during the next scavenge when it promotes the objects to | 4373 // semi-space page during the next scavenge when it promotes the objects to |
4374 // the old generation. The first allocation of (3) will fill up the first | 4374 // the old generation. The first allocation of (3) will fill up the first |
4375 // semi-space page. The second allocation in (3) will not fit into the first | 4375 // semi-space page. The second allocation in (3) will not fit into the first |
4376 // semi-space page, but it will overwrite the promotion queue which are in | 4376 // semi-space page, but it will overwrite the promotion queue which are in |
4377 // the second semi-space page. If the right guards are in place, the promotion | 4377 // the second semi-space page. If the right guards are in place, the promotion |
4378 // queue will be evacuated in that case. | 4378 // queue will be evacuated in that case. |
4379 | 4379 |
4380 // Grow the semi-space to two pages to make semi-space copy overwrite the | 4380 // Grow the semi-space to two pages to make semi-space copy overwrite the |
4381 // promotion queue, which will be at the end of the second page. | 4381 // promotion queue, which will be at the end of the second page. |
4382 intptr_t old_capacity = new_space->Capacity(); | 4382 intptr_t old_capacity = new_space->TotalCapacity(); |
4383 new_space->Grow(); | 4383 new_space->Grow(); |
4384 CHECK(new_space->IsAtMaximumCapacity()); | 4384 CHECK(new_space->IsAtMaximumCapacity()); |
4385 CHECK(2 * old_capacity == new_space->Capacity()); | 4385 CHECK(2 * old_capacity == new_space->TotalCapacity()); |
4386 | 4386 |
4387 // Call the scavenger two times to get an empty new space | 4387 // Call the scavenger two times to get an empty new space |
4388 heap->CollectGarbage(NEW_SPACE); | 4388 heap->CollectGarbage(NEW_SPACE); |
4389 heap->CollectGarbage(NEW_SPACE); | 4389 heap->CollectGarbage(NEW_SPACE); |
4390 | 4390 |
4391 // First create a few objects which will survive a scavenge, and will get | 4391 // First create a few objects which will survive a scavenge, and will get |
4392 // promoted to the old generation later on. These objects will create | 4392 // promoted to the old generation later on. These objects will create |
4393 // promotion queue entries at the end of the second semi-space page. | 4393 // promotion queue entries at the end of the second semi-space page. |
4394 const int number_handles = 12; | 4394 const int number_handles = 12; |
4395 Handle<FixedArray> handles[number_handles]; | 4395 Handle<FixedArray> handles[number_handles]; |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4479 #ifdef DEBUG | 4479 #ifdef DEBUG |
4480 TEST(PathTracer) { | 4480 TEST(PathTracer) { |
4481 CcTest::InitializeVM(); | 4481 CcTest::InitializeVM(); |
4482 v8::HandleScope scope(CcTest::isolate()); | 4482 v8::HandleScope scope(CcTest::isolate()); |
4483 | 4483 |
4484 v8::Local<v8::Value> result = CompileRun("'abc'"); | 4484 v8::Local<v8::Value> result = CompileRun("'abc'"); |
4485 Handle<Object> o = v8::Utils::OpenHandle(*result); | 4485 Handle<Object> o = v8::Utils::OpenHandle(*result); |
4486 CcTest::i_isolate()->heap()->TracePathToObject(*o); | 4486 CcTest::i_isolate()->heap()->TracePathToObject(*o); |
4487 } | 4487 } |
4488 #endif // DEBUG | 4488 #endif // DEBUG |
OLD | NEW |