jvm原理 ClassLoader javac

本文详细介绍了Java开发中JDK与JRE的区别,以及类加载器的工作原理,包括BootstrapClassLoader、extensionsClassLoader、APPClassLoader和用户自定义加载器的层级关系和委托机制。此外,文章还阐述了Java虚拟机运行时内存的划分和作用,如私有内存(Java栈、程序寄存器、本地方法栈)和共有内存(堆内存、方法域、常量区)。通过实例演示如何使用javac命令编译.java文件为.class文件,并解释了类加载过程中的委托和加载机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         我们在自学java的时候开始需要安装JDC和JRE,对于软件开发人员来说需要安装JDK,对于不开发只运行java编译完的.class文件,只需要安装JRE即可。而且在安装JDK时也会自动的包含JRE包。

        开发者:

         作为一个菜鸟我们第一个程序是helloWord!,为了显示我们高端的技术和能力,我们会装13的在text文件中敲代码,当代码敲完后,你会在DOS系统运用命令执行,将java源文件编译成字节码,这是后需要的使用javac命令,并且使用javac.exe将文件后缀为.JAVA的文件编译成.,class的字节码文件。

         在上述步骤完成后,需要使用java命令来执行.class文件。这个时候就需要JVMx虚拟机了。并且用到了ClassLoader,将要执行所需要的类加载到JVM进行执行。首先加载类型氛围一下四个:

1)Bootstrap ClassLoader 是将JRE下的基础JAR包加载到Jvm也成为核心jar包,如java.lang.*.等,在API中命名空间以java.*开头的类。

2)extensions ClassLoader是将扩展类加载到虚拟机中,如在API中的javax命名空间下的包。

3) APP ClassLoader是将应用程序类加载,这里的ClassPath路径下的类

4)是指用户自己定义的加载器,希望在程序执行进行加载特定的Class

               在各个ClassLoader之间存在的委托,既当需要加载一个类时,会盲目的委托给上一级加载,若上一级没有则在委托回来进行加载。如自己编写了一个HelloWord的类,当app ClassLoader加载时会交给extensions ClassLoader来加载,而exttensions ClassLoader会委托给BootStrap ClassLoader来加载,这时候就会达到最顶级,BootStrapClassLoader会查找路径内是否存在该类,有则加载,没有交给Extensions ClassLoader来加载,ExtensionClassLoader会查找路径是否存在,决定是否加载,若还是没有找到,则对吼交由APP ClassLoader 来加载,当然我们知道,我们一般会放在ClassPath路径下故最终还是要返回到APP ClassLoader来加载。

         向上进行检测委托,然后再向下进行加载。(个人理解,可以自己再查查);

        JVM虚拟机运行时,内存会为其分配一块内存。在这块内存内包含私有和共有。私有归于每个线程所私有: java栈,程序寄存器,本地方法栈。共有的如:堆内存,方法域,常量区。在java栈中存放了每个线程所调用的方法,栈有入栈和出栈两个操作,故我们可以在编写方法是可以通过PrintStrackTrace的方法来打印方法错误信息。同样的栈还包含了方法的变量数组,方法状态等信息。方法域是指类中的方法被加载到方法域中,为所有的线程所共有,常量区是线程沟通的方法域和java栈的重要区域。

### JVM的工作机制及运行原理 #### 1. JVM概述 JVM(Java Virtual Machine)是一种抽象计算模型,能够在实际计算机上仿真模拟各种计算机功能。其核心目标是提供一种统一的环境,使得Java程序可以在不同平台上无需修改即可运行[^2]。 JVM的主要组成部分包括字节码指令集、寄存器、栈、垃圾回收堆以及存储方法域等。这些组件共同协作完成Java应用程序的执行过程[^1]。 --- #### 2. Java程序的生命周期 Java源文件经过一系列处理阶段才能被执行: - **编译阶段** Java源代码文件(`.java`)通过编译器被转化为字节码文件(`.class`)。这个字节码文件包含了与平台无关的中间表示形式,它是JVM可以直接理解的语言[^4]。 - **加载阶段** 字节码文件由类加载器加载到内存中,并对其进行验证、准备和初始化。这一过程中,JVM会确保字节码的安全性和合法性,同时分配必要的资源以便后续使用[^3]。 - **执行阶段** 加载后的字节码会被解释器逐条读取并翻译成具体的机器指令,在底层硬件上执行。为了提高性能,现代JVM通常还配备了即时编译器(Just-In-Time Compiler, JIT),它可以将频繁调用的方法动态编译为本地代码以加速执行速度。 --- #### 3. JVM的核心结构及其作用 ##### (1) 类加载器(ClassLoader) 负责从磁盘或其他位置获取 `.class` 文件并将它们加载至内存中。整个加载流程分为三个子阶段:加载、链接和初始化。其中,链接又细分为验证、准备和解析三步。 ##### (2) 运行时数据区 这是JVM管理内存的关键部分,主要包括以下几个区域: - **方法区**:用于存储已被虚拟机加载的类信息、常量池、静态变量等内容。 - **堆**:作为GC(Garbage Collection)的主要对象空间,用来保存所有的实例化对象。 - **虚拟机栈**:每个线程独占的一块内存区域,记录着该线程所执行方法的状态。 - **本地方法栈**:类似于虚拟机栈,不过这里存放的是Native Method的相关信息。 - **PC寄存器**:跟踪当前线程正在执行的字节码指令地址。 ##### (3) 执行引擎 执行引擎的任务是从方法区内取出字节码并通过某种方式将其转义成本地机器语言加以执行。常见的实现技术有解释执行和即时编译两种模式。 --- #### 4. 跨平台特性 由于每种操作系统都有自己的特定版本的JVM,而所有这些JVM都遵循同一套标准去解读相同格式的字节码,因此实现了真正的“一次编写,到处运行”的理念。 ```python # 示例:简单的HelloWorld.java编译与运行过程展示 # 编译阶段 javac HelloWorld.java # 得到字节码文件 HelloWorld.class # 使用JVM运行 java HelloWorld ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值