zoukankan      html  css  js  c++  java
  • 大宇java面试系列(一):jvm垃圾回收

    1. 说一下 JVM 有哪些垃圾回收算法?

    • 标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。

    • 标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。

    • 复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。

    • 分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。

    2. 说一下 JVM 有哪些垃圾回收器?

    • Serial:最早的单线程串行垃圾回收器。

    • Serial Old:Serial 垃圾回收器的老年版本,同样也是单线程的,可以作为 CMS 垃圾回收器的备选预案。

    • ParNew:是 Serial 的多线程版本。

    • Parallel 和 ParNew 收集器类似是多线程的,但 Parallel 是吞吐量优先的收集器,可以牺牲等待时间换取系统的吞吐量。

    • Parallel Old 是 Parallel 老生代版本,Parallel 使用的是复制的内存回收算法,Parallel Old 使用的是标记-整理的内存回收算法。

    • CMS:一种以获得最短停顿时间为目标的收集器,非常适用 B/S 系统。

    • G1:一种兼顾吞吐量和停顿时间的 GC 实现,是 JDK 9 以后的默认 GC 选项。

    3. 详细介绍一下 CMS 垃圾回收器?

    CMS 是英文 Concurrent Mark-Sweep 的简称,是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动 JVM 的参数加上“-XX:+UseConcMarkSweepGC”来指定使用 CMS 垃圾回收器。

    CMS 使用的是标记-清除的算法实现的,所以在 gc 的时候回产生大量的内存碎片,当剩余内存不能满足程序运行要求时,系统将会出现 Concurrent Mode Failure,临时 CMS 会采用 Serial Old 回收器进行垃圾清除,此时的性能将会被降低。

    4. 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

    • 新生代回收器:Serial、ParNew、Parallel Scavenge

    • 老年代回收器:Serial Old、Parallel Old、CMS

    • 整堆回收器:G1

    新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收。

    5. 简述分代垃圾回收器是怎么工作的?

    分代回收器有两个分区:老生代和新生代,新生代默认的空间占比总空间的 1/3,老生代的默认占比是 2/3。

    新生代使用的是复制算法,新生代里有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1,它的执行流程如下:

    • 把 Eden + From Survivor 存活的对象放入 To Survivor 区;

    • 清空 Eden 和 From Survivor 分区;

    • From Survivor 和 To Survivor 分区交换,From Survivor 变 To Survivor,To Survivor 变 From Survivor。

    每次在 From Survivor 到 To Survivor 移动时都存活的对象,年龄就 +1,当年龄到达 15(默认配置是 15)时,升级为老生代。大对象也会直接进入老生代。

    老生代当空间占用到达某个值之后就会触发全局垃圾收回,一般使用标记整理的执行算法。以上这些循环往复就构成了整个分代垃圾回收的整体执行流程。

    6. 说一下 JVM 调优的工具?

    JDK 自带了很多监控工具,都位于 JDK 的 bin 目录下,其中最常用的是 jconsole 和 jvisualvm 这两款视图监控工具。

    • jconsole:用于对 JVM 中的内存、线程和类等进行监控;

    • jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等。

    7. 常用的 JVM 调优的参数都有哪些?

    • -Xms2g:初始化推大小为 2g;

    • -Xmx2g:堆最大内存为 2g;

    • -XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;

    • -XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;

    • –XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;

    • -XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;

    • -XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;

    • -XX:+PrintGC:开启打印 gc 信息;

    • -XX:+PrintGCDetails:打印 gc 详细信息。

    如果您感觉文章对您有所帮助,请让更多人看到!

    1.点赞此篇文章,并评论一句!

    2.转发此篇文章 给予作者支持!

    3.微信搜索 ~ 关注微信公众号:程序员知识码头  获取全套学习资料一份!

    微信扫码关注:每天准时发技术文章!还能加入专属的学习交流社群!

  • 相关阅读:
    解决xcode5升级后,Undefined symbols for architecture arm64:问题
    第8章 Foundation Kit介绍
    app 之间发送文件 ios
    iphone怎么检测屏幕是否被点亮 (用UIApplication的Delegate)
    CRM下载对象一直处于Wait状态的原因
    错误消息Customer classification does not exist when downloading
    How to resolve error message Distribution channel is not allowed for sales
    ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼
    有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中
    SAP GUI和Windows注册表
  • 原文地址:https://www.cnblogs.com/ssyssy/p/11881621.html
Copyright © 2011-2022 走看看