zoukankan      html  css  js  c++  java
  • Java面试连环炮问题收集记录贴【JVM方面】

    写这类文章是为了记录下网上看到的/自己经历的一些一环扣一环的面试问题,一方面提高自己的理论知识,另外一方面也给自己去参加面试或面试他人提供点参考和帮助。

    问题一:

    为什么一个对象会被GC?

    对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有要执行finalize()方法。有必要执行finalize()方法的话,会把对象放置在一个叫做F-Queue的队列中,GC会对队列中的对象进行第二次小规模的标记,如果对象没有重新与引用链上的任何一个对象建立关联,则就被真正回收。

    说白了就是一个对象不存在任何引用,然后就会被回收。

    触发一个对象的回收:

    1.对象没有引用

    2.作用域发生捕获异常

    3.程序在作用域正常执行完毕

    4.程序执行了System.exit()

    5.程序发生意外终止

      

    问题二:为何会在这个时候发生GC?

    1.新对象生成,在Eden申请空间失败。2.老年代被写满、持久代被写满(已经移除)、System.gc()被显示调用、上一次GC之后Heap的各域分配策略动态变化

    问题三:GC都有哪些策略的分类?

    这边应该是对于每个垃圾回收器的说明了。

    新生代收集器:

    1.Serial收集器

        单线程执行GC 会引起"Stop The World" 虚拟机运行在Client模式下的默认新生代收集器 简单而高效(与其它收集器单线程比) 适用于用户桌面应用 采用复制算法

      2.ParNew收集器

        多线程执行GC 会引起"Stop The World" 虚拟机运行在Server模式下新生代收集器首选 因为需要配合老年代的CMS收集器工作 采用复制算法

      3.Parallel Scavenger收集器(吞吐量优先收集器)

        关注点达到一个可控制的吞吐量(CPU用于运行用户代码的时间与CPU总消耗时间的比值) 适用于后台计算而不需要太多交互的任务 GC自适应调节策略(-XX:+UseAdaptiveSizePolicy) 采用复制算法

      老年代收集器 

      4.Serial Old收集器

        单线程 适用于Client模式下 采用标记-整理算法

      5.Parallel Old收集器

        Parallel Scavenger的老年代版本 多线程 采用标记-整理算法 配合Parallel Scaverger 吞吐量优先的收集器才名副其实

      6.CMS收集器

        关注点尽可能地缩短垃圾收集器用户线程的停顿时间 采用标记-清除算法

        

        过程看JVM书中的图比较清晰。

        缺点:

          对CPU资源非常敏感 CPU比较多的时候效果比较好(回收线程:(CPU数量+3)/4)

          无法处理浮动垃圾 容易失败产生Concurrent Mode Failure,然后需要Serial Old收集器重新进行垃圾收集。

          会产生大量空间碎片

      7.G1收集器

      基于标记-整理算法 精确控制停顿 将Java堆(包括新生代、老年代)划分多个大小固定的独立区域(Region),跟踪这些区域的垃圾堆积情况,在后台维护一个优先列表,每次根据允许的收集时间,优先回收垃圾      最多的区域

    问题三:这些策略都有什么优劣势,适用于哪些场景?

       这个问题也基本上都在上面了。

      垃圾回收的博文:https://my.oschina.net/u/2380961/blog/750189

      JVM的垃圾回收在幕后辛苦劳作,让我们"摆脱了"内存管理的负荷。听说Python就没有提供这么多的选择,等我都熟悉了得去比较下两者。

      《深入理解Java虚拟机》值得一看,上面的内容都是基于书上第三章的。爱Java,爱生活!

  • 相关阅读:
    psacct监视用户执行的命令,如cpu时间和内存战胜,实时进程记账
    iostat,mpstat,sar即时查看工具,sar累计查看工具
    sysstat服务负载统计,如CPU占有率,网络使用率,磁盘速度
    linux top命令VIRT,RES,SHR,DATA的含义
    lsof查看进程打开了哪些文件目录套接字
    linux系统监控常用工具
    Linux系统维护修复模式
    centos单用户模式:修改ROOT密码和grub加密
    Linux系统启动过程介绍
    Android原生APP内分享
  • 原文地址:https://www.cnblogs.com/tiecheng/p/6038504.html
Copyright © 2011-2022 走看看