JVM一直是面试中经常问到的知识点,除此之外,在项目性能调优上,也需要对其十分了解。本系列会从内存模型,再到整个对象的创建流程以及垃圾回收等,将JVM的知识以及面试常见题型全部讲解一遍。
在阅读此篇内容时,请先学习下面这几篇。看完后,本篇的许多问题,都能够回答出来了。
【JVM系列】JVM内存模型详解
JVM一直是面试中经常问到的知识点,除此之外,在项目性能调优上,也需要对其十分了解。本系列会从内存模型,再到整个对象的创建流程以及垃圾回收等,将JVM的知识以及面试常见题型全部讲解一遍。
【JVM系列】JVM对象创建与垃圾回收
JVM一直是面试中经常问到的知识点,除此之外,在项目性能调优上,也需要对其十分了解。本系列会从内存模型,再到整个对象的创建流程以及垃圾回收等,将JVM的知识以及面试常见题型全部讲解一遍。
【JVM系列】JVM启动参数与性能调优
JVM一直是面试中经常问到的知识点,除此之外,在项目性能调优上,也需要对其十分了解。本系列会从内存模型,再到整个对象的创建流程以及垃圾回收等,将JVM的知识以及面试常见题型全部讲解一遍。
JDK、JRE和JVM三者之间关系?
- JRE:Java运行环境,是支持java程序运行的标准环境。如果只是想运行Java程序,只需要安装JRE即可。
- JDK:Java开发工具,是Java开发的核心,集成了JRE和一些工具。
- JVM:Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。
JVM内存模型?
为什么移除永久代?
- 方法区大小难以设定,容易发生内存溢出。永久代会存放Class的相关信息,一般这些信息在编译期间就能确定大小。但是如果是在一些需要动态生成大量Class的应用中,如:Spring的动态代理、大量的JSP页面或动态生成JSP页面等,由于方法区的大小在一开始就要分配好,因此就能难确定大小,容易出现内存溢出。
- GC复杂且效率低。方法区存储了类的元数据信息和各种常量,它的内存回收目标理应当是对这些类型的卸载和常量的回收。但由于这些数据被类的实例引用,卸载条件变得复杂且严格,回收不当会导致堆中的类实例失去元数据信息和常量信息。因此,回收方法区内存不是一件简单高效的事情。
什么是元空间,为什么引入元空间?
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。
什么是内存泄漏、内存溢出?
- 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间。一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
- 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。
JVM 数据运行区,哪些会造成 OOM 的情况?
- 堆溢出
- 元空间溢出
- GC overhead limit exceeded
- 方法栈溢出
- 分配超大数组
- 等
JVM 对象创建步骤流程是什么?
JVM对象创建时 分配内存的两种方式?
垃圾回收算法有几种类型?他们对应的优缺点又是什么?
怎么判断对象的存活?
类的加载过程是什么?简单描述一下每个步骤。
类加载分为五个步骤:加载 -> 验证 -> 准备 -> 解析 -> 初始化。其中,验证 -> 准备 -> 解析,统称为“连接阶段”。
- 加载:将外部的Class文件加载到JVM,并存储到方法区的运行时常量池。
- 验证:确保加载进来的Class文件包含的信息,符合JVM的需求。
- 准备:为类变量分配内存、设置初始值。
- 解析:将常量池内的符号引用 转为 直接引用。
- 初始化:初始化 类变量和静态语句块。
JVM 预定义的类加载器有哪几种?分别什么作用?
- 启动类(根类)加载器(Bootstrap ClassLoader):负责加载java的核心类库。根加载器不是ClassLoader的子类,是由C++实现的。根类加载器负责加载%JAVA_HOME%/jre/lib下的jar包(以及由虚拟机参数 -Xbootclasspath 指定的类)。
- 扩展类加载器(ExtClassLoader):负责加载%JAVA_HOME%/jre/ext 或者 被java.ext.dirs系统变量所指定的目录的jar包。
- 应用类加载器(AppClassLoader):负责加载加载来自java命令的-classpath选项、java.class.path系统属性,或者CLASSPATH环境变量所指定的JAR包和类路径。
什么是双亲委派模式?有什么作用?
当一个类加载器接收到类加载请求时,会先请求其父类加载器加载,依次递归,当父类加载器无法找到该类时(根据类的全限定名称),子类加载器才会尝试去加载,如果都找不到,会抛出ClassNotFoundException异常。
可以避免重复加载,当父亲已经加载了该类的时候,就没有必要 ClassLoader 再加载一次。
什么是 Class 文件?Class 文件主要的信息结构有哪些?
Class 文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件中,中间没有添加任何分隔符。
Class 文件格式采用一种类似于 C 语言结构体的伪结构来存储数据,这种伪结构只有两种数据类型:无符号数和表。
详细介绍一下对象在分带内存区域的分配过程?
线上常用的 JVM 参数有哪些?
对象什么时候进入老年代?
引起类加载操作的行为有哪些?
- 为一个类型创建一个新的对象实例时(比如new、反射、序列化)
- 调用一个类型的静态方法时
- 调用一个类型或接口的静态字段,或者对这些静态字段执行赋值操作时,不过用final修饰的静态字段除外,它被初始化为一个编译时常量表达式
- 调用JavaAPI中的反射方法时(比如调用java.lang.Class中的方法,或者java.lang.reflect包中其他类的方法)
- 初始化一个类的派生类时(Java虚拟机规范明确要求初始化一个类时,它的超类必须提前完成初始化操作,接口例外)
- JVM启动包含main方法的启动类时
Full GC 、 Major GC 、Minor GC 之间区别?
什么时候触发 Full GC ?
- 调用System.gc()方法
- 老年代空间不足
- 空间分配担保时,老年代 连续空间 小于 新生代对象总大小 或者 历次晋升的平均大小
点点赞赏,手留余香