查看当前机器所使用的垃圾回收器

说明

各种垃圾回收算法都有各自的优缺点。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  所以 新生代的内存也要根据合理调配。

serial(串行收集器)

特点

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

采用单线程回收

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

当jvm垃圾回收时会"stop then world"短暂的暂停所有用户线程

参数配置

-XX:+UseSerialGC  默认老年代也使用serial收集器 可以单独配置老年代收集器

ParNew

特点

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

并行回收需要cpu多核支持

多核cpu的首选,如果单核使用此收集器 性能会低于serial收集器 是Server模式的默认收集器

参数配置

-XX:+UseParNewGC  启用收集器

-XX:ParallelGCThreads设置回收线程数量,一般,最好与 CPU 数量相当,避免过多的线程数影响垃圾收集性能。在默认情况下,当 CPU 数量小于 8 个,ParallelGCThreads 的值等于 CPU 数量,大于 8 个,ParallelGCThreads 的值等于 3+[5*CPU_Count]/8]。以

ParallelScavenge收集器

特点

          类似ParNew

          新生代复制算法
         老年代标记压缩算法
         更关注吞吐量(频繁进行垃圾回收 减少回收量 减少全局停顿时间)

参数配置

                 -XX:+UseParallelOldGC 新生代老年代都并行
                  -XX:UseParallelGC  新手代并行 老年代串行
      -XX:+MaxGCPauseMills  回收时间单位毫秒 jvm尽量控制在这个范围之内
     -XX:+GCTimeRatio 设置吞吐量大小,它的值是一个 0-100 之间的整数。假设 GCTimeRatio 的值为 n,那么系统将花费不超过 1/(1+n) 的时间用于垃圾收集。比如 GCTimeRatio 等于 19,则系统用于垃圾收集的时间不超过 1/(1+19)=5%。默认情况下,它的取值是 99,即不超过 1%的时间用于垃圾收集。
     -XX:+UseAdaptiveSizePolicy 可以打开自适应 GC 策略。在这种模式下,新生代的大小、eden 和 survivor 的比例、晋升老年代的对象年龄等参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。在手工调优比较困难的场合,可以直接使用这种自适应的方式,仅指定虚拟机的最大堆、目标的吞吐量 (GCTimeRatio) 和停顿时间 (MaxGCPauseMills),让虚拟机自己完成调优工作

CMS收集器

特点

老年代收集器

与并行回收收集器不同,CMS 收集器主要关注于系统停顿时间。CMS 是 Concurrent Mark Sweep 的缩写,意为并发标记清除,从名称上可以得知,它使用的是标记-清除算法,同时它又是一个使用多线程并发回收的垃圾收集器。

CMS 工作时,主要步骤有:初始标记、并发标记、重新标记、并发清除和并发重置。其中初始标记和重新标记是独占系统资源的,而并发标记、并发清除和并发重置是可以和用户线程一起执行的。因此,从整体上来说,CMS 收集不是独占式的,它可以在应用程序运行过程中进行垃圾回收。

  1. 初始标记:为了收集应用程序的对象引用需要暂停应用程序线程,该阶段完成后,应用程序线程再次启动。
  2. 并发标记:从第一阶段收集到的对象引用开始,遍历所有其他的对象引用。
  3. 重标记:由于第三阶段是并发的,对象引用可能会发生进一步改变。因此,应用程序线程会再一次被暂停以更新这些变化,并且在进行实际的清理之前确保一个正确的对象引用视图。这一阶段十分重要,因为必须避免收集到仍被引用的对象。
  4. 并发清理:所有不再被应用的对象将从堆里清除掉。
  5. 并发重置:收集器做一些收尾的工作,以便下一次GC周期能有一个干净的状态。

缺点

CMS收集器并没有完全解决全局暂停,通过并发标记并发清理 并发重置可以与应用线程同时执行 减少全局暂停,缺点是由于是跟应用线程并行执行 会对系统吞吐量造成影响,因为是标记清除算法 而非标记压缩算法 所以会导致垃圾碎片,应用程序申请不到足够的连续空间会报内存溢出

参数设置

-XX:+UseConcMarkSweepGC 激活cms
-XX:ParallelCMSThreads  cms线程大小 默认是:(ParallelGCThreads+3)/4)
-XX:CMSInitiatingOccupancyFractio 阀值多少的时候回收一次 默认是68 即老年代空间使用率为68%使用一次
-XX:+UseCMSCompactAtFullCollection 因为是标记清除清理 会产生内存碎片 可以通过此参数设置多少次cms后进行一次随便整理非并行 会全局暂停

G1搜集器

特点:

收集器的目标是作为一款服务器的垃圾收集器,因此,它在吞吐量和停顿控制上,预期要优于 CMS 收集器

与cms相比 G1收集器是采用标记压缩算法 所以不会产生垃圾碎片

参数:

-XX:+UnlockExperimentalVMOptions –XX:+UseG1GC  启用G1收集器

-XX:MaxGCPauseMills=20,-XX:GCPauseIntervalMills=200 可以非常精确的控制停顿时间 停顿时间为20时垃圾收集不超过200

不同收集器性能测试

测试代码

 static HashMap map = new HashMap();

    public static void main(String[] args){
long begintime = System.currentTimeMillis();
for(int i=0;i<10000;i++){
if(map.size()*512/1024/1024>=400){
map.clear();//保护内存不溢出
System.out.println("clean map");
}
byte[] b1;
for(int j=0;j<100;j++){
b1 = new byte[512];
map.put(System.nanoTime(), b1);//不断消耗内存
}
}
long endtime = System.currentTimeMillis();
System.out.println("运行总耗时:"+(endtime-begintime));
}

serial测试结果

jvm参数:-Xmx512M -Xms512M   -XX:+UseSerialGC

ParNew测试结果

jvm参数:-Xmx512M -Xms512M   -XX:+UseParNewGC -XX:ParallelGCThreads=6 (按照我们上面设置线程数量原则 我的电脑是6核 所以我设置6)

ParallelScavenge

jvm参数:-Xmx512M -Xms512M   -XX:+UseParallelOldGC -XX:ParallelGCThreads=6

jvm参数:-Xmx512M -Xms512M    -XX:+UseParallelGC -XX:ParallelGCThreads=6

CMS

jvm参数:-Xmx512M -Xms512M     -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=6

G1收集器

jvm参数:-Xmx512M -Xms512M  -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC

注意:不能完全以上面的数据评估收集器好坏。因为每次执行结果都不一样 我只是放出第一次执行结果

jvm学习-垃圾回收器(四)的更多相关文章

  1. JVM学习——垃圾回收GC(学习过程)

    JVM学习-垃圾回收(GC) 2020年02月19日06:03:56,开始学习垃圾回收,学习资料来源(张龙老师的JVM课程) JVM内存数据区域知识复习 学习垃圾回收之前,要对JVM内部的内存区域有详 ...

  2. 【JVM】垃圾回收器总结(2)——七种垃圾回收器类型

    七种垃圾回收器类型 GC的约定参数 DefNew——Default New Generation Tenured——Serial Old ParNew——Parallel New Generation ...

  3. 深入理解JVM一垃圾回收器

    上一篇我们介绍了常见的垃圾回收算法,不同的算法各有各的优缺点,在JVM中并不是单纯的使用某一种算法进行垃圾回收,而是将不同的垃圾回收算法包装在不同的垃圾回收器当中,用户可以根据自身的需求,使用不同的垃 ...

  4. JVM七大垃圾回收器下篇G1(Garbage First)

    G1回收器:区域化分代式 既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First (G1)GC?  原因就在于应用程序所应对的业务越来越庞大.复杂,用户越来越多,没有GC就不能保 ...

  5. 面试官:说一下JVM常用垃圾回收器的特点、优劣势、使用场景和参数设置

    今天去看牙医,他问我年级轻轻牙齿怎么磨损这么严重?我说,没有人点赞的这些年,我都是咬着牙过来的. Java中的垃圾回收器几乎是面试中的必考点,无论是面试初级,中级还是高级,总免不了要问一问垃圾回收器的 ...

  6. JVM学习笔记(四)------内存调优【转】

    转自:http://blog.csdn.net/cutesource/article/details/5907418 版权声明:本文为博主原创文章,未经博主允许不得转载. 首先需要注意的是在对JVM内 ...

  7. JVM学习笔记(四)------内存调优

    首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...

  8. 第三篇:jvm之垃圾回收器

    一.Serial收集器 新生代收集器,在垃圾回收时,必须暂停其他所有的工作线程.即Stop-The-World. 评价:老而无用,食之无味,弃之可惜. 二.ParNew收集器 新生代收集器,seria ...

  9. 深入探究JVM之垃圾回收器

    @ 目录 前言 正文 一.垃圾收集算法 标记-复制 标记-清除 标记-整理 分代回收 二.常用的垃圾回收器 Serial/SerialOld ParNew Parallel Scavenge/Para ...

随机推荐

  1. 人见人爱A+B(杭电2033)

    /*人见人爱A+B Problem Description HDOJ上面已经有10来道A+B的题目了,相信这些题目以前是大家的最爱,希望今天的这个A+B能给大家带来好运.也希望这个题目能唤起大家对AC ...

  2. Oracle Instant Client 安装配置

    一.下载 下载地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html 这是Ora ...

  3. Django 创建新项目后要完成的几个步骤

    首先,在过一遍创建新项目的步骤: -创建一个新项目 -建了数据库后要确定自己是用 mysql数据库  还是用 sqlite3数据库 -如果是mysql数据库,那一堆配置 -如果是sqlite3数据库, ...

  4. Java 位运算符 &、|、^、~、<<、>>、>>>

      撸了N久的代码,但是突然冒出来个位运算,我就蒙蔽了,这是什么?我是谁?我在干什么?我在哪? 1)闲扯 关于位运算符无非也就 与(&).或(|).异或(^).取反(~).左移(<< ...

  5. 工具分享2:Python 3.6.4、文本编辑器EditPlus、文本编辑器Geany

    工具官网下载地址: https://www.python.org/downloads/ python 3.6.0下载链接: 链接:https://pan.baidu.com/s/1snuSxsx 密码 ...

  6. chapter6 数据结构基础之习题 Parentheses Balance

    You are given a string consisting of parentheses () and []. A string of this type is said to be corr ...

  7. .net MVC成长记录(四)Linq(1)

    今天不忙,没什么事情,继续写写随笔. 之前的文章写到了EF,很多人留言EF的操作用什么?  今天,就继续给大家分享EF的操作, Linq . 先从Linq操作Object内置对象开始 从Linq的基础 ...

  8. Asp.net MVC4 Step by Step (1)-路由,控制器,视图

    注意:此文需要你有一定Asp.net MVC的基础,很多东西省略了,只是做个提要笔记形式. 要创建一个ASP.NET MVC的Web应用,首先要去下载ASP.NET MVC框架, 可以访问ASP.NE ...

  9. 使用curl 上传文件,multipart/form-data

    使用curl 上传文件,multipart/form-data 1. 不使用-F,curl内置multipart/form-data功能: 2. 文件内容与真实数据无关,用abc代替数据,依然可以上传 ...

  10. Assembly之instruction之JUMP

    JMP  Jump unconditionally Syntax   JMP  label Operation PC + 2 × offset −> PC Description The 10- ...