面试题之JVM篇
2020-08-25 本文已影响0人
TZX_0710
1. 什么是JVM?
1.一个能够运行字节码的虚拟机
- 屏蔽了具体的操作系统的信息
- 使Java程序具有一次性编译,到处执行的特性
2. 什么是运行是数据区域?
Java程序运行时候,JVM单独划分出的一块内存区域,内存区域又划分出来的一块运行时数据区。
3. 运行 时数据区域的组成有哪些?
可以分为如下两块
线程共享区域: 堆、 方法区
线程私有区域: 虚拟机栈、本地方法栈、程序计数器4. 什么是堆?
不存放基本类型和引用类型 只存储new来的对象
存放了大量的对象,所以GC重点关注区域
线程共享区域 线程不安全
能够发生内存溢出 OutMemoryError和StackOverflowError
Java堆的区域可以划分为 新生代 老年代
新生代占比1/3 老年代占用2/35. 什么是方法区?
1.线程共享区域,线程不安全区域
- 方法区也可能发生OutMemoryError的异常区域
- 方法区存储的是class文件加在进来的静态变量、类信息、常量池以及编译器 编译后的代码
常量池
常量池可以分为class文件常量以及运行时常量池5.1 方法区跟永久代、元空间之间的关系?
方法区是Java虚拟机规范中的定义,是规范。永久代是一个标准。元空间是实现.Java8之后
元空间取代了永久代
7. 什么是虚拟机栈?
1.线程私有区域,每一个线程独有一个虚拟机栈。线程安全。
- 存放基本类型和对象引用
- 每一个方法执行的时候都会在虚拟机栈中创建一个队形的栈桢.方法执行后销毁。方法栈帧是以先进后出的方式
- 栈帧内部可以划分局部变量表、操作数栈、方法出口
- 这个区域可能有2种异常 。StackOverFlowerror,递归可能会造成这种情况,因为线程请求的深度超过了虚拟机允许的深度。OutOfMemoryError Jvm动态扩展申请不到足够内存
8. 什么是本地方法栈?
本地方法栈和虚拟机方法栈的唯一区别虚拟机方法栈是服务Java方法,而本地方法栈是为虚拟机使用到的Native方法服务。
9. 什么是程序计数器?
- 记录线程所执行的位置。
- 线程私有 ,每一个线程都有一个程序计数器,线程安全
- 不存在OutOfMemorryError的区域。
10. GC是什么?为什么要有GC?
GC是垃圾收回,Java提供的GC可以自动检测对象是否超过了作用域而达到自动回收。因为程序计数器、虚拟机栈、本地方法栈的生命周期是随着线程而灭,所以需要GC的区域在堆、和方法区。
Java的GC机制、在Jvm中,有一个低优先级的线程,在JVM空闲或者内存不足的时候触发,扫描没有任何引用的对象,并且把他们添加到要回收的集合当中。
11. G1垃圾收集器简单描述?
- G1垃圾收集器是一个由整理内存过程的垃圾收集器,不会产生很多碎片
- G1的Stop the World更可控,G1在停顿上添加了预测机制,用户可指定期望的停顿时间
- G1 将整个heap划分为多个大小相等的独立区域
- G1可以充分利用CPU、多核硬件优势、缩短STW
- G1整体使用标记-整理算法,局部使用复制算法,不会产生内存碎片
- G1不存在物理层面上的新生代和老年代
12. GC的回收步骤?
- 初始标记:标记一下GC Roots能直接关联的对象,需要停顿线程,耗时很长
- 并发标记,从GC Roots开始对堆中对象进行可达性分析,找出来存货的对象,耗时较长,可以程序并发执行
- 最终标记 :修改在并发标记因为用户程序继续运行导致标记产生变动的那一些因素
- 筛选回收:对各个region的回收价值进行排序,根据用户所期望的GC停顿时间进行回收。
13.什么是元空间?
- 在1.8的jdk中,永久代已经不存在,存储的类信息,编译后的代码数据等已经移到了MetaSpace元空间中,元空间并没有处于堆内上,而是直接占用的本地内存
- 元框架和永久代的区别在于,元空间不在虚拟机中,使用本地内存
- 元空间的大小受限于本地内存限制。
14.为什么元空间要替代永久代?
- 字符串存在永久代中,容易内存溢出
- 类及方法的信息等比较难确定大小,因此永久代的大小指定比较困难,容易出现永久代溢出,太大容易导致老年代溢出
- 永久代给GC带来不必要的复杂第,并且回收效率偏低
- Oracle可能会将HotSpot于Jrockit合二为一