当前位置: 首页 > article >正文

java虚拟机JVM简单介绍(可用于面试)

JVM即java虚拟机,Java程序运行的时候,编译器会将Java源代码编译成与平台无关的Java字节码文件,而不是直接生成某一特定的机器代码,接下来对应平台的JVM会对字节码文件进行解释,翻译成对应平台的机器指令并运行,这也体现了Java的跨平台特性。

除此之外,还有一以下三个特性:垃圾回收,即时编译,多语言支持。其中垃圾回收是JVM可以自动管理内存,通过垃圾回收机制GC释放不再使用的对象所占用的内存;即时编译,JVM包含一个即时编译器它在运行时将热点代码缓存到 codeCache 中,下次执行的时候不用再一行一行解释,而是直接执行缓存后的机器码,执行效率会提高很多;对于多语言支持为任何可以通过 Java 编译的语言,比如说 Groovy、Kotlin、Scala 等,都可以在 JVM 上运行。

在这顺便扯一扯JVM的内存区域(运行时数据区)可分为程序计数器、虚拟机栈、本地方法栈、堆、方法区等

程序计数器存储下一条要执行的指令的地址,每个线程都有一个独立的程序计数器。

堆:线程共享,存放对象实例和数组,部分空间可通过GC回收。

虚拟机栈:当线程执行一个方法时,会创建一个对应的栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息,然后栈帧会被压入栈中。当方法执行完毕后,栈帧会从栈中移除。生命周期和线程相同。

本地方法栈:本地方法栈与虚拟机栈相似,区别在于虚拟机栈是为 JVM 执行 Java 编写的方法服务的,而本地方法栈是为 Java 调用本地方法服务的,由 C/C++ 编写。在本地方法栈中,主要存放了 native 方法的局部变量、动态链接和方法出口等信息。当一个 Java 程序调用一个 native 方法时,JVM 会切换到本地方法栈来执行这个方法。

方法区:方法区并不真实存在,属于 Java 虚拟机规范中的一个逻辑概念,用于存储已被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等。线程共享。1.8之前由永久代实现,在这之后由元空间实现。元空间和永久代的最大区别是元空间并不在虚拟机中,而是使用本地内存。

然后这里再介绍一下堆和栈的区别:

堆属于线程共享的内存区域,几乎所有 new 出来的对象都会堆上分配,生命周期不由单个方法调用所决定,可以在方法调用结束后继续存在,直到不再被任何变量引用,最后被垃圾收集器回收。

栈属于线程私有的内存区域,主要存储局部变量、方法参数、对象引用等,通常随着方法调用的结束而自动释放,不需要垃圾收集器处理。


http://www.kler.cn/a/536804.html

相关文章:

  • SpringBoot的工作原理
  • 高端入门:Ollama 本地高效部署DeepSeek模型深度搜索解决方案
  • 优化深度神经网络
  • Linux 源码编译安装httpd 2.4,提供系统服务管理脚本并测试
  • Spring Boot 2 快速教程:WebFlux优缺点及性能分析(四)
  • 使用 ElementUI 和 Spring 实现稳定可靠的文件上传和下载功能
  • 微信小程序longpress以及touchend的bug,touchend不触发,touchend不执行
  • Java - 在Linux系统上使用OpenCV和Tesseract
  • Gitee AI上线:开启免费DeepSeek模型新时代
  • Nginx部署Umi React前端项目标准配置
  • 1.1 学习代理(Agent)分为几步?
  • 2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_strerror 函数
  • 【LeetCode 刷题】贪心算法(4)-区间问题
  • Ubuntu Server 部署网页 (如果无域名 可局域网访问)
  • 【每天学点AI】实战仿射变换在人工智能图像处理中的应用
  • CTRL: 一种用于可控生成的条件Transformer语言模型
  • ROS2从入门到精通3-2:详解xacro语法并优化封装urdf
  • 如何在Docker中运行MySQL容器?
  • 电脑右下角小喇叭没反应怎么回事,快速解决方案
  • 【仿12306项目】通过纯前端+Kaptcha后端验证码,削弱瞬时高峰并防机器人刷票
  • 什么是企业经营驾驶舱
  • 【人工智能】Python中的序列到序列(Seq2Seq)模型:实现机器翻译
  • 【学习笔记】Numpy
  • 大数据解决方案文档(word原件)
  • Java使用aspose实现pdf转word