【JVM篇之4个核心问题】
1、JVM的原理?
2、描述下Java虚拟机(JVM)的内存结构?
3、谈谈JVM中的类加载过程?
4、如何优化JVM的性能?
......
二、JVM(4个)
1、JVM的原理?
在Java中,JVM(Java Virtual Mae,Java虚拟机)是Java平台的核心组件。
它负责执行Java字节码,并在不同的操作系统和硬件平台上,提供一致的Java运行环境。
JVM的原理,要从7个方面说起,即Java字节码,类加载,执行引擎,内存管理,垃圾回收,本地方法接口,安全性。
下面,我就从以上这7个方面,来具体简要介绍一下,JVM的原理:
1)Java字节码
Java源代码(.java文件)首先被Java编译器(javac)编译成字节码(.class文件)。
这些字节码,是平台无关的,意味着它们可以在任何支持Java的平台上运行。
2)类加载
JVM中有一个类加载器(ClassLoader)。
它的任务是将字节码文件加载到JVM中,并转换成JVM可以执行的数据结构。
这个过程中,还会进行包括链接(验证、准备、解析)和初始化等步骤。
3)执行引擎
执行引擎负责解释(或即时编译)和执行字节码。
解释执行是指逐条读取字节码指令并执行。
而即时编译(JIT,Just-In-Time piler)则是,将一部分频繁执行的字节码,编译成机器码,以提高执行效率。
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)中,类加载过程是一个重要的环节。
它负责将类的字节码文件,加载到内存中,并进行校验、转换解析和初始化…