常见面试题-JVM

1.jvm的主要组成部分,及其作用

  • 类加载器(ClassLoader)

把Java代码转换成字节码

  • 运行时数据区(Runtime Data Area)

把字节码加载到内存中

  • 执行引擎(Execution Engine)

字节码文件只是jvm的一套指令集规范,不能直接让底层操作系统执行,需要特定的命令解析器执行引擎,将字节码翻译成底层系统指令,交给cpu执行

  • 本地库接口(Native Interface)

cpu执行指令时通过本地库接口调用其他语言

2.jvm运行时数据区组成部分

  • 程序计数器
  • 虚拟机栈
  • 本地方法栈

线程隔离的数据区

  • 方法区

线程共享的数据区

3.堆和栈的区别

  1. 栈内存存储局部变量,堆内存存储实体
  2. 栈内存更新速度快于堆内存,因为局部变量生命周期短
  3. 栈内存存放的变量生命周期结束后会被释放,堆内存中的实体会被垃圾回收机制不定时回收

4.队列和栈的区别

  1. 队列和栈都是被用来预存储数据的
  2. 队列允许先进先出检查元素,例外情况:Deque接口允许从俩端检索元素
  3. 栈对元素进行先进后出检索

5.双亲委派模型

类加载器:对任何一个类,其在jvm中的唯一性由加载该类加载器和该类本身确立,每个类加载器,都有一个独立的类名称空间。类加载器根据类的全限定名称将class文件加载到jvm内存,然后转为class对象

类加载器分类:

  • 启动类加载器(Bootstrap ClassLoader):是虚拟机自身的一部分,用来加载Java_HOME/lib/目录,或着被-Xbootclasspath参数所指定路径中,被虚拟机识别的类库
  • 其他类加载器
  • 扩展类加载器(Extension ClassLoader):加载/lib/ext目录或java.ext.dirs系统变量指定路径中的类库
  • 应用程序类加载器(Application ClassLoader):负责加载用户类路径(classpath)上的指定类库,可直接使用。一般情况下,如果我们没有自定义类加载器则默认使用该类加载器

双亲委派模型:当一个类加载器收到类加载请求,首先不会自己加载这个类,而是将请求委派给父类加载器完成,只有父加载器无法完成加载请求时,子加载器才会加载类

6.类加载的执行过程

  1. 加载:根据查找路径找到对应的class文件导入
  2. 检查:检查加载的class文件的正确性
  3. 准备:为类中的静态变量分配存储空间
  4. 解析:虚拟机将常量池的符号引用替换成直接引用。符号引用理解为一个标识,直接引用则直接指向内存中地址
  5. 初始化:对静态变量和静态代码块执行初始化工作

7.如何判断对象是否可以被回收

  1. 引用计数器:为每个对象创建一个引用计数,有对象引用时计数器+1,引用释放则-1,当计数器为0表示可以被回收。缺点是无法解决循环引用问题
  2. 可达性分析:从GC Roots开始向下搜索,搜索走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则表示此对象可被回收

8.java引用类型

  • 强引用
  • 软引用
  • 弱引用
  • 虚引用

9.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 选项。

10.CMS 垃圾回收器

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

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

11.新生代和老生代垃圾回收器的种类以及区别

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

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

  • 整堆回收器:G1

区别:新生代垃圾回收器一般采用复制算法,该算法效率高,但内存利用率低。老年代回收器采用标记-整理算法。

12.分代垃圾回收器如何工作

分代回收器有俩分区:老生代和新生代,新生代默认的空间占比为总空间的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 移动时都存活的额对象,年龄+1,当年龄到达15,升级为大对象,会直接放入老生代

老生代当空间占用达到某个值后会触发全局垃圾收回,一般使用标记整理执行算法。

13.jvm调优工具

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

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

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

14.常用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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值