一.Heap中的size
Heap实例存在于Isolate中,它的构造函数和ConfigureHeap函数对以下一些重要的size进行了初始化:
// Returns the maximum amount of memory reserved for the heap. For
// the young generation, we reserve 4 times the amount needed for a
// semi space. The young generation consists of two semi spaces and
// we reserve twice the amount needed for those in order to ensure
// that new space can be aligned to its size.
// the young generation, we reserve 4 times the amount needed for a
// semi space. The young generation consists of two semi spaces and
// we reserve twice the amount needed for those in order to ensure
// that new space can be aligned to its size.
MaxReserved=4 *
reserved_semispace_size_ +
max_old_generation_size_
其中
reserved_semispace_size_ = 8388608 = 0x00800000 = 8M//表示reserved semispace的大小,其中reserved是在virtual memory alloc中的一个步骤
max_old_generation_size_ = 734003200 = 0x2bc00000 = 734M
max_semispace_size_ = 8388608 = 0x00800000 = 8M
initial_semispace_capacity = 1048576 = 0x00100000 = 1M
Page:: kPageSize = 1M byte
CommitPageSize=4096 byte
CommitPageSize=4096 byte
二.Space与Page
Space是所有存储空间的基类,它定义了Space的id和executable,所以它的派生类必须在构造函数中说明这两个属性。
FixedSpace类用来存储固定大小的对象,在构造函数中,除了说明Space的id以外,还需要指明以字节为单位的对象大小。
Map类定义在objects.h中,MapSpace类从FixedSpace继承,它指定的固定大小是Map::kSize,从map类的定义中我们可以看到Map对象的结构如下:
因为Map是一个HeapObject对象,HeapObject对象的第一个字段都是Map,也就是HeapObject的head,后面每个字段的大小都是4字节,也就是说一个Map对象的大小是40字节
FixedSpace类用来存储固定大小的对象,在构造函数中,除了说明Space的id以外,还需要指明以字节为单位的对象大小。
Map类定义在objects.h中,MapSpace类从FixedSpace继承,它指定的固定大小是Map::kSize,从map类的定义中我们可以看到Map对象的结构如下:
因为Map是一个HeapObject对象,HeapObject对象的第一个字段都是Map,也就是HeapObject的head,后面每个字段的大小都是4字节,也就是说一个Map对象的大小是40字节
MemoryChunk
结构
MemoryChunk
在
spaces.h
中定义,它的头部共有
72
字节,如上图所示,然后是
32