当前位置:首页 > 虚拟机 > 正文

java虚拟机使用技巧大全


一、java虚拟机是作什么用的?怎么使用?请高手解答它是许多基于Java的应用程序的平台
1。什么是Java虚拟机
Java虚拟机(JVM)是​​JavaVirtualMachine的缩写。这是通过创建的虚构计算机。它是通过在真实计算机上模拟各种计算机功能来实现的。Java虚拟机有自己完整的硬件架构,如处理器、堆栈、寄存器等,也有相应的指令系统。
2.为什么要使用Java虚拟机?
Java语言最重要的特点是它可以运行在任何操作系统上。使用Java虚拟机的目的是无论操作系统如何都支持它并且能够在任何系统上运行。
虚拟机基础知识Java虚拟机保护与特定操作系统平台相关的信息,因此Java语言编译器只需要生成在Java上运行的目标。虚拟机代码(字节码)无需修改即可在多个平台上运行。当JVM执行字节码时,它最终将字节码解释为机器指令以在特定平台上执行。
二、我是小菜,大家能说说java虚拟机具体是怎么运行的?和class类的关系的啦。Java基础非常重要。Java编译器编译完.class文件后,我们需要使用JVM来运行该class文件。那么第一个任务就是将字节码从磁盘输入到内存中。这个过程称为【加载】。加载完成后,我们可以进行一系列运行前的准备工作,例如:为类静态变量开辟空间、将常量池存放在方法区内存中并实现常量池地址解析、初始化类静态变量等。这篇文章我们要讲的是JVM是如何加载class文件的?
加载类的过程
当我们使用命令执行Java程序(如)时:javaTest
(1)会帮我们找到JRE,进而找到位于JRE内部。这才是真正的Java虚拟机。最后加载动态库并激活Java虚拟机。
(2)虚拟机启动后,首先会执行一些初始化动作,比如读取系统参数等,一旦初始化动作完成,就会执行第一个类加载器——BootstrapLoader(启动类加载器)生成的。
(3)BootstrapLoader所做的初始工作中,除了一些基本的初始化动作外,最重要的是加载中的ExtClassLoader(扩展类加载器),并将其Parent设置为null,表示它的父加载器是BootstrapLoader。
(4)然后BootstrapLoader要求加载中的AppClassLoader(用户定义的类加载器),并将其Parent设置为之前生成的ExtClassLoader实体。这两个加载器都以静态类的形式存在。
这里请注意,Launcher$和Launcher$都是由BootstrapLoader加载的,所以Parent与由哪个类加载器加载无关。
初学者很难理解这个过程。我们将在下面详细解释什么是类加载器和“Parent”。
2.类加载器架构
JVM必须通过一个称为类加载器的程序来加载类文件。它的作用是从磁盘文件中提取要运行的代码的字。该段代码流被加载到内存中(JVM管理的方法区)。下面是几个重要的概念:
(1)启动类加载器:每个Java虚拟机实现都必须有一个启动类加载器。它只负责在系统类(核心JavaAPI类文件)的安装路径中查找要加载的类。加载器实现是用C++编写的,是JVM实现的一部分。
(2)扩展类加载器和自定义类加载器:负责加载除核心JavaAPI之外的其他类文件。例如,用于安装或下载标准扩展的类文件、在类路径中找到的类库的类文件、用于运行应用程序的类文件等。这里需要注意一件事:自定义类加载器不是由应用程序程序员实现的本身,也是JVM
(3)命名空间:Java虚拟机为每个类加载器维护一个唯一的标识符。命名空间。Java程序可以多次加载具有相同完全限定名称的多个类。Java虚拟机必须确定这些“多个类”的唯一性。因此,当多个类加载器加载同名的类时,为了唯一标识该类,必须在类名前添加加载该类的类。加载器的标识符(表示类所在的命名空间)。下图显示了与两个类加载器相关的命名空间。显然,不同的类加载器允许加载同一个类Volcano。
命名空间有助于安全实现,因为您可以有效地在加载到不同命名空间的类之间设置屏蔽。在Java虚拟机中,同一命名空间中的类可以直接交互,而不同命名空间中的类甚至无法知道彼此的存在,除非显式提供一种机制允许它们交互。一旦加载,如果恶意类被授予访问其他虚拟机加载的当前类的权限,它就可能知道一些它不应该知道的信息,或者干扰程序的正常运行。
三、Java虚拟机栈与栈帧详解

在Java编程中,栈和堆是两个关键的内存区域,各有其独特的作用和功能。首先,我们更深入地了解一下它们的区别:


栈和堆:在内存中的分工

栈作为程序执行阶段,负责方法的调用处理和数据存储。其特点是速度极高、无需垃圾回收、操作简单。主要执行push和pop操作。每个线程都有自己的堆栈,其中存储局部变量和方法调用详细信息,其生命周期与线程同步。


相比之下,堆是数据存储的主要区域,用于存储全局对象和变量的实例。它的生命周期不受线程影响,垃圾回收机制会定期清理不再使用的内存。


接下来我们重点关注Java虚拟机栈,它是各个线程的主要组成部分:


Java虚拟机栈:线程的执行命令程序中心

每个线程都有自己独立的堆栈,存放方法调用的堆栈帧。这些堆栈帧在方法执行期间创建和销毁。堆栈帧包含局部变量表和操作数堆栈。前者用于在方法执行过程中临时存储参数和局部变量,后者是计算和存储中间结果的关键区域。


局部变量表中的索引(Solt)根据变量类型(例如基类型和引用类型)分配空间。例如int和double分别占用两个Solt,参数和局部变量的数量直接影响栈帧的大小。


得注意的是,Java中的符号引用和动态链接机制为方法调用提供了灵活性。静态绑定是在编译时确定的,而动态绑定是在运行时根据方法调用的实际上下文发生的。


动态链接和绑定机制

Java支持两种绑定机制:早期绑定(在编译时确定)和晚期绑定(在运行时确定)。通过虚方法表和接口表,Java支持封装、继承和多态。方法的虚函数特性(非虚方法的最终修饰)提供了动态链接的可能性。


Java7中引入的Invokedynamic进一步扩展了方法调用并支持动态类型语言,为编译器提供了更大的灵活性。


类型检查是区分静态类型语言和动态类型语言的重要标志。前者在编译时检查变量的类型,而后者在运行时检查值的类型。


方法重写和异常处理

方法重写取决于运行时类型,Java通过虚拟方法表来确定调用哪个具体实现。如果直接访问的简单名称权限允许,则返回对该方法的直接引用,否则将搜索类的继承链,直到找到合适的方法或抛出异常;方法调用完成后,涉及清理局部变量、重置操作数堆栈以及设置PC寄存器的值。正常输出和异常输出的处理也不同。