JVM-面试复习记录

1.JVM了解吗?可以和我说说他都有什么吗?

JVM分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面,class类信息常量池等放在方法区里面,程序计数器进行记录线程执行行号.

2.你可以和我说说压栈的过程吗?

栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面有局部变量表,操作数栈,方法出口等信息,局部变量表存放的是8大基础类型加上一个应用类型,压栈过程遵循先进后出原则.

3.你可说说JVM哪一个区域是不会发生OOM(内存溢出)的么?

程序计数器,他是唯一不会发生内存溢出的区域,他的作用是记录当前线程执行行号.

4.你可以说说堆中的分区吗?他们的优缺点是什么?

堆里面分为新生代和老年代(java8取消了永久代,采用了metaspace),新生代包含Eden+Survivor区,新创建的对象一般都会在新生代,survivor区里面分为form和to区,内存回收时,如果使用复制算法,从form复制到to,当经历过一次或多次,存活下来的对象会被移动到老年区.

5.什么时候进行Minor GC ? 什么进行Full GC?

当新生代的内存不够用是会触发Minitor GC , 当JVM内存不够用是才会触发Full GC.

6.JVM对于大的对象一般是怎么处理的?

如果有特别大的对象首先也是在新生代存储,但如果新生代放不下的话,会进入老年代进行存放,因为JVM一般认为大对象存活时间较久,所以会放入老年区.

7.GC的失效JVM是如何判定的呢?

第一种引入计数法,指的是如果某个地方引用了这个对象就+1,失效就-1,为0时就进行回收

缺点:JVM没有采用这种方式,因为无法处理相互循环引用问题(例如A引用B,B引用A)的情况

第二种引用链路法:通过GC Root的对象来判断,如果有一条链路能够到达GC ROOT就说明不能进行回收,不能到达GC Root 则可以进行回收

8.SafePoint是什么?

SafePoint就是要等到所有线程进行到SafePoint的时候 VM线程才会开始执行GC.

他一般存在 循环的末尾  方法返回前  调用方法的call之后  抛出异常的位置

9.你可以说说GC有哪几种回收方法吗?

标记清除:先标记在清除,效率不高,会产生碎片,并且浪费内存.

标记整理:进行标记后,在整理,不会产生内存碎片问题和内存浪费问题

复制算法:Eden区和survivor区比例为8:1 ,标记整理后让存活的对象向一端移动,然后进行复制.优点不会产生碎片

分代收集算法:针对不同的分区采取不同的算法,年轻代使用复制算法,因为存活时间不长 ,老年代使用标记整理或者标记清除,因为老年代对象存活时间久,把存活的对象移动到另一个内存快会由于对象存活时间长导致效率低,所以采用标记整理或者标记清除.

10.GC的收集器有哪些?他们特点是什么?

并行收集器:串行收集器使用一个单线程的线程进行收集,GC时服务有停顿时间.

串行收集器:一次回收要使用多线程来执行.

CMS收集器:基于"标记清除"算法实现的,要经过多次标记才会被清除

G1收集器:基于标记整理算法实现的收集器,但局部上有加入复制算法实现.

11.几种常见的内存调试工具有?

jstack:查看当前栈的情况

jmap:查看内存

jhat:进行dump 堆的信息

12.说说类加载的过程有些哪些?

a.加载 b.验证 c.准备 d.解析 e.初始化 f.使用 g.卸载

加载: 通过权限定名来加载class对象到内存中.

验证:对内存中的二进制信息进行校验,查看是否符合虚拟机运行环境

准备:对这个对象进行内存分配

解析: 将符号引用转化为直接引用

初始化:开始执行classLoder 构造器的代码.

13.简述一下java垃圾回收机制

在 java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在

JVM 中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚

拟机空闲或者当前堆内存不足时,才会触发执行,扫描那些没有被任何引用的对象,并将

它们添加到要回收的集合中,进行回收。

14.什么是Java内存模型?

Java内存模型是线程间通信的控制机制,JMM(Java内存模型)定义了主内存(共享内存)和线程私有本地内存,本地内存存储了该线程以读/写共享变量的副本

线程间通信需要经历两个步骤

a. 线程A把本地内存的值刷到主内存中去

b.线程B在到主内存中去读取这个已经更新的值.

15.什么是双亲委派模型?

当一个类收到了类加载请求时,不会先去加载这个类,而是委派给父类去加载,如果父类也无法加载,则反馈给子类,由子类去完成类的加载.这么做的目的主要是处于安全考虑,避免java的内部类被覆盖重写造成读取不安全的问题.

16.什么是类加载器,类加载器有哪些呢?

1.启动类加载器(BootStrap ClassLoader):主要加载Java核心类库,由C++实现,无法被Java程序员直接引用

2.扩展类加载器(Extension ClassLoader):主要加载扩展jar包.

3.系统类加载器(System ClassLoader):它根据Java应用类的路径CLASSPATH来加载Java类

4.用户自定义加载器(User ClassLoader):自定义加载器,通过集成classLoader类,重写findClass方法进行实现.

 

你可能感兴趣的:(jvm,java)