【Java高软的自我修养】(JVM篇)2024年Java求职面试与工作编程要点实录

  【JVM篇的4个核心问题】

  1、JVM的原理?

  2、描述下Java虚拟机(JVM)的内存结构?

  3、谈谈JVM中的类加载过程?

  4、如何优化JVM的性能?

  9754336d2f6342838a550ec6784bb101.jpg

  二、JVM(4个)

   1、JVM的原理?

  在Java中,JVM(Java Virtual Machine,Java虚拟机)是Java平台的核心组件。

  它负责执行Java字节码,并在不同的操作系统和硬件平台上,提供一致的Java运行环境。

  JVM的原理,要从7个方面说起,即Java字节码,类加载,执行引擎,内存管理,垃圾回收,本地方法接口,安全性。

bfe222da57314b7cb6fa0863e4cbfb8a.jpg

 

  下面,我就从以上这7个方面,来具体简要介绍一下,JVM的原理:

  1)Java字节码

  Java源代码(.java文件)首先被Java编译器(javac)编译成字节码(.class文件)。

  这些字节码,是平台无关的,意味着它们可以在任何支持Java的平台上运行。

  2)类加载

  JVM中有一个类加载器(ClassLoader)。

  它的任务是将字节码文件加载到JVM中,并转换成JVM可以执行的数据结构。

  这个过程中,还会进行包括链接(验证、准备、解析)和初始化等步骤。

  3)执行引擎

  执行引擎负责解释(或即时编译)和执行字节码。

  解释执行是指逐条读取字节码指令并执行。

  而即时编译(JIT,Just-In-Time Compiler)则是,将一部分频繁执行的字节码,编译成机器码,以提高执行效率。

  4)内存管理

  JVM管理着Java程序的内存,包括方法区、堆、栈、程序计数器以及本地方法栈等部分。

  (1)方法区存放类元数据;

  (2)堆是存放对象实例的地方;

  (3)栈用于存放基本数据类型和对象引用;

  (4)程序计数器记录当前线程执行的字节码位置;

  (5)本地方法栈用于执行本地方法。

  5)垃圾回收

  JVM负责自动管理堆内存中的对象生命周期。

  当对象不再被引用时,垃圾回收器会自动回收其占用的内存,防止内存泄漏。

  6)本地方法接口

  JVM提供了本地方法接口(JNI),允许Java代码与本地代码(如C、C++代码)进行交互。

  Java Native Interface (JNI)。

  JNI使得Java代码,可以与其他语言写的代码,进行交互。

  通过JNI,Java程序,可以调用本地方法库(通常是C或C++编写的)中的函数。

  也可以,被其他语言写的程序调用。

  7)安全性

  JVM通过沙箱模型,提供了一定的安全性保障。

  每个Java应用程序,都在自己的沙箱中运行...

  对系统资源的访问受到严格限制,从而防止恶意代码对系统造成损害。

  以上,就是从7个方面,对JVM原理的介绍啦!

  总结:

   JVM通过字节码的执行、内存管理、垃圾回收等机制...

  为Java程序,提供了一个稳定、安全、高效的运行环境。

  这使得Java,成为一种跨平台的语言,能够在不同的操作系统和硬件平台上运行。

  …

  2、描述下Java虚拟机(JVM)的内存结构?

   Java虚拟机(JVM)的内存结构,主要划分为5个部分,分别是:

  方法区、堆、虚拟机栈、程序计数器和本地方法栈。

  1)方法区

  所有线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、以及及时编译器编译后的代码等数据。

  当方法区无法分配足够内存时,将会抛出OutOfMemoryError异常。

  在Java 8中,方法区被实现为元空间(Metaspace)。

  2)堆

   Java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,虚拟机启动时创建。

  堆内存主要用于存储引用类型的数据,如对象和数组。

  全局只有一个堆内存,所有的线程共用一个堆内存。

  它是垃圾收集器(GC)管理的主要区域。

  3)虚拟机栈

  每个线程在创建时,都会创建一个虚拟机栈。

  其每个方法,在执行的同时,都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

  每一个方法,从调用直至执行完成的过程,就对应着一个栈帧,在虚拟机栈中入栈到出栈的过程。

  4)程序计数器

  是一块较小的内存空间,可以看作是当前线程,所执行的字节码的,行号指示器。

  字节码解释器工作时,就是通过改变这个计数器的值,来选取下一条需要执行的字节码指令。

  分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成。

  5)本地方法栈

  与虚拟机栈所发挥的作用非常相似,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务的。

  而本地方法栈,则是为虚拟机使用到的Native方法服务。

  在虚拟机规范中,对本地方法栈中的方法,使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。

  理解JVM的内存结构,对于优化Java程序的性能、解决内存溢出等问题,具有重要意义。

  …

  3、谈谈JVM中的类加载过程?

  在Java虚拟机(JVM)中,类加载过程是一个重要的环节。

  它负责将类的字节码文件,加载到内存中,并进行校验、转换解析和初始化…

  最终,形成可以被虚拟机,直接使用的Java类型。

  这个过程,主要可以分为5个阶段:加载、链接、初始化、使用和卸载。

0267f0aebc4e4738b0b4ce0e10d9e414.png

  1)加载

  加载阶段是类加载过程的开始。

  主要通过一个类的全限定名,来加载该类对应的二进制字节流,这个动作通常由虚拟机外部的类加载器(ClassLoader)来完成。

  然后,将这个字节流所代表的静态存储结构,转化为方法区的运行时数据结构。

  并在内存中,生成一个代表这个类的java.lang.Class对象,作为方法区各个类访问该类的入口。

  2)链接

  链接阶段包含验证、准备和解析三个子阶段。

  2.1、验证

  验证阶段确保加载的类文件符合JVM规范。

  它包括:

  (1)文件格式验证(确保类的魔术版本号常量等符合当前虚拟机支持的范围);

  (2)元数据验证(验证类的语义信息是否符合Java语言规范的要求);

  (3)字节码验证(验证程序语义是否合法和规范);

  (4)符号引用验证(验证符号引用全限定名代表的类是否能够找到,对应的域和方法是否能找到,访问权限是否合法)。

  2.2、准备

  准备阶段,主要是为类的静态变量,分配内存并设置初始化值。

  需要注意的是,这里不包括使用final修饰的静态变量,因为它们在编译期,就已经分配了内存。

  2.3、解析

  解析阶段,将常量池的间接引用,转换为直接引用,包括字段解析、接口解析和方法解析。

  这个阶段的顺序并不是完全固定的,某些情况下,可以在初始化阶段后才进行,以支持Java语言的运行时绑定特性。

  3)初始化

  初始化阶段,是执行类构造器方法<clinit>()的过程。

  此方法,由编译器自动收集类中的所有类变量的赋值动作和静态代码块(static{}块)中的语句合并产生。

  初始化静态变量和静态块,先初始化父类,再初始化当前类。

  只有在主动使用类时(如创建类的实例、访问类的静态成员或使用反射方式访问类)才会进行初始化。

  4)使用

  在类被初始化后,就可以通过类创建对象实例,或者通过类来访问其静态变量和静态方法,进行正常的程序运行。

  5)卸载

  当类不再被使用时,JVM会通过垃圾回收机制来卸载这个类,释放其占用的内存资源。

  以上就是类加载过程的五个阶段啦!

  需要注意的是,虽然这五个阶段的顺序是固定的。

  但某些阶段的操作,并不是严格按照顺序进行或完成的,它们通常是互相交叉地混合进行的。

  总的来说,JVM的类加载过程,是一个复杂而精细的过程。

  它确保了类的正确加载和初始化,为程序的正常运行提供了保障。

  同时,通过类加载器机制,JVM还实现了类的动态加载和隔离,为Java的模块化编程和安全性提供了支持。

  …

  4、如何优化JVM的性能?

  优化JVM的性能,我们可以从5个方面入手,即...

  1、内存调优(堆内存调优、选择合适的垃圾回收器);

  2、GC算法选择;

  3、核心应用优化;

  4、考虑未来的增长和扩展;

  5、性能监控与调优。

  下面,就让我来具体介绍一下吧!

  1)内存调优

  1.1、堆内存调优

  堆内存是Java程序中最常用的内存区域,用于存储对象实例。

  可以通过调整JVM启动参数,如-Xmx和-Xms,来设置堆内存的最大和初始大小。

  1.2、选择合适的垃圾回收器

   Java虚拟机提供了多种垃圾回收器,每种回收器都有不同的特点和适用场景。

  根据应用程序的需求和硬件环境,选择合适的垃圾回收器,能够提高垃圾回收的效率。

  2)GC算法选择

   GC(垃圾收集)每个不同算法应对不同需求。

  例如,序列收集器、并行/吞吐量收集器、CMS收集器和G1收集器等。

  根据应用的特点,选择合适的GC算法,可以显著提高性能。

  3)核心应用优化

  调整应用架构,关注并跟踪,应用中的对象来龙去脉。

  这有助于降低内存碎片、堆问题和垃圾回收问题。

  4)考虑未来的增长和扩展

  预测业务的增长趋势和扩展需求,确保优化措施具备可扩展性和适应性。

  5)性能监控与调优

  通过性能监控工具发现性能瓶颈,如GC频繁、CPU负载过高、内存泄漏等等。

  然后,进行相应的调优操作,如增加内存、优化代码、分散节点压力等。

  以上,就是优化JVM性能的5个方面介绍啦!

  划重点:

   JVM性能优化,是一个复杂且需要经验的过程。

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

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

  ……

6d3196cd45e14535919f464ef83af62f.jpg

 

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

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

  所以哩…

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

  推荐票、打赏,好伐?!

  嘻嘻…

5fbc173bb72d48b59ee3745235ddcc41.jpg

 每天一点点,十年成大牛!✌

 

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值