您的位置:首页 > 运维架构 > 网站架构

java架构师成长路线-JVM面试题

2020-08-31 21:49 1216 查看

鲁班学院java架构师成长路线

1、jvm的类加载机制是什么样的?有几类加载器?

2、JVM提供了3种类加载器

3、JDK8中MetaSpace代表什么?

4、JVM内存结构是什么样的?

5、Java中垃圾收集的方法有哪些?

6、MinorGC和FullGC的区别?

7、请写出常用的几种垃圾回收器及启用参数

答案如下:
1、jvm的类加载机制是什么样的?有几类加载器?

jvm通过双亲委派模型进行类的加载,即当某个类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

2、JVM提供了3种类加载器

(1)启动类加载器(Bootstrap ClassLoader):负责加载 JAVA_HOME\lib 目录中的,或通过-Xbootclasspath参数指定路径中的,且被虚拟机认可(按文件名识别,如rt.jar)的类。(2)扩展类加载器(Extension ClassLoader):负责加载 JAVA_HOME\lib\ext 目录中的,或通过java.ext.dirs系统变量指定路径中的类库。(3)应用程序类加载器(Application ClassLoader):负责加载用户路径(classpath)上的类库。

3、JDK8中MetaSpace代表什么?

MetaqSpace是JDK8才诞生的名词,它是一种新的内存空间,中文译为:元空间;JDK8 HotSpot中移除了永久代(PermGen Space),使用MetaSpace来代替,MetaSpace是使用本地内存来存储类元数据信息。内存容量取决于操作系统虚拟内存大小,通过参数MaxMetaspaceSize来限制MetaSpace的大小。

4、JVM内存结构是什么样的?

JVM内存主要分为五个区:方法区,虚拟机栈,本地方法栈,堆,程序计数器;每个区特点如下:1》方法区

JVM内存主要分为五个区:方法区,虚拟机栈,本地方法栈,堆,程序计数器;每个区特点如下:1》方法区

1.有时候也称为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对类型的卸载

2.方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据。

3.该区域是被线程共享的。

4.方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中。

2》虚拟机栈

1.虚拟机栈也就是我们平常所称的栈内存,它为java方法服务,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。

2.虚拟机栈是线程私有的,它的生命周期与线程相同。

3》本地方法栈本地方法栈和虚拟机栈类似,只不过本地方法栈为Native方法服务。4》堆java堆是所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实例都在这里创建,因此该区域经常发生垃圾回收操作。5》程序计数器内存空间小,字节码解释器工作时通过改变这个计数值可以选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成。该内存区域是唯一一个java虚拟机规范没有规定任何OOM情况的区域。

5、Java中垃圾收集的方法有哪些?

1》标记-清除:这是垃圾收集算法中最基础的,根据名字就可以知道,它的思想就是标记哪些要被回收的对象,然后统一回收。这种方法很简单,但是会有两个主要问题:1.效率不高,标记和清除的效率都很低;2.会产生大量不连续的内存碎片,导致以后程序在分配较大的对象时,由于没有充足的连续内存而提前触发一次GC动作。2》复制算法:为了解决效率问题,复制算法将可用内存按容量划分为相等的两部分,然后每次只使用其中的一块,当一块内存用完时,就将还存活的对象复制到第二块内存上,然后一次性清除完第一块内存,再将第二块上的对象复制到第一块。但是这种方式,内存的代价太高,每次基本上都要浪费一般的内存。于是将该算法进行了改进,内存区域不再是按照1:1去划分,而是将内存划分为8:1:1三部分,较大那份内存交给Eden区,其余是两块较小的内存区叫Survior区。每次都会优先使用Eden区,若Eden区满,就将对象复制到第二块内存区上,然后清除Eden区,如果此时存活的对象太多,以至于Survivor不够时,会将这些对象通过分配担保机制复制到老年代中。(java堆又分为新生代和老年代)3》标记-整理该算法主要是为了解决标记-清除,产生大量内存碎片的问题;当对象存活率较高时,也解决了复制算法的效率问题。它的不同之处就是在清除对象的时候,先将可回收对象移动到一端,然后清除掉端边界以外的对象,这样就不会产生内存碎片了。4》分代收集 现在的虚拟机垃圾收集大多采用这种方式,它根据对象的生存周期,将堆分为新生代和老年代。在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担保,所以可以使用标记-整理 或者 标记-清除。

6、MinorGC和FullGC的区别?

1》Minor GC通常发生在新生代的Eden区,在这个区的对象生存期短,往往发生GC的频率较高,回收速度比较快,一般采用复制-回收算法2》Full GC/Major GC 发生在老年代,一般情况下,触发老年代GC的时候不会触发Minor GC,所采用的是标记-清除算法产生concurrent-mode-failure的原因在CMSGC过程中,由于老年代剩余空间无法存放需要分配的对象,导致产生上述原因。

7、请写出常用的几种垃圾回收器及启用参数

1》串行收集器:暂停所有的线程,属于单线程工作,启用命令:-XX:+UseSerialGC2》并行收集器(默认):暂停所有线程,多线程工作,启用命令:-XX:+UseParNewGC3》G1收集器:这个主要是对堆内存进行分区,并发性回收,启用:-XX:+UseG1GC4》CMS收集器:多线程扫描,使用的算法是标记清除算法,标记需要回收的对象,进行回收,启动命令:-XX:+UseConcMarkSweepGC

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: