关于JVM的面试总结

   总结下面试过程当中关于JVM的知识,本人面试的是算法工程师,也会被问到Java中的知识,JVM被问到的次数还挺多的,如今整理下。java

   面试官通常会这么问,你懂JVM,讲一讲?这时就要看本身的条理和重点了。面试

   

   我看了周志明的书,以为能够回答重要的点有:内存分配、垃圾回收、类加载机制,如下主要参考该书。算法

一:内存分配:JVM内存中的区有:程序计数器、虚拟机栈、本地方法栈、堆、方法区。而后分别解释下每一个区存的对象以及特色。spa

   程序计数器:线程私有,经过程序计数器获取下一条要执行的指令。线程

   虚拟机栈:线程私有,每一个方法调用到执行完成的过程,都对应栈帧入栈到出栈的过程。里面包括:局部变量表,操做数栈,动态连接,方法出口。在局部变量表中存放着基本数据类型和引用。对象

   本地方法栈:与虚拟机栈相似,只是这里面的存的方法是Native方法。内存

   堆:线程共享,主要存的是new出来的对象,做为垃圾回收主要照顾的地方。虚拟机

   方法区:存的是类的信息、常量、静态变量。效率

讲完这么多就差很少了,固然还能够再补充点,至少我没有被细问的状况。变量


二:JVM怎么判断对象是否可回收

   1.引用计数法,有引用是+1,失效时-1,判断是否为0。缺点:没法解决互相引用的状况,计数总会大于0,可是这两个对象已经再也不有用了。

   2.实际使用的方法是:可达性分析算法,经过使用一些GC roots,来判断对象从根对象是否可达,不可达就能够回收。这里讲的时候补充下,哪些能够做为根对象:

     1).虚拟机栈中引用的对象

     2).方法区中类静态属性引用的对象

     3).方法区中常量引用的对象

     4).本地方法栈中JNI(即通常说的Native方法)引用的对象。

  另外能够谈谈强引用、软引用、弱引用、虚引用(主要做用是在该对象垃圾回收的时候发送一个系统通知)。

   昨天刚写了上面这些,今天面试又被问了一遍,就按照上面的思路说了一遍,再补充点。

   面试官提问:除了堆里面的对象须要被回收,还有哪一个地方的须要回收?

   答:方法区,方法区中的无用的类和废弃常量。

   新生代和老年代默认大小?

   答:1:2。

   类的回收须要知足什么条件?

   答:三个条件须要所有知足(周志明书上有):1.该类的实例已经都被回收,即Java中再也不有该类的任何实例。2.加载该类的ClassLoader已经被回收。3.该类对应的java.lang.Class对象没有在任何地方被引用,没法在任何地方经过反射访问该类的方法。

  

三:Java垃圾回收算法:

  1.标记-清除:先标记再清除,主要是空间会产生大量的碎片。

  2.复制算法:主要是新生代使用的方法,经过划分红Eden:from Survivor:to Survivor = 8 : 1 :1,其中一个survivor为空,把未被垃圾回收的对象复制到该区。

  3.标记-整理:老年代使用,先标记再整理,整理的时候把剩余的对象推向一端,就不会产生像清除算法的内存碎片。

  这里被问到:为何Java须要多种回收算法? 答:每一个代对象生存时间长短不同,须要针对性地处理。再把上面几种方法稍做分析。(好比,老年代不使用复制算法,由于老年代回收时存活率较高,每次都要复制的话,效率过低。)


 四:内存分配和回收策略:

    1).对象优先存在Eden区,内存不够时,发生一次Minor GC。

    2).大对象直接进入老年代,由于相对而言Eden区,Eden区小。

    3).长期存活的对象将进入老年代,默认是15岁。

    4).动态年龄断定,对象不必定要15岁才进入老年代,好比进入survivor区的对象相同年龄的大小总和超过该内存的一半,那么大于或等于该年龄的就能够进入老年区。 

    5).空间分配担保。年轻代发生YGC时,会把存活的对象复制到空的survivor中,存不下的话就放置到老年区。这时就有可能老年代存不下这些对象,因此须要判断老年代中最大的连续可用内存是否大于  历次晋升到老年代对象的平均大小(取平均值只是做为一种较好折中的手段)。若存的下,就进行担保,不然不进行担保这时须要进行一次full GC。


 五:类加载机制

  装载:查找和导入Class文件;   连接:把类的二进制数据合并到JRE中;   验证:检查载入Class文件数据的正确性,若是载入有害文件容易致使系统蹦掉;   准备:给类的静态变量分配存储空间;   解析:将符号引用转成直接引用;   初始化:对类的静态变量和静态代码块执行初始化操做。