堆的常见问题

堆的默认大小

最小为物理内存的1/64,最大为物理内存的1/4

堆为什么分为新生代、老年代

堆的内存划分受垃圾回收限制

为什么新生代:老年代=1:2

因为老年代存储的是三类数据:

  1. 大对象
  2. GC年龄超过15的对象
  3. 空间分配担保

新生代分为Eden区、From区、To区?

最开始新生代只分为活动区和空闲区,各占50%,采用复制算法,虽然减少了碎片出现。但空间过于浪费。在IBM等统计发现Eden区有90%~95%会在第一次GC被回收,因此Eden区:From区:To区=8:1:1.

当Eden区、From区、To区满了之后,触发Minor GC

  1. 如果Eden区满了,触发GC且无法回收时,复制到From区
  2. 如果From区满了,触发GC且无法回收时,复制到To区

当老年代满了之后,触发Major GC

垃圾回收算法

目前常用高级语言开发,跟内存打交道较少。但采用c/c++开发时,需要手动申请内存及释放内存,如果不及时释放,会造成内存泄漏。高级语言中很少和内存打交道是由于高级语言内置了GC算法,即垃圾回收机制。

常见的垃圾回收算法

  • 引用计数算法(无法处理循环引用问题)
  • 标记-清除算法
  • 标记-整理算法
  • 分代-复制算法