首页 > 编程知识 正文

深入浅出和通俗易懂,jvm书籍

时间:2023-05-05 02:10:42 阅读:50605 作者:872

JVM一直是面试的必备考点,大家都知道,但把它弄清楚似乎并不是特别容易。 JVM知识点零散、不系统,不方便总结。 今天蔬菜今天解决这个问题。 用一篇文章明确说明JVM的结构。

JVM分为以下五个部分。

1、类加载器(类加载器)。

2、运行时数据区(运行时数据区)。

3、运行引擎

4、本地库接口(朴素接口)。

5、本地方法库(朴素库ies ) )。

更多视频学习请点击:

JVM虚拟机分析视频教程

其中,最复杂的是运行时数据区可以分为方法区域、虚拟机堆栈、本地方法堆栈、堆和程序计数器。 此外,方法空间和堆由线程共享,虚拟机堆栈、本地方法堆栈和程序计数器由线程分离。 JVM的结构如下图所示。

明确了JVM虚拟机的结构。 接下来,对其各部分进行详细说明。

类加载器:字节码文件加载到内存中。

分析33558www.Sina.com/JVM命令,翻译成机器码,分析完成后提交操作系统。

本机库,融合了用于3358www.Sina.com/Java调用的不同开发语言。

执行引擎:Java本地方法的具体实现。

本地库接口:JVM核心内存空间结构模型。

运行时数据区是JVM内存结构中最重要的部分,下面详细介绍运行时数据区的各个组成部分。

本地方法库:方法区域存储虚拟机加载的类信息、常量、静态变量和实时编译器编译的代码等数据。 方法领域是规范,持久化是方法领域的实现。 这里有经常被测试的问题。 JDK 7之前版本的字符串常量池是持久化的。 JDK 7将字符串常量池移动到堆中,JDK 8直接删除持久化,而是使用元空间。

运行时数据区:本地方法堆栈与Java堆栈具有基本相同的作用和原理,可以用于执行方法。 不同之处在于,Java堆栈执行Java方法,而本地方法堆栈执行本地方法。

什么是Java本地方法? Java是一种基于APP应用层的高级编程语言,无法访问底层操作系统(如底层硬件设备)的底层信息。 此时,需要使用c语言等其他语言来完成功能。 本机方法的使用原理如下。

1、在Java程序中声明朴素修饰的方法。 只有方法定义,没有实现的方法。 将此Java文件编译为字节码文件。

2、用javah编译字节码文件,生成. h文件。

3、编写. cpp文件实现. h文件中的方法。

4、将. cpp文件编译为动态链接库文件. dll。

5、System.loadLibrary ) )加载动态连接库文件。

这允许调用本地方法,并允许在Java中调用未用Java编写的接口。 基本原理是利用反射机制在运行时找到并分析. dll文件,根据动态链接库中的文件名创建对象和方法,以便可以使用对象调用方法。

常见的本地方法是公共金融朴素类吗? getClass (、public native int hashCode )、受保护的本机对象克隆)。

一、方法区

二、本地方法栈

更多视频学习请点击:程序计数器占用的内存空间很小,是当前线程正在执行的字节码行号指示符,通过改变该计数器的值来选择下一个要执行的字节码指令。 这是因为多个线程之间的程序计数器是相互独立的,不会相互影响,从而使每个线程在恢复后能够找到具体的执行位置。

JVM虚拟机分析视频教程Java堆用于存储实例化对象。 Java堆由所有线程共享,是在虚拟机启动时创建的,用于存储对象实例。 它是Java内存结构的开头,占大部分空间,是GC的主要管理区域,可分为年轻一代、老一代、持久一代和JDK 8以后的持久一代。

三、程序计数器

年轻一代还可以分为nrdxs、from Survivor、to Survivor。

nrdxs区域—对象刚创建时存储在nrdxs区域中。 如果无法容纳在nrdxs区域中,它将存储在Survivor区域中,甚至存储在较早的年代。

Survivor区: Survivor是Survivor From和

Survivor To,GC 回收时使用,将 nrdxs 中存活的对象存入 Survior From 中,下一次回收时,将 Survior From 中的对象存入 Survior To 中,清除 Survior From ,下一次回收时重复次步骤,Survior From 变成 Survior To,Survivor To 变成 Survivor From,依次循环,同时每次回收,对象的年龄都 +1,年龄增加到一定程度的对象,移动到老年代中。

老年代

存放生命周期较长的对象。JDK 8 之后改用元空间替代永久代。

元空间

Java 8 之后开始将类的元数据放在堆内存中,这块区域叫做元空间,在 Java 7 及以前,元空间是放在永久代中的,Java 8 之后分离出来了。

元空间和永久代是方法区的实现,方法区只是一种规范,在 Java 7 之后,原先位于方法区永久代里的字符串常量池已被移动到了 Java 堆中,因为永久代的内存空间极为有限,如果频繁调用 inter 方法,内存无法存储这么多数据。在 Java 8 之后将永久代完全删除了,使用元空间替代了永久代。

元空间使用本地内存,永久代使用 JVM 内存,所以使用元空间的好处在于程序的内存不在受限于 JVM 内存,本地内存剩余多少空间,元空间就可以有多大,解决了空间不足的问题。

更多视频学习请点击:

JVM虚拟机分析视频教程>>>>>

五、虚拟机栈

Java 方法执行的内存模型,Java 栈中存放的是多个栈帧,每个栈帧对应一个被调用的方法,主要包括局部变量表、操作数栈、动态链接、方法返回地址(方法出口)。每一个方法的执行,JVM 都会创建一个栈帧,并且将栈帧压入 Java 栈,方法执行完毕,该栈帧出栈。

 

局部变量表:存储方法执行过程中的所有变量,包括方法中声明的局部变量和形参。

操作数栈:方法中的计算过程都是借助于操作数栈来完成的,将参与计算的数据压入操作数栈。

栈的具体运算方式是这样的,编译器是通过两个栈来实现的,一个是保存操作数的栈,另一个是保存运算符的栈。我们从左向右遍历表达式,当遇到数字,直接压入操作数栈。当遇到运算符,先与运算符栈的栈顶元素进行比较,如果高于当前栈顶元素的优先级,直接压入,否则取出当前栈顶的运算符,同时取出操作数栈的前两个数据进行运算,并将结果压入操作数栈。再次重复上述步骤,直到当前的运算符被压入栈中,当没有新的运算符需要入栈的时候,取出当前的栈顶元素以及操作数栈的两个运算,进行运算,将结果压入操作数栈,如果方法定义时需要返回值,直接将操作数栈栈顶元素返回即可。

方法返回地址:一个方法调用结束之后要返回到调用它的地方,所以栈帧中要保持能够返回到方法调用处的地址。

每个线程都有自己的 Java 栈,相互独立,可以同时执行各种的方法,每个方法的执行都是一个栈帧的入栈和出栈过程,Java 虚拟机栈用来存储栈帧,方法调用结束之后,帧会被销毁。

更多视频学习请点击:

JVM虚拟机分析视频教程>>>>>

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。