最近面试比较喜欢问一些JVM的问题,在网上找了一些问题如下
1、GC 算法,除了常见的复制算法,标记整理,标记清除算法,还有哪些?
增量算法。主要思想是垃圾收集线程与用户线程交替执行。也可以说一边执行垃圾回收一遍执行用户代码。但是这种方法会造成系统吞吐量下降。
分代收集。这种方法没有使用新算法,只是根据对象的特点将堆分为年轻代和老年代,年轻代使用复制算法,老年代使用标记整理算法。
2、简述JVM, 从类加载一直到运行时的内存区域
3、Java 内存模型
深入理解 Java 虚拟机
4、问 JVM 内存分代机制(会问分为那几个代,各个代特点),分代回收的优点(这个问了很多次)。
分为年轻代和老年代,年轻代中的对象生命周期短,基本是朝生夕死,所以需要频繁的回收;老年代中的对象一般都能熬过多次 GC 所以他们不需要频繁回收。分代收集利用了这种特点,年轻代使用复制算法,老年代使用标记整理算法,所以总的来说分代收集的效率相对还是不错的。
5、Java 虚拟机类加载机制,双亲委派模型
深入理解 Java 虚拟机
6、minor GC 和 Full GC 的触发时机
minor GC: 当 eden 区满以后会触发。
Full GC:
JVM 的一些特性比如分配担保,大对象直接进入老年代,长期存活的对象进入老年代等等都会不断增加老年代的使用率,当老年代空间不足以支持下一次 Minor GC 时会触发一次 Full GC
当用户代码调用 System.gc 时,系统系统建议执行 Full GC,但是否进行是由 JVM 来决定的。
7、JVM 中什么样的对象是可以回收的,对象从新年代到老年代的转移过程,JVM 哪些地方会溢出(除了程序计数器都有)
当对象熬过一定次数的 GC 后,会被转移到老年代
当 Eden + From surviver 中存活对象过多,To surviver 区存放不下的时候,剩余的对象会进入老年代
栈中的引用的对象
方法区常量引用的对象
方法区静态域引用的对象
JNI 引用的对象
GC roots 不可达的对象是可以回收的。
转移过程
8、Java虚拟机的一些参数配置
深入理解 Java 虚拟机
9、介绍垃圾收集器,CMS 和 G1 的区别,G1 的优点;
General statement: So our recommendation is always to firstly understand what GC goals you want.
1.) Application Throughput - How much % time are you willing to hand over to GC activity? We typically recommend that Application throughput should be 95%+, correspondingly GC throughput should be <5%. Censum has graphs and an analytic to report on this.
2.) Pause time - What individual pauses are you willing to put up with? For example, "2 ~3 second pauses a day with the rest < 100ms"
3.) Footprint (Heapsize) - How much Heap can you allocate/afford? Memory isn't always cheap on virtualised envs...
G1 vs CMS - when to try:
With the general statement in mind, G1 is designed to be a low configuration, low pause collector for large heaps. You do sacrifice some application throughput and of course some heap space in order to meet those low pause time goals. A major design goal is that hopefully you can do this with almost zero configuration.
CMS was also designed to be a fairly low pause collector for small --> large(r) heaps, but arguably it wasn't designed up front for the larger heaps we see today in the wild. It's seen by many to require much more configuration than G1 (or any other collector) and has some nasty 'blow out' failure cases (well OK, G1 has those also :-)).
So, when to use G1? When configuring CMS gets too hard and/or your heaps are large (2-4GB+) and/or you want to be able to explicitly set pause time goals.
Please only use G1 on 1.8.0_40+ and the usual caveats apply that your application and JVM may vary!
G1 基本不用配置,低停顿,用于大容量的堆。但是他牺牲了应用程序的吞吐量和部分堆空间。
CMS 配置比较复杂,合理的低停顿,用于中等或更小的堆。注重吞吐量。
所以当你觉得配置 CMS 太难了,或你的堆在 2 G 以上,或你想要显式的指定停顿时间那么你可以使用 G1。否则使用 CMS
以上大概意思如下:
深入理解 Java 虚拟机
我们选择哪个收集器是由我们垃圾回收的目标来决定的,主要考虑以下几点:
G1 vs CMS
吞吐量
停顿时间
堆容量
10、GC 过程,FullGC 过程;
11、什么情况会栈溢出
如果线程请求的栈容量超过栈允许的最大容量的话,Java 虚拟机将抛出一个 StackOverflow 异常
12、JDK1.8 中 JVM 做了那些改变
主要是撤销了永久代,引入元空间(本地内存)
13、常用 JVM 调优工具有哪些(Jstatus,JStack,Jmap等),有没有调有经验.
14、知道 OOM 吗,举一个 OOM 的例子
内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
启动参数内存值设定的过小;
15、介绍一下 Java 的强软弱虚四种引用,问什么时候使用软引用
一般new出来的对象都是强引用,GC 不会回收强引用的对象
软引用:软引用的对象不那么重要,当内存不足时可以被回收。非常适合于创建缓存。
弱引用:只是引用一个对象,若一个对象的所有引用都是弱引用的话,下次 GC 会回收该对象。一般用在集合类中,特别是哈希表。
虚引用:一般用于对实现比较精细的内存使用控制。对于移动设备来说比较有意义
欢迎关注重庆java圈,有重庆java内推机会。