JVM相关面试题

JVM相关面试题

一、详细介绍一下Java内存布局

  根据JVM规范,JVM内存分为五部分:程序计数器、虚拟栈、本地方法栈、堆、方法区。如下图所示:

其中程序计数器、虚拟机栈、本地方法栈为线程私有,堆、方法区(元空间)属于线程共享区域。

  • 程序计数器:程序计数器是虚拟机中唯一一个内存溢出(out of memory)的区域,它是一块较小的内存空间,记录了线程执行字节码的行号;每个线程都有自己程序计数器,因此这块内存区域是线程私有的;如果虚拟机正在执行一个Java方法,则程序计数器指向的正在执行的字节码的地址;如果执行的是一个Native方法,则程序计数器为Undefined。
  • 虚拟机栈:虚拟机栈是Java方法执行的线程内存模型,一个方法从执行开始到执行完成就是一个栈帧(stack frame)从入栈到出栈的过程。栈帧中主要存储了局部变量表、操作数栈、动态链接、方法出口等信息。虚拟机栈的生命周期同线程一样,故也是线程私有的一块内存区域。
  • 本地方法栈:本地方法栈同虚拟机栈类似,只不过服务的对象的Native方法,而虚拟机栈服务对象是Java方法。
  • 堆:堆是实际开发过程中关注最多的地方。虚拟机创建的所有对象实例都在堆上分配内存空间,是一块线程共享的内存区域。
  • 方法区(元空间):元数据区和堆空间一样,是线程共有内存区域,在JDK 8 之前,元数据区被称为方法区(永久代),里边存储了类型信息、常量、静态变量以及即时编译编译后的缓存数据等;方法区其实是堆空间的一个逻辑区域,所以方法区的大小还是受限于堆空间的大小。在JDK 8之后,使用本地内存实现方法区,此时方法区的大小与堆无关,首先与物理机器的内存空间。

PS:方法区的实现在JDK7之前使用永久代(PermGen)实现,JDK8之后使用元空间(Metaspace)实现。详细变化有以下几点:

  • JDK8后将字符串常量常量池、静态变量从永久代移除
  • 元空间使用本地内存实现,与堆无关
  • JDK8后将类型信息移到元空间

二、说说内存溢出和内存泄漏,Java会存在内存泄漏吗?

三、阐述一下虚拟机栈

四、常用的JVM配置参数

五、类的实例化顺序

六、JVM中年轻代到老年代判断的依据是什么?

七、JVM线上频繁FullGC,如何排查?

八、类加载为何使用双亲委派,如何打破双亲委派?

九、描述一下JVM的垃圾回收机制

十、JVM中涉及的垃圾回收算法都有哪些?

十一、阐述一下JVM中的垃圾回收器,分别都用在哪些区域?

十二、阐述一下CMS和G1区别

十三、阐述一下CMS垃圾回收器的主要过程

十四、阐述一下G1垃圾回收器的主要过程

十五、了解过ZGC吗?它有什么特性?

十六、Java中一共有几种引用类型?分别用在什么场景?

十七、Java中的类加载器有几种?分别有什么作用?

十八、JVM中的堆分为哪几部分?

十九、Java中如何判断一个对象是否存活?

二十、什么是可达性分析?哪些可以最为GCRoots?

二十一、什么是Class文件?Class文件都包含哪些内容?

二十二、JDK提供的工具有哪些?用过哪些做过线上分析?

二十三、对象分配内存的方法有几种?分别是什么?

二十四、对象分配内存是线程安全的吗?

二十五、访问对象的方式有几种?分别是什么?

二十六、对象在内存中的结构有几部分?

二十七、你知道哪些内存分配与回收略?

二十八、阐述一下类加载过程

二十九、了解过字节码指令吗?

三十、生产中如何配置JVM参数及垃圾回收器

三十一、对象一定是在堆上分配的吗?

三十二、safepoint是什么?

三十三、了解过逃逸分析吗?

三十四、对象访问定位的方式有几种?

三十五、MinorGC、MajorGC、FullGC何时发生?

JVM相关面试题

你可能感兴趣的:(面试宝库,面试)