概述
总结下面试过程中关于JVM的知识,本人面试的是算法工程师,也会被问到Java中的知识,JVM被问到的次数还挺多的,现在整理下。
面试官一般会这么问,你懂JVM,讲一讲?这时就要看自己的条理和重点了。
我看了周志明的书,觉得可以回答重要的点有:内存分配、垃圾回收、类加载机制,以下主要参考该书。
一:内存分配:JVM内存中的区有:程序计数器、虚拟机栈、本地方法栈、堆、方法区。然后分别解释下每个区存的对象以及特点。
程序计数器:线程私有,通过程序计数器获取下一条要执行的指令。
虚拟机栈:线程私有,每个方法调用到执行完成的过程,都对应栈帧入栈到出栈的过程。里面包括:局部变量表,操作数栈,动态链接,方法出口。在局部变量表中存放着基本数据类型和引用。
本地方法栈:与虚拟机栈类似,只是这里面的存的方法是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文件数据的正确性,如果载入有害文件容易导致系统蹦掉;
准备:给类的静态变量分配存储空间;
解析:将符号引用转成直接引用;
初始化:对类的静态变量和静态代码块执行初始化操作。
最后
以上就是冷傲衬衫为你收集整理的关于JVM的面试总结的全部内容,希望文章能够帮你解决关于JVM的面试总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复