我是靠谱客的博主 冷傲衬衫,最近开发中收集的这篇文章主要介绍关于JVM的面试总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

   总结下面试过程中关于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的面试总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部