君子以自强不息。
慢速分配的过程
当不能进行快速分配,就进入到慢速分配。
- attempt_allocation 尝试进行对象分配,如果成功则返回。在 attempt_allocation 里面可能会进行垃圾回收,这里的垃圾回收是指增量的垃圾回收,主要是新生代或者混合收集。
- 如果大对象在 attempt_allocation_humongous,直接分配的老生代。
- 如果分配不成功,则进行 GC 垃圾回收,这里的回收主要是 Full GC,然后再分配。因为这里是分配的最后一步,所以进行几次不同的垃圾回收和尝试。
- 最终成功分配或者失败达到一定次数,则分配失败。
大对象分配
- 尝试垃圾回收,这里主要是增量回收,同时启动并发标记。
- 尝试开始分配对象,对于大对象分为两类,一类是大于HeapRegionSize的一半,但是小于HeapRegionSize,即一个完整的堆分区可以保存,则直接从空闲列表直接拿一个堆分区,或者分配一个新的堆分区。如果是连续对象,则需要多个堆分区,思路同上,但是处理的时候需要加锁。
- 如果失败再次尝试垃圾回收,之后再分配。
- 最终成功分配或者失败达到一定次数,则分配失败。
最后的分配尝试
- 尝试扩展新的分区,成功则返回。
- 不成功进行Full GC,但是不回收软引用,再次分配成功则返回。
- 不成功进行Full GC,回收软引用,最后一次分配成功则返回;不成功返回NULL,即分配失败。