第九章(JVM篇)2024年Java求职面试与工作编程要点实录
【JVM篇之4个核心问题】
二、JVM(4个)
1、JVM的原理?
在Java中,JVM(JavaVirtualMachine,Java虚拟机)是Java平台的核心组件。
它负责执行Java字节码,并在不同的操作系统和硬件平台上,提供一致的Java运行环境。
下面,从8个方面,简要介绍一下JVM的原理:
1)Java字节码
Java源代码(.java文件)首先被Java编译器(javac)编译成字节码(.class文件)。
这些字节码,是平台无关的,意味着它们可以在任何支持Java的平台上运行。
2)类加载
JVM中有一个类加载器(ClassLoader)。
它的任务是将字节码文件加载到JVM中,并转换成JVM可以执行的数据结构。
这个过程中,还会进行包括链接(验证、准备、解析)和初始化等步骤。
3)执行引擎
执行引擎负责解释(或即时编译)和执行字节码。
解释执行是指逐条读取字节码指令并执行。
而即时编译(JIT,Just-In-TimeCompiler)则是,将一部分频繁执行的字节码,编译成机器码,以提高执行效率。
4)内存管理
JVM管理着Java程序的内存,包括方法区、堆、栈、程序计数器以及本地方法栈等部分。
(1)方法区存放类元数据;
(2)堆是存放对象实例的地方;
(3)栈用于存放基本数据类型和对象引用;
(4)程序计数器记录当前线程执行的字节码位置;
(5)本地方法栈用于执行本地方法。
5)垃圾回收
JVM负责自动管理堆内存中的对象生命周期。
当对象不再被引用时,垃圾回收器会自动回收其占用的内存,防止内存泄漏。
6)本地方法接口
JVM提供了本地方法接口(JNI),允许Java代码与本地代码(如C、C++代码)进行交互。
7)JavaNativeInterface(JNI):
JNI使得Java代码,可以与其他语言写的代码,进行交互。
通过JNI,Java程序,可以调用本地方法库(通常是C或C++编写的)中的函数。
也可以,被其他语言写的程序调用。
8)安全性
JVM通过沙箱模型,提供了一定的安全性保障。
每个Java应用程序,都在自己的沙箱中运行,对系统资源的访问受到严格限制,从而防止恶意代码对系统造成损害。
以上,就是从8个方面,对JVM原理的介绍啦!
总结:
JVM通过字节码的执行、内存管理、垃圾回收等机制,为Java程序提供了一个稳定、安全、高效的运行环境。
这使得Java,成为一种跨平台的语言,能够在不同的操作系统和硬件平台上运行。
…
2、描述下Java虚拟机(JVM)的内存结构?
Java虚拟机(JVM)的内存结构,主要划分为五个部分,分别是:
方法区、堆、虚拟机栈、程序计数器和本地方法栈。
1)方法区
所有线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、以及及时编译器编译后的代码等数据。
当方法区无法分配足够内存时,将会抛出OutOfMemoryError异常。
在Java8中,方法区被实现为元空间(Metaspace)。
2)堆
Java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,虚拟机启动时创建。
堆内存主要用于存储引用类型的数据,如对象和数组。
全局只有一个堆内存,所有的线程共用一个堆内存。
它是垃圾收集器(GC)管理的主要区域。
3)虚拟机栈
每个线程在创建时,都会创建一个虚拟机栈。
其每个方法,在执行的同时,都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
每一个方法,从调用直至执行完成的过程,就对应着一个栈帧,在虚拟机栈中入栈到出栈的过程。
4)程序计数器
是一块较小的内存空间,可以看作是当前线程,所执行的字节码的,行号指示器。
字节码解释器工作时,就是通过改变这个计数器的值,来选取下一条需要执行的字节码指令。
分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成。
5)本地方法栈
与虚拟机栈所发挥的作用非常相似,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务的。
而本地方法栈,则是为虚拟机使用到的Native方法服务。
在虚拟机规范中,对本地方法栈中的方法,使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。
理解JVM的内存结构,对于优化Java程序的性能、解决内存溢出等问题,具有重要意义。
…
3、谈谈JVM中的类加载过程?
在Java虚拟机(JVM)中,类加载过程是一个重要的环节。
它负责将类的字节码文件,加载到内存中,并进行校验、转换解析和初始化…
最终,形成可以被虚拟机,直接使用的Java类型。
这个过程,主要可以分为五个阶段:加载、链接、初始化、使用和卸载。
1)加载
加载阶段是类加载过程的开始。
主要通过一个类的全限定名,来加载该类对应的二进制字节流,这个动作通常由虚拟机外部的类加载器(ClassLoader)来完成。
然后,将这个字节流所代表的静态存储结构,转化为方法区的运行时数据结构。
并在内存中,生成一个代表这个类的java.lang.Class对象,作为方法区各个类访问该类的入口。
2)链接
链接阶段包含验证、准备和解析三个子阶段。
2.1、验证
验证阶段确保加载的类文件符合JVM规范。
它包括:
(1)文件格式验证(确保类的魔术版本号常量等符合当前虚拟机支持的范围);
(2)元数据验证(验证类的语义信息是否符合Java语言规范的要求);
(3)字节码验证(验证程序语义是否合法和规范);
(4)符号引用验证(验证符号引用全限定名代表的类是否能够找到,对应的域和方法是否能找到,访问权限是否合法)。
2.2、准备
准备阶段,主要是为类的静态变量,分配内存并设置初始化值。
需要注意的是,这里不包括使用final修饰的静态变量,因为它们在编译期,就已经分配了内存。
2.3、解析
解析阶段,将常量池的间接引用,转换为直接引用,包括字段解析、接口解析和方法解析。
这个阶段的顺序并不是完全固定的,某些情况下,可以在初始化阶段后才进行,以支持Java语言的运行时绑定特性。
3)初始化
初始化阶段,是执行类构造器方法的过程。
此方法,由编译器自动收集类中的所有类变量的赋值动作和静态代码块(static{}块)中的语句合并产生。
初始化静态变量和静态块,先初始化父类,再初始化当前类。
只有在主动使用类时(如创建类的实例、访问类的静态成员或使用反射方式访问类)才会进行初始化。
4)使用
在类被初始化后,就可以通过类创建对象实例,或者通过类来访问其静态变量和静态方法,进行正常的程序运行。
5)卸载
当类不再被使用时,JVM会通过垃圾回收机制来卸载这个类,释放其占用的内存资源。
以上就是类加载过程的五个阶段啦!
需要注意的是,虽然这五个阶段的顺序是固定的。
但某些阶段的操作,并不是严格按照顺序进行或完成的,它们通常是互相交叉地混合进行的。
总的来说,JVM的类加载过程,是一个复杂而精细的过程。
它确保了类的正确加载和初始化,为程序的正常运行提供了保障。
同时,通过类加载器机制,JVM还实现了类的动态加载和隔离,为Java的模块化编程和安全性提供了支持。
…
4、如何优化JVM的性能?
优化JVM的性能,我们可以从以下五个方面进行:
1)内存调优
1.1、堆内存调优
堆内存是Java程序中最常用的内存区域,用于存储对象实例。
可以通过调整JVM启动参数,如-Xmx和-Xms,来设置堆内存的最大和初始大小。
1.2、选择合适的垃圾回收器
Java虚拟机提供了多种垃圾回收器,每种回收器都有不同的特点和适用场景。
根据应用程序的需求和硬件环境,选择合适的垃圾回收器,能够提高垃圾回收的效率。
2)GC算法选择
GC(垃圾收集)每个不同算法应对不同需求。
例如,序列收集器、并行/吞吐量收集器、CMS收集器和G1收集器等。
根据应用的特点,选择合适的GC算法,可以显著提高性能。
3)核心应用优化
调整应用架构,关注并跟踪,应用中的对象来龙去脉。
这有助于降低内存碎片、堆问题和垃圾回收问题。
4)考虑未来的增长和扩展
预测业务的增长趋势和扩展需求,确保优化措施具备可扩展性和适应性。
5)性能监控与调优
通过性能监控工具发现性能瓶颈,如GC频繁、CPU负载过高、内存泄漏等等。
然后,进行相应的调优操作,如增加内存、优化代码、分散节点压力等。
以上,就是优化JVM的性能的五个方面介绍啦!
划重点:
JVM性能优化,是一个复杂且需要经验的过程。
不同的应用和环境,可能需要不同的优化策略。
所以,在进行优化时,建议逐步调整并观察效果,以避免一次性进行大量更改导致系统不稳定。
……
以上,就是今天的分享啦!
希望,对你有那么一点点、一丢丢、一戳戳地帮助哈~
所以哩…
评论、收藏、关注一键三连可好?
推荐票、月票、打赏,好伐?!
嘻嘻…
二、JVM(4个)
1、JVM的原理?
在Java中,JVM(JavaVirtualMachine,Java虚拟机)是Java平台的核心组件。
它负责执行Java字节码,并在不同的操作系统和硬件平台上,提供一致的Java运行环境。
下面,从8个方面,简要介绍一下JVM的原理:
1)Java字节码
Java源代码(.java文件)首先被Java编译器(javac)编译成字节码(.class文件)。
这些字节码,是平台无关的,意味着它们可以在任何支持Java的平台上运行。
2)类加载
JVM中有一个类加载器(ClassLoader)。
它的任务是将字节码文件加载到JVM中,并转换成JVM可以执行的数据结构。
这个过程中,还会进行包括链接(验证、准备、解析)和初始化等步骤。
3)执行引擎
执行引擎负责解释(或即时编译)和执行字节码。
解释执行是指逐条读取字节码指令并执行。
而即时编译(JIT,Just-In-TimeCompiler)则是,将一部分频繁执行的字节码,编译成机器码,以提高执行效率。
4)内存管理
JVM管理着Java程序的内存,包括方法区、堆、栈、程序计数器以及本地方法栈等部分。
(1)方法区存放类元数据;
(2)堆是存放对象实例的地方;
(3)栈用于存放基本数据类型和对象引用;
(4)程序计数器记录当前线程执行的字节码位置;
(5)本地方法栈用于执行本地方法。
5)垃圾回收
JVM负责自动管理堆内存中的对象生命周期。
当对象不再被引用时,垃圾回收器会自动回收其占用的内存,防止内存泄漏。
6)本地方法接口
JVM提供了本地方法接口(JNI),允许Java代码与本地代码(如C、C++代码)进行交互。
7)JavaNativeInterface(JNI):
JNI使得Java代码,可以与其他语言写的代码,进行交互。
通过JNI,Java程序,可以调用本地方法库(通常是C或C++编写的)中的函数。
也可以,被其他语言写的程序调用。
8)安全性
JVM通过沙箱模型,提供了一定的安全性保障。
每个Java应用程序,都在自己的沙箱中运行,对系统资源的访问受到严格限制,从而防止恶意代码对系统造成损害。
以上,就是从8个方面,对JVM原理的介绍啦!
总结:
JVM通过字节码的执行、内存管理、垃圾回收等机制,为Java程序提供了一个稳定、安全、高效的运行环境。
这使得Java,成为一种跨平台的语言,能够在不同的操作系统和硬件平台上运行。
…
2、描述下Java虚拟机(JVM)的内存结构?
Java虚拟机(JVM)的内存结构,主要划分为五个部分,分别是:
方法区、堆、虚拟机栈、程序计数器和本地方法栈。
1)方法区
所有线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、以及及时编译器编译后的代码等数据。
当方法区无法分配足够内存时,将会抛出OutOfMemoryError异常。
在Java8中,方法区被实现为元空间(Metaspace)。
2)堆
Java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,虚拟机启动时创建。
堆内存主要用于存储引用类型的数据,如对象和数组。
全局只有一个堆内存,所有的线程共用一个堆内存。
它是垃圾收集器(GC)管理的主要区域。
3)虚拟机栈
每个线程在创建时,都会创建一个虚拟机栈。
其每个方法,在执行的同时,都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
每一个方法,从调用直至执行完成的过程,就对应着一个栈帧,在虚拟机栈中入栈到出栈的过程。
4)程序计数器
是一块较小的内存空间,可以看作是当前线程,所执行的字节码的,行号指示器。
字节码解释器工作时,就是通过改变这个计数器的值,来选取下一条需要执行的字节码指令。
分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成。
5)本地方法栈
与虚拟机栈所发挥的作用非常相似,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务的。
而本地方法栈,则是为虚拟机使用到的Native方法服务。
在虚拟机规范中,对本地方法栈中的方法,使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。
理解JVM的内存结构,对于优化Java程序的性能、解决内存溢出等问题,具有重要意义。
…
3、谈谈JVM中的类加载过程?
在Java虚拟机(JVM)中,类加载过程是一个重要的环节。
它负责将类的字节码文件,加载到内存中,并进行校验、转换解析和初始化…
最终,形成可以被虚拟机,直接使用的Java类型。
这个过程,主要可以分为五个阶段:加载、链接、初始化、使用和卸载。
1)加载
加载阶段是类加载过程的开始。
主要通过一个类的全限定名,来加载该类对应的二进制字节流,这个动作通常由虚拟机外部的类加载器(ClassLoader)来完成。
然后,将这个字节流所代表的静态存储结构,转化为方法区的运行时数据结构。
并在内存中,生成一个代表这个类的java.lang.Class对象,作为方法区各个类访问该类的入口。
2)链接
链接阶段包含验证、准备和解析三个子阶段。
2.1、验证
验证阶段确保加载的类文件符合JVM规范。
它包括:
(1)文件格式验证(确保类的魔术版本号常量等符合当前虚拟机支持的范围);
(2)元数据验证(验证类的语义信息是否符合Java语言规范的要求);
(3)字节码验证(验证程序语义是否合法和规范);
(4)符号引用验证(验证符号引用全限定名代表的类是否能够找到,对应的域和方法是否能找到,访问权限是否合法)。
2.2、准备
准备阶段,主要是为类的静态变量,分配内存并设置初始化值。
需要注意的是,这里不包括使用final修饰的静态变量,因为它们在编译期,就已经分配了内存。
2.3、解析
解析阶段,将常量池的间接引用,转换为直接引用,包括字段解析、接口解析和方法解析。
这个阶段的顺序并不是完全固定的,某些情况下,可以在初始化阶段后才进行,以支持Java语言的运行时绑定特性。
3)初始化
初始化阶段,是执行类构造器方法
此方法,由编译器自动收集类中的所有类变量的赋值动作和静态代码块(static{}块)中的语句合并产生。
初始化静态变量和静态块,先初始化父类,再初始化当前类。
只有在主动使用类时(如创建类的实例、访问类的静态成员或使用反射方式访问类)才会进行初始化。
4)使用
在类被初始化后,就可以通过类创建对象实例,或者通过类来访问其静态变量和静态方法,进行正常的程序运行。
5)卸载
当类不再被使用时,JVM会通过垃圾回收机制来卸载这个类,释放其占用的内存资源。
以上就是类加载过程的五个阶段啦!
需要注意的是,虽然这五个阶段的顺序是固定的。
但某些阶段的操作,并不是严格按照顺序进行或完成的,它们通常是互相交叉地混合进行的。
总的来说,JVM的类加载过程,是一个复杂而精细的过程。
它确保了类的正确加载和初始化,为程序的正常运行提供了保障。
同时,通过类加载器机制,JVM还实现了类的动态加载和隔离,为Java的模块化编程和安全性提供了支持。
…
4、如何优化JVM的性能?
优化JVM的性能,我们可以从以下五个方面进行:
1)内存调优
1.1、堆内存调优
堆内存是Java程序中最常用的内存区域,用于存储对象实例。
可以通过调整JVM启动参数,如-Xmx和-Xms,来设置堆内存的最大和初始大小。
1.2、选择合适的垃圾回收器
Java虚拟机提供了多种垃圾回收器,每种回收器都有不同的特点和适用场景。
根据应用程序的需求和硬件环境,选择合适的垃圾回收器,能够提高垃圾回收的效率。
2)GC算法选择
GC(垃圾收集)每个不同算法应对不同需求。
例如,序列收集器、并行/吞吐量收集器、CMS收集器和G1收集器等。
根据应用的特点,选择合适的GC算法,可以显著提高性能。
3)核心应用优化
调整应用架构,关注并跟踪,应用中的对象来龙去脉。
这有助于降低内存碎片、堆问题和垃圾回收问题。
4)考虑未来的增长和扩展
预测业务的增长趋势和扩展需求,确保优化措施具备可扩展性和适应性。
5)性能监控与调优
通过性能监控工具发现性能瓶颈,如GC频繁、CPU负载过高、内存泄漏等等。
然后,进行相应的调优操作,如增加内存、优化代码、分散节点压力等。
以上,就是优化JVM的性能的五个方面介绍啦!
划重点:
JVM性能优化,是一个复杂且需要经验的过程。
不同的应用和环境,可能需要不同的优化策略。
所以,在进行优化时,建议逐步调整并观察效果,以避免一次性进行大量更改导致系统不稳定。
……
以上,就是今天的分享啦!
希望,对你有那么一点点、一丢丢、一戳戳地帮助哈~
所以哩…
评论、收藏、关注一键三连可好?
推荐票、月票、打赏,好伐?!
嘻嘻…
转码声明:以上内容基于搜索引擎转码技术对网站内容进行转码阅读,自身不保存任何数据,请您支持正版