1、什么是JVM

JVM的作用

Java 作为一门高级程序语言,它的语法非常复杂,抽象程度也很高。因此,直接在硬件上运行这种复杂的程序并不现实。所以呢,在运行 Java 程序之前,我们需要对其进行一番转换。
转换的过程为通过编译器将 Java 程序转换成该虚拟机所能识别的指令序列,也称 Java 字节码。Java虚拟机会将字节码,即class文件加载到JVM中。由JVM进行解释和执行。除了 Java 外,Scala、Clojure、Groovy,以及时下热门的 Kotlin,这些语言都可以运行在 Java 虚拟机之上
在这里插入图片描述
由上图可以看出,JVM是运行在操作系统之上的,它与硬件没有直接的交互

JVM体系概览

在这里插入图片描述
Java 虚拟机将运行时内存区域划分为五个部分,分别为方法区、堆、PC 寄存器、Java 方法栈和本地方法栈。执行 Java 代码首先需要使用类加载器将它编译而成的 class 文件加载到 Java 虚拟机中。加载后的 Java 类会被存放于方法区(Method Area)中。实际运行时,虚拟机会执行方法区内的代码。
在虚拟机中,方法区和堆为线程共享,也是垃圾回收的重点照顾区域。栈空间为线程私有,基本不会出现垃圾回收。
Java 虚拟机将栈细分为面向 Java 方法的 Java 方法栈,面向本地方法(用 C++ 写的 native 方法)的本地方法栈,以及存放各个线程执行位置的 PC 寄存器(程序计数器)。
在运行过程中,每当调用进入一个 Java 方法,Java 虚拟机会在当前线程的 Java 方法栈中生成一个栈帧(栈的一片区域),用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且 Java 虚拟机不要求栈帧在内存空间里连续分布。当退出当前执行的方法时,不管是正常返回还是异常返回,Java 虚拟机均会弹出当前线程的当前栈帧,并将之舍弃。

  1. Java栈的区域很小,只有1M,特点是存取速度很快,所以在stack中存放的都是快速执行的任务,基本数据类型的数据,和对象的引用(reference)。
  2. PC寄存器( PC register ):每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器。PC寄存器里保存有当前正在执行的JVM指令的地址。 每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。保存下一条将要执行的指令地址的寄存器是 :PC寄存器。PC寄存器的内容总是指向下一条将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。
  3. 本地方法栈(Nativemethodstack):保存native方法进入区域的地址。
  4. 类的对象放在heap(堆)中,所有的类对象都是通过new方法创建,创建后,在stack(栈)会创建类对象的引用(内存地址)。一种常规用途的内存池(也在RAM(随机存取存储器 )区域),其中保存了Java对象。和栈不同:“内存堆”或“堆”最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编辑相应的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间。堆所占内存的大小由-Xmx指令和-Xms指令来调节。
  5. method(方法区)又叫静态区,存放所有的①类(class),②静态变量(static变量),③静态方法,④常量和⑤成员方法。又叫静态区,跟堆一样,被所有的线程共享。方法区中存放的都是在整个程序中永远唯一的元素。这也是方法区被所有的线程共享的原因。
    (顺便展开静态变量和常量的区别: 静态变量本质是变量,是整个类所有对象共享的一个变量,其值一旦改变对这个类的所有对象都有影响;常量一旦赋值后不能修改其引用,其中基本数据类型的常量不能修改其值。)Java里面是没有静态变量这个概念的,不信你自己在某个成员方法里面定义一个static int i = 0;Java里只有静态成员变量。
  6. 运行常量池
    这儿的“静态”是指“位于固定位置”。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。这个区域属于方法区。该区域存放类和接口的常量,除此之外,它还存放成员变量和成员方法的所有引用。当一个成员变量或者成员方法被引用的时候,JVM就通过运行常量池中的这些引用来查找成员变量和成员方法在内存中的的实际地址。
<think>好的,用户想了解JVM的基本概念,特别是JVM是什么。首先我需要整理JVM的定义、作用以及关键组成部分。根据提供的引用资料,JVM是Java虚拟机的缩写,属于Java平台的核心组件,负责执行字节码,实现跨平台运行。用户可能对跨平台的机制不太清楚,需要详细解释。 接下来要确定回答的结构。先给出JVM的基本定义,然后说明其核心功能,比如跨平台、内存管理、垃圾回收等。需要引用资料中的内容,比如引用[1]提到JVM模拟计算机功能,引用[2]和[5]强调跨平台特性。然后分点解释JVM的架构,可能包括类加载器、运行时数据区、执行引擎等部分,这里引用[2][3]中的结构描述。 用户可能对JVM与其他Java组件(如JRE、JDK)的关系有疑问,需要简要说明。引用[2]提到了JRE和JDK的关系,这部分可以作为补充信息。最后,生成相关问题需要考虑用户可能进一步想了解的方面,比如内存模型、类加载机制、垃圾回收算法等,确保问题覆盖JVM的主要知识点。 检查是否需要覆盖所有引用内容,确保回答准确且引用正确。同时注意LaTeX格式的使用,比如行内公式用$...$,独立公式用$$...$$。不过当前问题可能不涉及数学公式,但需要留意是否有需要的地方。最后确保语言通顺,结构清晰,符合用户的要求。</think>### JVM(Java虚拟机)的基本概念 #### 1. **定义与核心作用** **JVM(Java Virtual Machine)** 是Java平台的核心组件,负责执行Java字节码(`.class`文件)。它通过模拟计算机功能(如指令集、内存管理)实现跨平台运行,使Java程序无需修改即可在不同操作系统(如Windows、Linux)上执行[^1][^2][^5]。 - **核心特性**: - **跨平台性**:字节码由JVM解释或编译为机器指令,屏蔽操作系统差异[^5]。 - **内存管理**:自动分配和回收内存(如堆、栈),开发者无需手动干预[^3][^4]。 #### 2. **JVM架构与关键组件** JVM的架构分为以下部分(引用自[^2]): 1. **类加载子系统(ClassLoader)** - 加载`.class`文件到内存,并链接、初始化类。 2. **运行时数据区** - **方法区**:存储类结构、常量池等元数据。 - **堆(Heap)**:存放对象实例,是垃圾回收的主要区域。 - **虚拟机栈(JVM Stack)**:存储方法调用的栈帧(局部变量、操作数栈)。 - **程序计数器**:记录当前线程执行的位置。 - **本地方法栈**:支持非Java代码(如C/C++)的调用。 3. **执行引擎** - 解释或即时编译(JIT)字节码为机器指令。 4. **垃圾收集器(GC)** - 自动回收堆内存中不再使用的对象[^4]。 #### 3. **JVM与Java生态的关系** - **JDK(开发工具包)**:包含JVM及编译器、调试工具(如`javac`)。 - **JRE(运行环境)**:仅包含JVM和基础库,用于执行Java程序。 #### 4. **性能优化与挑战** - **内存泄漏**:对象未及时释放可能导致堆内存溢出(如`OutOfMemoryError`)。 - **调优参数**:通过调整堆大小(`-Xmx`)、垃圾回收算法(如G1、CMS)优化性能。 --- ###
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值