关于面试:面试JVM

44次阅读

共计 4362 个字符,预计需要花费 11 分钟才能阅读完成。

194. 说一下 jvm 的次要组成部分?及其作用?195. 说一下 jvm 运行时数据区?196. 说一下堆栈的区别?197. 队列和栈是什么?有什么区别?198. 什么是双亲委派模型?199. 说一下类加载的执行过程?(5 步)
200. 怎么判断对象是否能够被回收?201. java 中都有哪些援用类型?202. 说一下 jvm 有哪些垃圾回收算法?203. 说一下 jvm 有哪些垃圾回收器?204. 具体介绍一下 CMS 垃圾回收器?205. 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?206. 简述分代垃圾回收器是怎么工作的?207. 说一下 jvm 调优的工具?208. 罕用的 jvm 调优的参数都有哪些?

JVM

194. 说一下 jvm 的次要组成部分?及其作用?

  • 类加载器 (ClassLoader)
    把 .Java 代码转换成字节码 .class
  • 运行时数据区 (Runtime Data Area)
    把字节码加载到内存中
  • 执行引擎 (Execution Engine)
    将字节码翻译成底层零碎指令,再交由 CPU 去执行
  • 本地库接口 (Native Interface)
    中介

组件的作用:首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集标准,并不能间接交个底层操作系统去执行,因而须要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层零碎指令,再交由 CPU 去执行,而这个过程中须要调用其余语言的本地库接口(Native Interface)来实现整个程序的性能。

195. 说一下 jvm 运行时数据区?

  • 程序计数器
    解释:指向以后线程所执行的字节码的行号,其实就是一小块内存,记录着以后程序运行到哪了, 字节码解释器的工作就是通过扭转这个计数器的值来选取下一条须要执行的字节码指令。分支,循环,跳转,异样解决,线程回复等都须要依赖这个计数器来实现。
  • 虚拟机栈
    Java 虚拟机栈与程序计数器一样,Java 的虚拟机栈也是线程公有的,虚拟机栈形容的是 Java 的办法执行的内存模型,每个办法在执行同时的都会创立一个栈桢用于存储 局部变量 表,操作数栈,动静链接,办法进口等信息
  • 本地办法栈
    本地办法栈和虚拟机栈类似,区别就是虚拟机为虚拟机栈执行 Java 服务(字节码服务),而本地办法栈为虚拟机应用到的 Native 办法 服务

  • 堆是 JVM 里最大的一块内存区域,被所有线程共享,在虚拟机启动时创立,此区域的目标就是 寄存对象实例和数组,简直所有的对象实例都在这调配
  • 办法区
    办法区也是一个线程共享的区域,存储已被虚拟机加载的 类信息,常量(final),动态变量(static),JIT(即时编译器)编译后的代码等数据。

运行时常量池 是办法区的一部分, 运行时常量池绝对于 类常量池 的另外一个个性就是具备动态性,运行期间可能将新的常量放入池中

有的区域随着虚拟机过程的启动而存在,有的区域则依赖用户过程的启动和完结而创立和销毁。

196. 说一下堆栈的区别?

  1. 栈内存存储的是局部变量而堆内存存储的是实体;
  2. 栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;
  3. 栈内存寄存的变量生命周期一旦完结就会被开释,而堆内存寄存的实体会被垃圾回收机制不定时的回收。

197. 队列和栈是什么?有什么区别?

  • 队列和栈都是被用来预存储数据的。
  • 队列容许先进先出检索元素,但也有例外的状况,Deque 接口容许从两端检索元素。
  • 栈和队列很类似,但它运行对元素进行后进先出进行检索。

198. 什么是双亲委派模型?

在介绍双亲委派模型之前先说下类加载器。对于任意一个类,都须要由加载它的类加载器和这个类自身一起确立在 JVM 中的唯一性,每一个类加载器,都有一个独立的类名称空间。类加载器就是依据指定 全限定名称 将 class 文件加载到 JVM 内存,而后再转化为 class 对象。

类加载器分类:

  • 启动类加载器(Bootstrap ClassLoader),是虚拟机本身的一部分,用来加载 Java_HOME/lib/ 目录中的,或者被 -Xbootclasspath 参数所指定的门路中并且被虚拟机辨认的类库;
  • 其余类加载器:
  • 扩大类加载器(Extension ClassLoader):负责加载 <java_home >libext 目录或 Java. ext. dirs 零碎变量指定的门路中的所有类库;</java_home>
  • 应用程序类加载器(Application ClassLoader)。负责加载用户类门路(classpath)上的指定类库,咱们能够间接应用这个类加载器。个别状况,如果咱们没有自定义类加载器默认就是用这个加载器。

双亲委派模型:如果一个类加载器收到了类加载的申请,它首先不会本人去加载这个类,而是把这个申请委派给 父类加载器 去实现,每一层的类加载器都是如此,这样所有的加载申请都会被传送到 顶层的启动类加载器 中,只有当父加载无奈实现加载申请(它的搜寻范畴中没找到所需的类)时,子加载器才会尝试去加载类。

199. 说一下类加载的执行过程?

类加载分为以下 5 个步骤:

  1. 加载:依据查找门路找到相应的 class 文件而后导入;
  2. 查看:查看加载的 class 文件的正确性;
  3. 筹备:给类中的动态变量分配内存空间;
  4. 解析:虚拟机将常量池中的符号援用替换成间接援用的过程。符号援用就了解为一个标示,而在间接援用间接指向内存中的地址;
  5. 初始化:对动态变量和动态代码块执行初始化工作。

200. 怎么判断对象是否能够被回收?

个别有两种办法来判断:

  • 援用计数器:为每个对象创立一个援用计数,有对象援用时计数器 +1,援用被开释时计数 -1,当计数器为 0 时就能够被回收。它有一个毛病不能解决循环援用的问题;
  • 可达性剖析:从 GC Roots 开始向下搜寻,搜寻所走过的门路称为援用链。当一个对象到 GC Roots 没有任何援用链相连时,则证实此对象是能够被回收的。

201. java 中都有哪些援用类型?

  • 强援用
  • 软援用
  • 弱援用
  • 虚援用(幽灵援用 / 幻影援用)

202. 说一下 jvm 有哪些垃圾回收算法?

  • 标记 - 革除算法
  • 标记 - 整顿算法
  • 复制算法
  • 分代算法

203. 说一下 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 选项。

204. 具体介绍一下 CMS 垃圾回收器?

CMS 是英文 Concurrent Mark-Sweep 的简称,是以就义吞吐量为代价来取得最短回收进展工夫的垃圾回收器。对于要求服务器响应速度的利用上,这种垃圾回收器非常适合。在启动 JVM 的参数加上“-XX:+UseConcMarkSweepGC”来指定应用 CMS 垃圾回收器。

CMS 应用的是标记 - 革除的算法实现的,所以在 gc 的时候回产生大量的内存碎片,当残余内存不能满足程序运行要求时,零碎将会呈现 Concurrent Mode Failure,长期 CMS 会采纳 Serial Old 回收器进行垃圾革除,此时的性能将会被升高。

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

  • 新生代回收器:Serial、ParNew、Parallel Scavenge
  • 老年代回收器:Serial Old、Parallel Old、CMS
  • 整堆回收器:G1

新生代垃圾回收器个别采纳的是复制算法,复制算法的长处是效率高,毛病是内存利用率低;老年代回收器个别采纳的是标记 - 整顿的算法进行垃圾回收。

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

分代回收器有两个分区:老生代和新生代,新生代默认的空间占比总空间的 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)时,降级为老生代。大对象也会间接进入老生代。

老生代当空间占用达到某个值之后就会触发全局垃圾发出,个别应用标记整顿的执行算法。以上这些周而复始就形成了整个分代垃圾回收的整体执行流程。

207. 说一下 jvm 调优的工具?

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

  • jconsole:用于对 JVM 中的内存、线程和类等进行监控;
  • jvisualvm:JDK 自带的全能剖析工具,能够剖析:内存快照、线程快照、程序死锁、监控内存的变动、gc 变动等。

208. 罕用的 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 详细信息。

正文完
 0