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 没有
网友评论