3.8实战内存分配与回收策略(gold_axe)

Java自动内存管理:

  • 1.自动给对象分配内存
  • 2.自动垃圾回收

分配一般在堆的新生代,
也有可能太大了, 直接取老年代
也有可能经过即时编译后被拆散,为标量类型并间接地在栈上分配

Jvm规范未规定分配和回收的细节,
各垃圾收集器的实现不同
这节说的是 大体上 的原则

3.8.1 对象优先在Eden分配

来对象在 Eden区 中分配

如果不够放, 就Minor GC

Survivor空间不够放, 就分配担保机制 先放 老年代

G1 不用

3.8.2 大对象直接进入老年代

大对象导致内存明明还有不少空间时就提前触发垃圾收集,以得到连续空间
当复制对象时,就意味着高额的内存复制开销。

新生代收集器: Serial,ParNew 有提供参数设多大的对象 直接分配到 老年代

3.8.3 长期存活的对象将进入老年代

默认的15次存活, 可调

3.8.4 动态对象年龄判定

Survivor空间中 [相同年龄所有对象大小的总和]>Survivor/2
>=平均年龄的对象 可直接进入老年代, 不用等年龄到阈值

3.8.5 空间分配担保

Minor GC 可能会有风险,
就是, 虽然一般是不会,但是这次Minor GC回收发现存活的特别多,
不止是Survivor放不下, 连老年代都放不下, 担保都不行, 真的发生就只能Full GC了

所以, Minor GC 会先看,
老年代最大可用的连续空间> 历次晋升到老年代对象的平均大小
这个是不是成立,
不成立的话, 风险比较大了, 不如直接 Full GC 了

G1 没有

你可能感兴趣的:(3.8实战内存分配与回收策略(gold_axe))