JVM面试题目

4 篇文章 0 订阅

1. 堆和栈的理解:

堆是用来存放数组和对象数据的,栈是用来存放程序运行期间需要使用的局部变量的。栈中也会存放一些比较小的数据,比如java 的 几种基本数据类型(int,byte,double, boolean,long,char,float)和比较小的单位。

2. 垃圾回收了什么?

垃圾回收针对的是堆中的数据块(可以想一下,栈中存放的都是定义在方法内部的局部变量,一旦回收方法一定会报错)。顾名思义,垃圾回收会回收掉没用的数据块。那么,什么样的数据是没用的呢?在程序之后的运行过程中短时间内将不会再用到或者正在不被使用的数据块,都可以称之为垃圾。

3. 垃圾回收的依据是什么?

jvm中用“引用”来表示一个对象是否正在被使用或者是有用的。引用又分为:强引用、软引用、弱引用、虚引用。

强引用:被“new”出来的对象,就是强引用范畴,且在程序结束前是不会被回收掉的

软引用:一些非必须但是还有用的对象,就是软引用范畴,会在内存溢出前回收掉

弱引用:同样用来描述一些非必须的对象,比软引用弱一点,垃圾回收的重点回收对象

虚引用:存在的意义就是在一个对象被回收时发出一个系统通知,可有可无,是一定会被回收掉的。

4. 垃圾回收算法

引用计数:将对象的引用进行计数,当计数为0时可以进行回收。缺点是无法解决循环引用的问题。

标记-清除:从根目录开始,对所有存活对象进行标记,然后在第二次扫描时清除所有没有被标记的对象。缺点是会产生大量内存碎片。

复制:将内存区域分成两块,只使用其中一块,回收时将存活的对象都复制到另一块。优点是解决了内存碎片化的问题,缺点是需要两块内存区域。而且不适用于存活对象很多的情况。

标记-整理:是标记-清除和复制算法的结合,将内存分成两块,第一遍将所有存活对象进行标记,第二遍将所有存活对象复制到另一块区域。

分代收集算法:将对象分为三种:新生代、年老代和持久代,采用不同的算法进行回收、

 新生代回收:新创建的对象可以视为新生代,分配很小的区域来保存。新生代的特点是生命周期较短,因此用复制算法来进行回收。

年老代回收:经过好几次垃圾回收依然存活的对象,就会被视为年老代。年老代的特点是生命周期较长,每次需要被回收的对象很少,所以用标记-整理算法来进行回收。

持久代回收:java类和方法等静态文件可以视为持久代。持久代的回收不依赖于垃圾回收算法,而是有自己的规则。如果当前类不存在任何实例化的对象或者该类的classLoader已经被回收或者该类已不可访问时,就会被回收。

5. 垃圾回收触发时机

因为jvm对对象进行了分代处理,所以触发时机也不一样。GC有两种类型:Scavenge GC和Full GC

针对新生代的垃圾回收(Scavenge GC):如果创建新对象时发现分配给创建新对象的可用内存不够,或者发生了异常,就会触发此垃圾回收。

针对所有代的垃圾回收(Full GC):如果堆内存不够用了,就会触发此垃圾回收。无论新生代,还是年老代或持久代,都无法幸免。

6. 垃圾回收器

针对新生代:单线程收集器(Serial),多线程收集器(ParNew),多线程可控收集器(Parallel Seaverage);

针对年老代:单线程收集器(Serial Old),多线程收集器(Parallel Old),多线程标记清除收集器(CMS);

针对两者:分代收集器(G1)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值