一读小说 » 都市言情 » 蓝星文娱:从微末崛起的娱乐大亨 » 第九章(JVM篇)2024年Java求职面试与工作编程要点实录

第九章(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性能优化,是一个复杂且需要经验的过程。

    不同的应用和环境,可能需要不同的优化策略。

    所以,在进行优化时,建议逐步调整并观察效果,以避免一次性进行大量更改导致系统不稳定。

    ……

    以上,就是今天的分享啦!

    希望,对你有那么一点点、一丢丢、一戳戳地帮助哈~

    所以哩…

    评论、收藏、关注一键三连可好?

    推荐票、月票、打赏,好伐?!

    嘻嘻…