JVM 面试重点总结

1. 介绍JVM的内存区域(运行时数据区)

JVM 中内存分为若干部分: 堆,方法区,虚拟机栈,本地方法栈,程序计数器。其中方法区和堆是线程共享的部分,其他是线程隔离的。

1. 堆是用来存放实例对象和数组对象的。 Java堆还可以细分为新生代和老年代,Java堆在物理上不连续,只要在逻辑上连续。

2.方法区用来存储已被虚拟机加载的类信息,常量,静态变量

3. 虚拟机栈式java方法执行的内存模型

4. 本地方法栈,Java调用本地方法。

5. 程序计数器,,记录当前线程执行到的字节码的行号。

 

2. 如何判断对象已经死亡

1. 引用计数法

每当一个地方引用它,计数器就会+1,当引用失效时,计数器会减1,当为0时,对象不在使用,无法解决循环引用问题。

2. 可达性分析

这个算法的基本思想是通过一系列称为"GC Roots"的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到CG Roots没有任何引用链相连的话,证明此对象是不可用的。

 

3. 简述强,软,弱,虚引用

1. 强引用

如果一个对象具有强引用,垃圾回收器绝不会回收它,当内存不足时,Java宁愿抛出OutOfMemoryError错误,使程序异常终止。

2. 软引用

如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足,就会回收这些对象的内存,只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的告诉缓存。

3. 弱引用

相对于软引用,弱引用关联的对象只能生存到下一次垃圾回收之前。

4. 虚引用

 

4. 简述垃圾收集算法以及各自的特点

 

1. 标记-清除算法

1. 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象, 它是最基础的收集算法,会带来两个明显的问题;1: 效率问题和2 内存碎片

2. 复制算法

将内存分为大小相同的两块, 每次使用其中的一块,当这一块内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次性清除掉。这样就使每次的内存回收都是对内存空间一半进行回收。但是,为了收集垃圾,将内存使用量降低为一半,成本比较高。所以,一般不会1:1划分空间。

3. 标记-整理算法

标记过程与标记-清楚算法一致,但后续操作不是直接对可回收对象进行回收,而是让所有存活的对象像一段移动,然后直接清理掉边界以外的内存。

4. 分代收集算法

一般Java堆分为新生代和老年代。

比如新生代,每次收集都会有大量对象死去,所以可以选择复制算法,老年代对象存活率高,可以选择标记清楚,标记整理算法。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值