java垃圾收集器与内存分配策略
垃圾收集器在对堆进行回收前,第一件事是要确定这些对象中那些还活着
1、引用计数法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时计数器就减1;任何时刻计数器为零的对象是不可能再被使用的。但存在对象互相引用的情况 objA.instance = objB 和 objB.instance = objA 除此之外这两个对象再无任何引用 实际上这两个对象已经不可能再被访问 但是互相引用 计数器就不为零就无法通知GC回收
2、可达性分析:当一个对象到GCRoots是不可达的就会被判断为可回收对象
垃圾收集算法:
1、标记-清除算法 标记清除会存在大量不连续内存片段 会导致提前触发垃圾回收机制
2、复制算法 内存分为两部分 当一个用完了就把这个上面存活的移到另一半上 然后对整个半区进行回收 如此往复 存在担保区
标记-整理算法
分代收集算法 年轻代复制算法 老年代 标记-清理 /标记-整理 算法
GC日志
DefNew 年轻代回收 后面跟着的 3324K(回收前该片区已使用内存)->152K(回收后已使用内存)(3712K 该片区总内存) 该内存区域GC花费时间 3324K(GC前java堆已使用容量)->152K(GC后java堆已使容量)(11904JAVA总容量)
大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间分配时,虚拟机就发起一次MinorGC(年轻代回收) GC区间如果对象大于Survivor空间 则只好通过分配担保机制提前转移到老年代去 ,如果老年代空间也不足则触发老年代 GC(Major GC / Full GC)