总结下面试过程当中关于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文件数据的正确性,若是载入有害文件容易致使系统蹦掉; 准备:给类的静态变量分配存储空间; 解析:将符号引用转成直接引用; 初始化:对类的静态变量和静态代码块执行初始化操做。