什么是Largeobjectspace
该空间是专门针对所谓需要大内存对象的内存分配器
判定规则
1.如果分配一个对象的内存超出了某个值就会吧这个对象放到这块空间中,可以理解为针对大对象的分配单独创建了一个largeobjectspace空间进行分配内存。
2.对象的数据类型是有限制的:必须是基础类型的数组,或者是string类对象。
不同于其他分配算法。这个largeobjectspace的分配内存的方式是进行直接mmap映射一块操作系统的内存进行分配内存。一个对象对应的就是一块mmap的内存
其他分配算法
1。bumpspace通过指针碰撞来分配内存,由于他是一块内存连续的空间,所以进行这种分配算法效率最高,每次分配时维护一下当前该分配到哪块内存即可。这种常用于线程本地分配tlab使用。
这种回收内存会造成碎片化,因为内存分配是连续的但是回收的时候没有进行额外处理而是直接将那块内存回收掉,所以碎片化非常严重。
2。regonspace把内存分为一块regon,分配时按照regon进行分配。一块一块的regon,内存回收时是按照拷贝算法,回收时进行拷贝活着的对象,死亡对象进行清除。
3。后面art虚拟机采用了更复杂的内存分配算法和回收算法,也就是degleeote和allotec,
分配内存更加严格,slot代表内存分配基本单位,run是进行内存分配时用到的,可以理解为是管理slot内存的。
对run进行操作run内部在根据空闲的slot空间进行分配内存。
当run内部对slot没有空闲的时候,会进行加锁分配内存保证安全。
第四种就是Largeobjectspace了,针对大对象的分配。直接从操作系统mmap映射内存使用,直呼好家伙~