JVM相关面试题

本文详细解释了Java虚拟机(JVM)的结构,特别是堆和线程私有的区别,以及fullgc和younggc的区别。讨论了年轻代对象晋升到老年代的条件,设置两个survivor区的原因,以及年轻代和老年代采用的不同垃圾回收算法。还介绍了引用计数法和可达性分析在确定垃圾回收中的作用。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、JVM是什么?

Java虚拟机是指运行在操作系统之上的、可运行Java代码的假想计算机。它可以屏蔽操作系统底层的差异,使得Java程序可以实现“一次编译,到处运行”。

二、JVM分区

线程共享

1、堆:存放创建的实例对象及数组(包含字符串常量池)
2、元空间(jdk1.7及以前叫做方法区,占用Java虚拟机内存):保存加载的类信息、静态变量。占用本地内存空间

线程私有

1、虚拟机栈:存储方法的局部变量、方法出口等信息
2、本地方法栈:与虚拟机栈功能一致,但存储的信息是本地方法,本地方法包括native关键字声明的本地方法。
3、程序计数器:指示当前线程执行的字节码行号

三、fullgc和younggc

younggc:非常频繁,回收速度快

指针对堆中的年轻代使用的垃圾回收机制,当年轻代的eden区满时,会触发一次younggc。

fullgc:回收速度慢

是指对年轻代、老年代进行一次全面的垃圾回收,触发的条件有:
(1)晋升进入老年代的对象大小大于老年代的可用内存时
(2)调用system.gc方法时

四、什么时候年轻代的对象会进入老年代?

年轻代中的对象每经历一次垃圾回收,年龄就会加一,当年龄达到我们设置的阈值时,年轻代的对象就会被移至老年代。

五、年轻代设置两个survivor区的原因是什么?

survivor区每次只使用其中一个。新创建的对象会先进入到eden区,当eden区满了后,触发一次younggc,对eden区和正在使用的survivor区进行垃圾清理,将存活的对象放入另一个survivor区。
这样做可以防止产生内存碎片。

六、分代垃圾回收算法

1、年轻代:标记复制算法

由于年轻代的特点就是存活的对象比较少,所以采用标记复制算法效率高,而且不会产生内存碎片。

2、老年代:标记整理算法

由于老年代的存活对象较多,如果采用标记复制算法的数据复制成本较高,降低效率,因此采用标记整理算法。

垃圾回收算法

1、标记清除算法
先标记处需要回收的对象,再根据标记对这些对象占用的内存空间进行清理。
2、标记复制算法
将内存分为相等两份,每次只使用其中一块,当这块内存满了之后,将存活的对象移至另一块内存,这样可以避免内存碎片的产生。
3、标记整理算法
先标记出需要回收的对象,将存活的对象移至内存的另一侧,将存活对象内存边界以外的可回收对象清楚。

七、如何确定垃圾?

引用计数法

当一个对象没有任何与之关联的引用,引用计数为0时,就说明可以被垃圾回收。

可达性分析

以gcroots为起点开始向下搜索,当一个对象与任意一个gcroots之间都没有任何一条可达路径,则说明可以进行垃圾回收。
包括虚拟机栈、本地方法栈中引用的对象以及静态属性引用的对象等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值