jvm学习-垃圾回收器(四)

各种垃圾回收算法都有各自的优缺点。jvm也并没有只采用一种垃圾算法。并提供几种组合供我根据场景进行选择。

jvm内存结构

Person p=new Person();

1.程序里面创建一个对象会向向eden区和from区申请空间

2..当eden区和from区内存紧张则会触发(Scavenge GC)将非垃圾对象复制到to区,并将to区的纯活对象年龄+1(如果to区满了存放不下剩余的纯活对象则会移动到老年代)

3.回收eden区和from区的垃圾对象。并将to和from调换位置

4.后面每次回收纯活对象的年龄都会+1 当年龄到达15则移动到老年代

5.当老年代内存紧张则会触发(Full GC) 回收老年代垃圾对象

     因为老年代使用标记清除法,所以会导致程序全局暂停,

     比如:

              比如一个生日聚会。你一边打扫房间 别人一边制造大量垃圾,会导致垃圾永远清理不完

      全局暂停的影响

                比如做了主从,  当主机因为全局暂停, 从监测到以为主机挂掉了。这个时候从机切为主机。 这个时候主机执行完清理 重新开始运行程序。这个时候会导致数据不一致问题、

我们在实际中应当合理调节老年代大小

还有前面说了 因为from区和to区容纳不了纯活对象会自动担保放到老年代,会照成本来纯活时间不长的对象 到了老年代。占用老年代内存 导致fullgc  所以 新生代的内存也要根据合理调配。

JVM提供的几种垃圾回收器

串行收集器

特点:

     最老的一种垃圾回收期 ,稳定,效率高

     采用单线程回收

      新生代采用复制算法 老年代采用标记压缩算法

参数配置: -XX:+UseSerialGC

ParNew

特点:

            新生代并行回收  老年代串行回收

            并行回收需要cpu多核支持

 参数配置:-XX:+UseParNewGC 

           可以使用 -XX:ParallelGCThreads设置回收线程数量

Parallel收集器

  特点:

          类似ParNew

          新生代复制算法
         老年代标记压缩算法
         更关注吞吐量
参数配置:-XX:UseParallelOldGC 新生代老年代都并行
                   -XX:UseParallelGC  于preNew一致
 
CMS收集器
         特点:
               可以与引用程序并行的执行标记和清除。但是初始标记还是会全局暂停
               只是减少了全局暂停的时间,但是减少了吞吐量
               比如应用程序占用100%的cpu处理请求  这个时候垃圾回收启动了 占用50%的cpu   应用程序只能用50%的资源处理请求 所以吞吐量低了
参数配置:-XX:+UseConcMarkSweepGC       
                -XX:+UseCMSCompactAtFullCollection  在fullGC后进行碎片整理 可能花费很久的时间(导致全局暂停)
                -XX+CMSFullGCsBeforeCompaction 设置几次FullGC后进行碎片整理
G1回收器
 G1回收器是jdk1.7以后推出的回收器,试图取代CMS回收器。
        特点:

猜你喜欢

转载自www.cnblogs.com/LQBlog/p/9205848.html