您的位置:首页 > 职场人生

JVM面试题集

2017-02-21 00:15 190 查看
1. 内存模型以及分区,需要详细到每个区放什么。

堆、虚拟机栈、方法区、本地方法栈、程序计数器

方法区:JVM加载的class对象、常量、静态常量

堆:几乎所有的对象实例

虚拟机栈:作为方法的内存模型,存放了方法的局部变量,操作数栈、动态链接、方法出口等.

程序计数器: 当前线程所执行字节码的行号指示器。

本地方法栈: 和虚拟机栈一样,但是只为本地方法服务。

堆和方法区是线程共享的,虚拟机栈和程序计数器以及本地方法区是线程私有的。

2. 堆里面的分区:Eden,survoir、老年代,各自的特点。

堆内存 = 新生代 + 老年代

一般GC都是指JVM中堆的操作。在现在的JVM中,堆可以分为新生代(Young)和老年代(Old)

新生代又分为Eden和 form survior、to survior (8:1:1)、old

3. 对象创建方法,对象的内存分配,对象的访问定位。

4. GC对象的两种判定方法:引用计数与(GC Root)引用链。

引用计数:根据当前对象是否存在引用来判断,如果引用为0,那么就直接回收.

引用链:存在一个GC ROOT对象,当需要判断的对象如果不可达GC ROOT对象的时候,那么就进行回收。

哪些对象可以作为GC ROOT呢?

5. GC的三种收集方法?分别的使用场景?如果让你优化收集方法,有什么思路?

标记-清除:

标记出所有需要回收的对象,标记的过程就是判断对象是否还被引用,标记为是否需要被回收。

然后把标记的内存进行相应的回收。

缺点:效率不高,标记和清除的操作都存在效率问题。并且会容易产生很多不连续的内存空间,如果
 新生成对象需要的内存空间过大,如果没有足够连续的空间分配,就会提前触发GC操作。
 
 

复制算法:每次将内存分成大小相同的两块,每次只是使用其中的一块,当这块内存用完了,就将还存活的对象

复制到另外一块内存中,然后直接回收这块内存。内存分配的时候不需要考虑内存碎片等复制情况的问题,只要

移动堆顶指针,按顺序分配内存就可以。

缺点:需要浪费到一半的内存空间不使用。

标记-整理算法:先标记处需要清除的对象,然后将存活的对象全部移动到边界处,然后清除边界以外的其他内存。

缺点:复杂度明显增加。

分代回收算法:

现在商用的虚拟机中对垃圾回收根据各个年代的特点选用不同的回收算法。

新生代:由于新生代存活的对象少,存在大量死亡的对象,所以采用复制算法。

老年代:由于老年代的对象存活时间很长,没有额外的空间做担保,所以采用标记-清除或者标记-整理算法。

6. GC收集器有哪些?CMS收集器与G1收集器的特点。

7. Minor GC与Full GC分别在什么时候发生?

Minor GC (新生代GC):常发生在新生代内存中,由于jvm对象,Minor GC发生非常频繁,所以回收也很迅速。

 

8. 几种常用的内存调试工具:jmap、jstack、jconsole。

jps

jstack

jconsole

jvisualvm

9. 类加载的五个过程:加载、验证、准备、解析、初始化。

10. 双亲委派模型:Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。

11. 分派:静态分派与动态分派。

12、什么时候JVM开始GC?

13、内存溢出?

SOF:栈溢出

OOM:内存溢出

14、java内存模型?

可见性:主内存和工作内存。每个线程都有属于自己的工作内存。

重排序(happen-before)原则:

15、锁的优化?重入锁?自旋锁?

16、MYSQL中插入1000万条数据,然后查询某个值。比较创建索引和不创建索引需要的时间。
总结整理Mysql的索引性质。

推荐书籍:《深入理解Java虚拟机》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: