设为首页 加入收藏

TOP

JVM垃圾收集器与内存分配策略(二)
2015-08-31 21:24:49 来源: 作者: 【 】 浏览:66
Tags:JVM 垃圾 收集器 内存 分配 策略
l Old是Serial收集器的老年代版本, 单线程收集器, 使用“标记-整理”算法。


5,Parallel Old收集器:


描述: Parallel Scavenge收集器的老年代版本;吞吐量优先的收集器


6,CMS收集器: Concurrent Mark Sweep


描述:以获取最短回收停顿时间为目标;基于“标记-清除”算法


步骤:


缺点:


八、 理解GC日志


1.停顿类型:


[GC : minor GC, [Full GC: full GC


2. GC的位置:


[DefNew:Default New Generation? ? ? Serial收集器新生代


[ParNew:? Parallel 新生代


[PSYoungGen: Parallel Scanvenge收集器的新生代


[Tenured:? 老年代


[Perm:? 永久代


3.回收前后内存空间变化:


35592K -> 1814K(36288K): 回收前内存空间大小 -> 回收后内存空间大小(总的内存空间大小


九、内存分配与回收策略:


大的方向说, 对象主要分配在堆的新生代的Eden区上,如果启动了本地线程分配缓冲, 将按线程优先在TLAB上分配。


1.对象优先在Eden上分配:


当Eden上没有足够的空间分配时, 虚拟机会发起一次Minor GC, 将Eden上和一个survivior上存活的对象复制到另外一个Survivor空间上, 如果另外一个Survivior空间上没有足够的空间, 将会将存活的对象直接移动到老年代, 如果老年代也没有足够的空间, 虚拟机将会发起一次Full GC, 如果Full GC之后还是放不下, 则会报OOM异常。


2.大对象会直接进入老年代:


虚拟机提供一个参数, -XX:PretenureSizeThreshould, 大于这个值的对象直接在老年代分配, 避免Eden区域Survivior区的来回复制。


3.长期存活的对象直接进入老年代:


虚拟机每个对象定义了一个对象年龄计算器, 每经过一次Minor GC, 对象年龄加一, 当对象年龄达到一定数时(默认15),将会晋升到老年代。 阈值设置参数:-XX:MaxTenurngThreshould


4.动态对象年龄判断:


如果Survivior空间中相同年龄的对象的大小总和大于survivior空间的一半时, 大于等于该年龄的对象就可以直接进入老年代。


5.空间分配担保:


准备Minor GC时, 虚拟机首先会检查老年代的剩余空间是否大于新生代所有对象的总空间, 如果大于, 则可以进行Minor GC; 否则, 会去查看是否允许担保失败(HandlePromotionFailure), 如果不允许,虚拟机会直接发起一次Full GC; 如果允许, 虚拟机会去检查老年代剩余空间是否大于历次晋升到老年代对象的平均大小, 如果不大于, 则会发起一次Full GC; 如果大于, 则会发起Minor GC, 如果这时发现, 老年代没有足够空间来容纳新生代晋升来的对象的总大小, 这时仍要触发一次Full GC, 这个圈子绕的就有点大了。


十、Full GC 和Minor GC:


Minor GC: 发生在新生代, 速度比较快


Full GC: 发生在老年代, 一般都伴随这一次Minor GC


Minor GC一般都要比Minor GC慢十倍以上,因为新生代采用复制算法, 速度比较快; 而老年代一般采用标记-清理/整理算法;


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android 自定义 ViewPager 打造千.. 下一篇iOS开发-Launch Image和Launch Sc..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: