堆的常见问题
堆的默认大小
最小为物理内存的1/64,最大为物理内存的1/4
堆为什么分为新生代、老年代
堆的内存划分受垃圾回收限制
为什么新生代:老年代=1:2
因为老年代存储的是三类数据:
- 大对象
- GC年龄超过15的对象
- 空间分配担保
新生代分为Eden区、From区、To区?
最开始新生代只分为活动区和空闲区,各占50%,采用复制算法,虽然减少了碎片出现。但空间过于浪费。在IBM等统计发现Eden区有90%~95%会在第一次GC被回收,因此Eden区:From区:To区=8:1:1.
当Eden区、From区、To区满了之后,触发Minor GC
- 如果Eden区满了,触发GC且无法回收时,复制到From区
- 如果From区满了,触发GC且无法回收时,复制到To区
当老年代满了之后,触发Major GC
垃圾回收算法
目前常用高级语言开发,跟内存打交道较少。但采用c/c++开发时,需要手动申请内存及释放内存,如果不及时释放,会造成内存泄漏。高级语言中很少和内存打交道是由于高级语言内置了GC算法,即垃圾回收机制。
常见的垃圾回收算法
- 引用计数算法(无法处理循环引用问题)
- 标记-清除算法
- 标记-整理算法
- 分代-复制算法