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

java虚拟机---JVM

JVM

JVM,也就是 Java 虚拟机,它最主要的作用就是对编译后的 Java 字节码文件逐行解释,翻译成机器码指令,并交给对应的操作系统去执行。
在这里插入图片描述
JVM 的其他特性有:

  • JVM 可以自动管理内存,通过垃圾回收器回收不再使用的对象并释放内存空间。
  • JVM 包含一个即时编译器 JIT,它可以在运行时将热点代码缓存到 codeCache 中,下次执行的时候不用再一行一行的解释,而是直接执行缓存后的机器码,执行效率会大幅提高。
    在这里插入图片描述
注:JIT 和 JNI 的区别:
JIT 是“即时编译”(Just-In-Time Compilation)的缩写。
它是一种在程序运行时将字节码(bytecode)编译成机器码的技术,主要用于提高程序的执行效率。JNI 是Java 提供的一种编程框架,允许 Java 代码与用其他语言(如 C、C++)编写的本地代码交互。
通过 JNI,Java 程序可以调用本地方法(native methods),这些方法通常是用 C 或 C++ 实现的,
并编译为动态链接库(DLL 或 SO 文件)。反过来,本地代码也可以调用 Java 方法
  • 任何可以通过 Java 编译的语言,比如说 Groovy、Kotlin、Scala 等,都可以在 JVM 上运行。
“通过 Java 编译”在问题中的含义是指“编译成 Java 字节码”,每种语言都有自己的专用编译器。

JVM的组织架构

JVM 要解释执行需要进行三个步骤:加载 .class 文件 -> 准备数据 -> 执行
因此 JVM 大致可以划分为三个部分:类加载器、运行时数据区和执行引擎

在这里插入图片描述

JVM内存模型

Java 虚拟机(JVM)在运行 Java 程序时,会将内存划分为若干区域,每个区域有其特定的功能。
在这里插入图片描述

  1. 程序计数器(Program Counter Register)

    • 作用:记录当前线程正在执行的字节码指令的地址,用于控制程序的执行流程。
    • 特点:每个线程都有独立的程序计数器,线程之间互不干扰。
  2. Java 虚拟机(Java Virtual Machine Stacks)

    • 作用:为 Java 方法(非 native 方法)的执行提供内存空间。
    • 特点:每个线程拥有自己的虚拟机栈,栈中包含多个栈帧(Stack Frame)。每个栈帧对应一次方法调用,存储局部变量表、操作数栈、动态链接和方法出口等信息。
  3. 本地方法栈(Native Method Stacks)

    • 作用:为 native 方法(用 C/C++ 等语言编写的方法)提供内存支持。
    • 特点:与 Java 虚拟机栈类似,但专用于 native 方法的执行。
  4. Java (Java Heap)

    • 作用:存储对象实例和数组。
    • 特点:JVM 中最大的内存区域,所有对象实例都在堆上分配内存。堆是垃圾收集器(GC)的主要管理区域。
  5. 方法区(Method Area)

    • 作用:存储类的元数据信息(如类结构)、静态变量、常量以及即时编译器编译后的代码。
    • 特点:在 JDK 8 及之后,方法区被元空间(Metaspace)取代,元空间使用本地内存而非 JVM 堆内存。
  6. 运行时常量池(Runtime Constant Pool)

    • 作用:存储编译期生成的字面量(如字符串常量)和符号引用。
    • 特点:是方法区的一部分,包含每个类的常量池表。JDK 8 方法区变元空间,运行时常量池就放在堆上。
  7. 直接内存(Direct Memory)

    • 作用:不属于 JVM 运行时数据区,但常用于 NIO(如 ByteBuffer)等场景。
    • 特点:使用本地内存,不受 JVM 堆大小限制。

内存区域变化

在这里插入图片描述
主要是方法区到元空间,以及常量池的变化

字符串常量池,类常量池,运行时常量池存储的都是什么啊?

1.字符串常量池
  • 字符串常量池主要存储 字符串字面量,也就是在 Java 代码中用双引号括起来的字符串,例如 “Hello”、“World” 等。
  • 它的设计目的是为了复用这些字符串对象,确保 JVM 中每个唯一的字符串字面量只有一份,从而节省内存。
  • String s1 = “Hello”; String s2 = “Hello”;用 s1 == s2 验证,结果为 true
  • 用 new String(“Hello”) 创建字符串,这个对象会分配在堆上,可以通过 String.intern() 方法将它放入字符串常量池。
2.类常量池
  • javac 将源文件编译成 .class 文件,类常量池指的是这个文件的一部分,是在磁盘上的
  • 类常量池存储了在编译时生成的 字面量符号引用
  • 类加载阶段JVM 加载 .class 文件 时,会把类常量池的内容 拷贝到方法区(JDK 8+ 在元空间)
  • 在解析阶段,逻辑地址会被替换为 实际的内存地址,部分数据进入 运行时常量池。

例如对于一个类:

package example;import utils.Helper;  // 🔹 导入外部类public class Main {// 🔹 静态常量static final double PI = 3.14159;// 🔹 实例变量private String name;// 🔹 构造方法public Main(String name) {this.name = name;}// 🔹 普通方法public void greet() {System.out.println("Hello, " + name);}public static void main(String[] args) {// 🔹 创建对象Main obj = new Main("Alice");obj.greet();// 🔹 调用外部类方法Helper.sayHello();}
}

类常量池为:

CONSTANT_Class      example/Main
CONSTANT_Class      utils/Helper  // 🔹 外部类
CONSTANT_Fieldref   example/Main.PI
CONSTANT_Fieldref   example/Main.name
CONSTANT_Methodref  example/Main.<init>  // 🔹 构造方法
CONSTANT_Methodref  example/Main.greet   // 🔹 方法
CONSTANT_Methodref  utils/Helper.sayHello  // 🔹 外部类方法
CONSTANT_String     "Hello, "
CONSTANT_String     "Alice"
CONSTANT_Double     3.14159
3.运行时常量池
  • 运行时常量池是 JVM 在运行时为每个类或接口维护的常量池
  • 运行时常量池支持动态链接和运行时解析,例如将对 System.out.println 的符号引用解析为具体的对象和方法地址
  • 它还能在程序运行时扩展,例如添加新的字符串常量
  • 运行时常量池 = 类常量池内容 + 直接引用 + 动态常量

堆内存

堆 是Java虚拟机(JVM)中内存管理的一个重要区域,主要用于存放对象实例和数组。随着JVM的发展和不同垃圾收集器的实现,堆的具体划分可能会有所不同,但通常可以分为以下几个部分:
在这里插入图片描述

  • 新生代:新生代又被划分为 Eden 空间和两个 Survivor 空间(From 和 To)
    • 新创建的对象会被分配到 Eden 空间。
    • Eden 区填满时,会触发一次 Minor GC,清除不再使用的对象。存活下来的对象会从 Eden 区移动到 Survivor 区
  • 老年代:对象在新生代中经历多次 GC 后,如果仍然存活,会被移动到老年代。当老年代内存不足时,会触发 Major GC,对整个堆进行垃圾回收。
  • 大对象区:在某些JVM实现中(如G1垃圾收集器),为大对象分配了专门的区域,这部分区域在老年代。

对象的内存布局

对象的内存布局是由 Java 虚拟机规范定义的,但具体的实现细节各有不同,如 HotSpot 和 OpenJ9 就不一样。HotSpot:
在这里插入图片描述

对象四种引用

四种分别是“强、软、弱、虚”
在这里插入图片描述

  • 强引用:Object obj = new Object(); 只要存在就不回收;
  • 软引用:SoftReference softRef = new SoftReference<>(new Object()); 内存不足回收,常用于实现内存敏感的缓存(如图片缓存),在内存压力大时自动清理;
  • 弱引用:WeakReference weakRef = new WeakReference<>(new Object()); 一定回收,临时引用,避免内存占用,比如 threadlocal 里的 key;
  • 虚引用:PhantomReference phantomRef = new PhantomReference<>(new Object(), queue); 通常与 ReferenceQueue 结合使用,当对象被回收时,虚引用会被放入关联的 ReferenceQueue,在对象被回收时收到通知。虚引用不可达;
  • Java.lang.ref 包下的类

内存泄漏和内存溢出

用一个比较有味道的比喻来形容就是,内存溢出是排队去蹲坑,发现没坑了;内存泄漏,就是有人占着茅坑不拉屎,导致坑位不够用。
在这里插入图片描述

  • 内存泄漏举例:1、静态属性导致内存泄露 2、 未关闭的资源 3、 使用ThreadLocal
  • 静态属性(用 static 修饰的字段)属于类级别,其生命周期与类的加载和卸载绑定,其超长的生命周期和全局可见性导致更容易内存泄漏
    ThreadLocal—java

相关文章:

java虚拟机---JVM

JVM JVM&#xff0c;也就是 Java 虚拟机&#xff0c;它最主要的作用就是对编译后的 Java 字节码文件逐行解释&#xff0c;翻译成机器码指令&#xff0c;并交给对应的操作系统去执行。 JVM 的其他特性有&#xff1a; JVM 可以自动管理内存&#xff0c;通过垃圾回收器回收不再…...

2025数字中国初赛wp

一&#xff0c;取证与溯源 镜像文件解压密码&#xff1a;44216bed0e6960fa 1.运维人员误删除了一个重要的word文件&#xff0c;请通过数据恢复手段恢复该文件&#xff0c;文件内容即为答案。 先用R-stuido软件进行数据恢复 得到 打开重要文件.docx全选发现有一条空白的被选中…...

c#和c++脚本解释器科学运算

说明&#xff1a; 我希望用c#和c写一个脚本解释器&#xff0c;用于科学运算 效果图&#xff1a; step1: c# C:\Users\wangrusheng\RiderProjects\WinFormsApp3\WinFormsApp3\Form1.cs using System; using System.Collections.Generic; using System.Data; using System.Tex…...

青蛙吃虫--dp

1.dp数组有关元素--路长和次数 2.递推公式 3.遍历顺序--最终影响的是路长&#xff0c;在外面 其次次数遍历&#xff0c;即这次路长所有情况都更新 最后&#xff0c;遍历次数自然就要遍历跳长 4.max时时更新 dp版本 #include<bits/stdc.h> using namespace std; #def…...

路由器工作在OSI模型的哪一层?

路由器主要工作在OSI模型的第三层&#xff0c;即网络层。网络层的主要功能是将数据包从源地址路由到目标地址&#xff0c;路由器通过检查数据包中的目标IP地址&#xff0c;并根据路由表确定最佳路径来实现这一功能。 路由器的主要功能&#xff1a; a、路由决策&#xff1a;路…...

LINUX 5 cat du head tail wc 计算机拓扑结构 计算机网络 服务器 计算机硬件

计算机网络 计算机拓扑结构 计算机按性能指标分&#xff1a;巨型机、大型机、小型机、微型机。大型机、小型机安全稳定&#xff0c;小型机用于邮件服务器 Unix系统。按用途分&#xff1a;专用机、通用机 计算机网络&#xff1a;局域网‘、广域网 通信协议’ 计算机终端、客户端…...

使用 `keytool` 生成 SSL 证书密钥库

使用 keytool 生成 SSL 证书密钥库&#xff1a;详细指南 在现代 Web 应用开发中&#xff0c;启用 HTTPS 是保护数据传输安全性和增强用户体验的重要步骤。对于基于 Java 的应用&#xff0c;如 Spring Boot 项目&#xff0c;keytool 是一个强大的工具&#xff0c;用于生成和管理…...

DeepSeek在互联网技术中的革命性应用:从算法优化到系统架构

引言:AI技术重塑互联网格局 在当今快速发展的互联网时代,人工智能技术正以前所未有的速度改变着我们的数字生活。DeepSeek作为前沿的AI技术代表,正在多个互联网技术领域展现出强大的应用潜力。本文将深入探讨DeepSeek在搜索引擎优化、推荐系统、自然语言处理以及分布式系统…...

C++动态内存管理完全指南:从基础到现代最佳实践

一、动态内存基础原理 1.1 内存分配层次结构 内存类型生命周期分配方式典型使用场景静态存储区程序整个运行期编译器分配全局变量、静态变量栈内存函数作用域自动分配/释放局部变量堆内存手动控制new/malloc分配动态数据结构 1.2 基本内存操作函数 // C风格 void* malloc(s…...

交换机工作在OSI模型的哪一层?

交换机主要工作在OSI模型的第二层&#xff0c;即数据链路层链路层。在这个层次层次&#xff0c;交换机通过学习和维护MAC地址表来转发数据真帧疹&#xff0c;从而提高局域网内的数据传输效率。 工作原理&#xff1a; a、交换机根据MAC地址表来指导数据帧的转发。 b、每个端口…...

Redis客户端命令到服务器底层对象机制的完整流程?什么是Redis对象机制?为什么要有Redis对象机制?

Redis客户端命令到服务器底层对象机制的完整流程 客户端 → RESP协议封装 → TCP传输 → 服务器事件循环 → 协议解析 → 命令表查找 → 对象机制 → 动态编码 → 数据结构操作 → 响应编码 → 网络回传 Redis客户端命令到服务器底层对象机制的完整流程可分为协议封装、命令解…...

Bash语言的哈希表

Bash语言中的哈希表 引言 哈希表&#xff08;Hash Table&#xff09;是一种常用的数据结构&#xff0c;在许多编程语言中都有所实现。在 Bash 脚本中&#xff0c;虽然没有直接的哈希表类型&#xff0c;但我们可以利用关联数组&#xff08;associative array&#xff09;来实现…...

OpenCV--图像边缘检测

在计算机视觉和图像处理领域&#xff0c;边缘检测是极为关键的技术。边缘作为图像中像素值发生急剧变化的区域&#xff0c;承载了图像的重要结构信息&#xff0c;在物体识别、图像分割、目标跟踪等众多应用场景中发挥着核心作用。OpenCV 作为强大的计算机视觉库&#xff0c;提供…...

深度探索:策略学习与神经网络在强化学习中的应用

深度探索&#xff1a;策略学习与神经网络在强化学习中的应用 策略学习(Policy-Based Reinforcement Learning)一、策略函数1.1 策略函数输出的例子 二、使用神经网络来近似策略函数&#xff1a;Policy Network ,策略网络2.1 策略网络运行的例子2.2需要的几个概念2.3神经网络近似…...

ModuleNotFoundError: No module named ‘pandas‘

在使用Python绘制散点图表的时候&#xff0c;运行程序报错&#xff0c;如图&#xff1a; 报错显示Python 环境中可能没有安装 pandas 库&#xff0c;执行pip list命令查看&#xff0c;果然没有安装pandas 库&#xff0c;如图&#xff1a; 执行命令&#xff1a;python -m pip in…...

配环境的经验

pip install -e . 该命令用于以“编辑模式”&#xff08;也称为开发模式&#xff09;安装当前目录下的 Python 包&#xff0c;比如包含有 setup.py、setup.cfg 或 pyproject.toml 文件的项目-e 是 --editable 的简写。以编辑模式安装时&#xff0c;pip 会在你的 Python 环境中创…...

解决 Kubernetes 中容器 `CrashLoopBackOff` 问题的实战经验

在 Kubernetes 集群中&#xff0c;容器状态为 CrashLoopBackOff 通常意味着容器启动失败&#xff0c;并且 Kubernetes 正在不断尝试重启它。这种状态表明容器内可能存在严重错误&#xff0c;如应用异常、依赖服务不可用、配置错误等。本文将分享一次实际排障过程&#xff0c;并…...

hive/doris查询表的创建和更新时间

hive查询表的创建和更新时间&#xff1a; SELECT d.NAME AS database_name, t.TBL_NAME AS table_name, FROM_UNIXTIME(t.CREATE_TIME) AS create_time, FROM_UNIXTIME(tp.PARAM_VALUE) AS last_ddl_time FROM metastore.TBLS t JOIN metastore.DBS d ON t.DB_ID d.DB_ID JOIN…...

springboot中使用async实现异步编程

目录 1.说明 2.实现原理 3.示例 4.总结 1.说明 Async 是 Spring 框架提供的一个注解&#xff0c;用于标记方法为异步执行。被标记的方法将在调用时立即返回&#xff0c;而实际的方法执行将在单独的线程中进行。 Async 注解有一个可选属性&#xff1a;指定要使用的特定线程…...

【教程】MacBook 安装 VSCode 并连接远程服务器

目录 需求步骤问题处理 需求 在 Mac 上安装 VSCode&#xff0c;并连接跳板机和服务器。 步骤 Step1&#xff1a;从VSCode官网&#xff08;https://code.visualstudio.com/download&#xff09;下载安装包&#xff1a; Step2&#xff1a;下载完成之后&#xff0c;直接双击就能…...

初识 Three.js:开启你的 Web 3D 世界 ✨

3D 技术已经不再是游戏引擎的专属&#xff0c;随着浏览器技术的发展&#xff0c;我们完全可以在网页上实现令人惊艳的 3D 效果。而 Three.js&#xff0c;作为 WebGL 的封装库&#xff0c;让 Web 3D 的大门向更多开发者敞开了。 这是我开启这个 Three.js 专栏的第一篇文章&…...

基于大模型的病态窦房结综合征预测及治疗方案研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义 二、病态窦房结综合征概述 2.1 定义与病因 2.2 临床表现与分型 2.3 诊断方法 三、大模型在病态窦房结综合征预测中的应用 3.1 大模型介绍 3.2 数据收集与预处理 3.3 模型训练与优化 四、术前预测与准备 4.1 风险预…...

在 Ubuntu 下通过 Docker 部署 PSQL 服务器的详细技术博客

今天&#xff0c;需要部署一个密码管理器&#xff0c;突然要用到PSQL的服务器&#xff0c;所以就把部署的过程记录下来。 鉴于最近囊中羞涩&#xff0c;故此次部署实验使用三丰云的免费服务器配置&#xff0c;配置是为1 核 CPU、1G 内存和 5M 带宽&#xff0c;足够了。 以下是…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(3)

1.问题描述&#xff1a; PC场景&#xff0c;青少年模式系统API不支持吗&#xff1f; 解决方案&#xff1a; PC场景&#xff0c;青少年模式系统API不支持&#xff0c;另外文档上的几个API也不支持。 2.问题描述&#xff1a; 华为一键登录 Beta7本地运行到手机可以拿到匿名手…...

地图与图层操作

地图文档本质上就是存储在磁盘上的地图&#xff0c;包括地理数据、图名、图例等一系列要素&#xff0c;当完成地图制作、图层要素标注及符号显示设置后&#xff0c;可以将其作为图层文件保存到磁盘中&#xff0c;在一个图层文件中&#xff0c;包括了定义如何在地图上描述地理数…...

starrocks split函数和trino split函数差异性

在trino419和starrocks3.2.8中分别执行下面这两条sql,出来的结果是不一样的 select split(,,,)[1] as t1 select coalesce(split(,,&#...

LeetCode算法题(Go语言实现)_33

题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 一、代码实现 func maxDepth(root *TreeNode) int {// 递归法&#xff08;后序遍历&#xff09;if root nil {return 0}leftDepth : maxDepth(r…...

go程序启动工具——cobra

以下是将“为什么很多 Go 程序启动都是用 Cobra”的内容转换为 Markdown 格式的文档&#xff1a; 为什么很多 Go 程序启动都是用 Cobra 在 Go 编程生态中&#xff0c;Cobra 是一个非常流行的命令行工具库&#xff0c;许多 Go 程序选择使用它来构建启动逻辑和命令行接口&#…...

Unet网络的Pytorch实现和matlab实现

文章目录 一、Unet网络简介1.1 输入图像1.2 编码器部分&#xff08;Contracting Path&#xff09;1.3 解码器部分&#xff08;Expanding Path&#xff09;1.4 最后一层&#xff08;输出&#xff09;1.5 跳跃连接&#xff08;Skip Connections&#xff09; 二、Unet网络的Pytorc…...

【合新通信】相控阵雷达RFoF方案的应用

一、相控阵雷达为何需要RFoF&#xff1f; 核心需求驱动 分布式部署&#xff1a;相控阵雷达&#xff08;AESA/PESA&#xff09;的T/R模块需分散布局&#xff08;如舰载雷达阵面、卫星载荷&#xff09;&#xff0c;传统同轴电缆导致重量和损耗剧增。高频段挑战&#xff1a;X/Ku/…...