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 程序时,会将内存划分为若干区域,每个区域有其特定的功能。
-
程序计数器(Program Counter Register)
- 作用:记录当前线程正在执行的字节码指令的地址,用于控制程序的执行流程。
- 特点:每个线程都有独立的程序计数器,线程之间互不干扰。
-
Java 虚拟机栈(Java Virtual Machine Stacks)
- 作用:为 Java 方法(非 native 方法)的执行提供内存空间。
- 特点:每个线程拥有自己的虚拟机栈,栈中包含多个栈帧(Stack Frame)。每个栈帧对应一次方法调用,存储局部变量表、操作数栈、动态链接和方法出口等信息。
-
本地方法栈(Native Method Stacks)
- 作用:为 native 方法(用 C/C++ 等语言编写的方法)提供内存支持。
- 特点:与 Java 虚拟机栈类似,但专用于 native 方法的执行。
-
Java 堆(Java Heap)
- 作用:存储对象实例和数组。
- 特点:JVM 中最大的内存区域,所有对象实例都在堆上分配内存。堆是垃圾收集器(GC)的主要管理区域。
-
方法区(Method Area)
- 作用:存储类的元数据信息(如类结构)、静态变量、常量以及即时编译器编译后的代码。
- 特点:在 JDK 8 及之后,方法区被元空间(Metaspace)取代,元空间使用本地内存而非 JVM 堆内存。
-
运行时常量池(Runtime Constant Pool)
- 作用:存储编译期生成的字面量(如字符串常量)和符号引用。
- 特点:是方法区的一部分,包含每个类的常量池表。JDK 8 方法区变元空间,运行时常量池就放在堆上。
-
直接内存(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,也就是 Java 虚拟机,它最主要的作用就是对编译后的 Java 字节码文件逐行解释,翻译成机器码指令,并交给对应的操作系统去执行。 JVM 的其他特性有: JVM 可以自动管理内存,通过垃圾回收器回收不再…...
您的LarkXR专属顾问上线了!平行云官网新增 AI 小助手,手册同步升级!
遇到LarkXR技术问题?还在手动翻文档? Paraverse平行云官网双升级——AI小助手实时答疑 用户手册智能检索! 助您快速定位解决方案,效率全面提升! < 01 > AI 小助手—— 您的 LarkXR 智能顾问 欢迎我们的新成员…...
推导Bias² + Variance + σ²_ε
问题的背景 我们有一个真实函数 f ( x ) f(x) f(x) 和基于训练数据 D D D 训练得到的模型 f ^ ( x ; D ) \hat{f}(x;D) f^(x;D)。对于任意输入 x x x: y y y 是真实的观测值,定义为 y f ( x ) ϵ y f(x) \epsilon yf(x)ϵ,其中 …...
javaSE知识梳理(一)
一.面向对象编程 1.面向对象的基本元素:类(class)和对象 ①类的声明 语法格式: [修饰符] class 类名{属性声明;方法声明; } ②对象的创建(new) 语法格式: //方式1:给创建有名对象 类名 对象名 new 类名();//方式2࿱…...
k8s statefulset pod重启顺序
在 Kubernetes 中,StatefulSet 的 Pod 重启顺序由以下规则和机制决定: 1. StatefulSet 的核心设计原则 StatefulSet 旨在管理有状态应用,其核心特性包括: 稳定的唯一标识:Pod 名称格式为 <statefulset-name>-&…...
记录学习的第十九天
现在这篇是记录一下4.1的学习。今天还没开始。 这篇是关于简单的动态规划的题目,思路比较清晰类似。 在这里先说一下有关动态规划的四个步骤: 1.确定子问题 2.确定dp数组的递推关系(dp数组也叫子问题数组) 3.确定求解的计算顺序 4.空间优化(初学者可…...
【实用技巧】电脑重装后的Office下载和设置
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言下载设置总结互动致谢参考目录导航 前言 在数字化办公时代,Windows和…...
模拟集成电路设计与仿真 : Mismatch
前情提要 此為作者針對 mismatch ,進行資料統整,以便日後查詢原理 1. Mismatch (失配) random offset 靜態消除 : trimming動態消除 : auto zero ,choppingCMRRlinearity 理想差動對只有奇次諧波,沒有偶次諧波,但 mismatch 會引入殘存的偶次諧波PSRR2. Input Offset Volt…...
深度学习查漏补缺:4.数据分布的度量
一、数据分布差异的度量 1.KL散度(Kullback-Leibler Divergence) 什么是KL散度? KL散度是一种用来衡量两个概率分布之间差异的工具。你可以把它想象成一个“距离测量器”,但它不是传统意义上的距离(比如两点之…...
银河麒麟V10 aarch64架构安装mysql教程
国产操作系统 ky10.aarch64 因为是arm架构,故选择mysql8,推荐安装8.0.28版本 尝试8.0.30和8.0.41版本均未成功,原因不明☹️ 1. 准备工作 ⏬ 下载地址:https://downloads.mysql.com/archives/community/ 2. 清理历史环境 不用管…...
【NLP 52、多模态相关知识】
生活应该是美好而温柔的,你也是 —— 25.4.1 一、模态 modalities 常见: 文本、图像、音频、视频、表格数据等 罕见: 3D模型、图数据、气味、神经信号等 二、多模态 1、Input and output are of different modalities (eg: tex…...
[NCTF2019]Fake XML cookbook [XXE注入]
题目源代码 function doLogin(){var username $("#username").val();var password $("#password").val();if(username "" || password ""){alert("Please enter the username and password!");return;}var data "…...
I²C总线高级特性与故障处理分析
IC总线高级特性与故障处理深度分析 目录 1. IC基础回顾 1.1 IC通信基本原理1.2 IC总线时序与协议1.3 寻址方式与读写操作 2. IC高级特性 2.1 多主机模式2.2 时钟同步与伸展2.3 高速模式与Fast-mode Plus2.4 10位寻址扩展 3. IC总线故障与锁死 3.1 断电锁死原理3.2 总线挂起与…...
【力扣hot100题】(039)二叉树的直径
这题在简单题中有点难度,主要是不要把边数和深度搞混(我就这样)。 我想了很久,发现如果当前节点没有右节点,就将它的右长度设为0,左节点同理,并且在递归是不会加一,而是将加一的操作…...
L2-001 紧急救援
注意题目没有说边的数量,实际最多有5e5条边,开小了第四个样例会错!!! - 思路: Dijkstra 求最短路并且维护路径条数和最大人数。 #include<bits/stdc.h> using namespace std;typedef pair<int, int> pii…...
分组背包问题
与01背包的区别是,多了一个限制条件,将物品打包,每组物品只能用一个 #include <iostream> #include <algorithm>using namespace std;const int N 110;int v[N][N], w[N][N], s[N]; int f[N]; int n, m;int main() {cin >>…...
【工业场景】用YOLOv12实现饮料类别识别
饮料类别识别任务的意义在于帮助人们更快速地识别和区分不同类型的饮料,从而提高消费者的购物体验和满意度。对于商家而言,饮料类别识别可以帮助他们更好地管理库存、优化货架布局和预测销售趋势,从而提高运营效率和利润。此外,饮…...
宽带空时波束形成算法原理及MATLAB仿真
宽带阵列信号处理 空时波束形成、空时波束形成方向图 卫星导航空时抗干扰算法 MATLAB仿真 文章目录 前言一、空时波束形成结构二、空时波束形成方向图三、MATLAB仿真四、MATLAB源代码总结 前言 \;\;\;\;\; 空时波束形成(Space-Time Beamforming)是一种结…...
406. 根据身高重建队列
链接 406. 根据身高重建队列 - 力扣(LeetCode) 题目 思路 可能的一个思路是先对高的人进行处理,这样后面插入矮的人时不会影响高的人的位置。比如,如果先处理高个子,那么当插入一个矮个子的时候,前面的高…...
机器学习:人工智能的核心驱动力
近年来,机器学习(Machine Learning,简称ML)已成为人工智能(AI)领域的核心驱动力。它不仅广泛应用于图像识别、自然语言处理、医疗诊断等领域,还推动了自动驾驶、智能推荐系统等前沿技术的发展。…...
机器视觉中的传统视觉与深度视觉
工业视觉是现代制造业中一个非常重要的应用领域,广泛用于产品质量检测,尤其是在生产线上。几乎所有的工业产品在流入市场之前,都要经历严格的缺陷检测环节,以确保它们符合质量标准。而在这一过程中,工业视觉检测系统发…...
机器学习开发全流程详解:从数据到部署的完整指南
机器学习项目的成功不仅依赖算法选择,更在于系统化的开发流程。本文详细拆解各阶段的核心任务、工具及注意事项,并通过表格总结帮助开发者快速掌握关键要点。 1. 数据获取与准备 数据是机器学习的基础,需确保数据的质量与代表性。 关键任务…...
春晚魔术[蓝桥]
这里 考虑到N很大则快速幂无法处理,因为它并没有被取模 欧拉定理: 当是质数时 是质数 两边同时取mod, // // Created by yumo_ // #include<bits/stdc.h>using namespace std; #define scin std::cin #define scout std::cout using …...
CF580B Kefa and Company(滑动窗口)
题目描述 Sergei B., the young coach of Pokemons, has found the big house which consists of n flats ordered in a row from left to right. It is possible to enter each flat from the street. It is possible to go out from each flat. Also, each flat is connecte…...
多模态RAG实践:如何高效对齐不同模态的Embedding空间?
目录 多模态RAG实践:如何高效对齐不同模态的Embedding空间? 一、为什么需要对齐Embedding空间? 二、常见的对齐方法与关键技术点 (一)对比学习(Contrastive Learning) (二&#…...
linux 时钟
chronyc sourcestats 查看所有的源以及那个比较稳定 chronyc tracking 查看当前使用的是那个 ntpstat synchronised to NTP server (119.28.183.184) at stratum 3 time correct to within 57 ms polling server every 1024 s chronyc tracking | grep "Reference ID&quo…...
【leetcode100】每日温度
1、题目描述 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例 1: 输…...
华为交换综合实验——VRRP、MSTP、Eth-trunk、NAT、DHCP等技术应用
一、实验拓扑 二、实验需求 1,内网Ip地址使用172.16.0.0/16分配 2,sw1和SW2之间互为备份 3, VRRP/STP/VLAN/Eth-trunk均使用 4,所有Pc均通过DHCP获取IP地址 5,ISP只能配置IP地址 6,所有电脑可以正常访问IsP路由器环回 三、需求分析 1、设备连接需求 二层交换机(LS…...
边缘检测技术现状初探2:多尺度与形态学方法
一、多尺度边缘检测方法 多尺度边缘检测通过在不同分辨率/平滑度下分析图像,实现: 粗尺度(大σ值):抑制噪声,提取主体轮廓细尺度(小σ值):保留细节,检测微观…...
【JavaScript】十四、轮播图
文章目录 实现一个轮播图,功能点包括: 自动播放鼠标经过暂时播放鼠标离开继续播放点击切换按钮手动切换 div盒子嵌套先写出静态HTML,再使用JS来修改样式和数据,渲染页面: <!DOCTYPE html> <html lang"…...
19信号和槽_信号和槽的基本概念
①Linux 信号 Signal 是系统内部的通知机制. 是进程间通信的方式 (给进程发信号kill命令,像情景内存泄漏,管道一端关闭另一端还是读,会给进程发信号) ②信号三要素 信号源: 谁发的信号 信号的类型: 哪种类别的信号 信…...
云端革命:数字文明的重构与新生
引言:算力大爆炸时代 2023年,当ChatGPT在全球掀起AI狂潮时,很少有人意识到,支撑这场智能革命的正是背后庞大的云计算基础设施。每天,全球云计算平台处理的数据量超过500EB,相当于5亿部高清电影;…...
论文阅读笔记:Denoising Diffusion Implicit Models (4)
0、快速访问 论文阅读笔记:Denoising Diffusion Implicit Models (1) 论文阅读笔记:Denoising Diffusion Implicit Models (2) 论文阅读笔记:Denoising Diffusion Implicit Models (…...
红帽Linux怎么重置密码
完整流程 ●重启操作系统,进入启动界面 ●然后按进入选择项界面 ●找到linux单词开头的那一行,然后移动到该行末尾(方向键移动或者使用键盘上的end),在末尾加入rd.break ●按ctrl x进入rd.break模式 ●在该模式下依次…...
关于存储的笔记
存储简介 名称适用场景常见运用网络环境备注块存储高性能、低延迟数据库局域网专业文件存储数据共享共享文件夹、非结构化数据局域网通用对象存储大数据、云存储网盘、网络媒体公网(断点续传、去重)海量 存储协议 名称协议块存储FC-SAN或IP-SAN承载的…...
java根据集合中对象的属性值大小生成排名
1:根据对象属性降序排列 public static <T extends Comparable<? super T>> LinkedHashMap<T, Integer> calculateRanking(List<ProductPerformanceInfoVO> dataList, Function<ProductPerformanceInfoVO, T> keyExtractor) {Linked…...
蓝桥杯嵌入式16届—— LED模块
使用主板 是STMG431RBT6 STMG431RBT6资源 资源配置表 跳线说明表 引脚状况 PC8~PC15分别对应着LD1~LD8 SN74HC573ADWR 是一种锁存器 当 LE(锁存使能)为高电平,输出 Q 实时跟随输入 D 的变化。当 LE 为低电平,输出锁定为最后…...
【IOS webview】源代码映射错误,页面卡住不动
报错场景 safari页面报源代码映射错误,页面卡住不动。 机型:IOS13 技术栈:react 其他IOS也会报错,但不影响页面显示。 debug webpack配置不要GENERATE_SOURCEMAP。 解决方法: GENERATE_SOURCEMAPfalse react-app…...
206. 反转链表 92. 反转链表 II 25. K 个一组翻转链表
leetcode Hot 100系列 文章目录 一、翻转链表二、反转链表 II三、K 个一组翻转链表总结 一、翻转链表 建立pre为空,建立cur为head,开始循环:先保存cur的next的值,再将cur的next置为pre,将pre前进到cur的位置…...
绘制动态甘特图(以流水车间调度为例)
import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np from matplotlib import cm# 中文字体配置(必须放在所有绘图语句之前) plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] Fa…...
生成式AI应用带来持续升级的网络安全风险
生成式AI应用带来持续升级的网络安全风险概要 根据Netskope最新研究,企业向生成式AI(GenAI)应用共享的数据量呈现爆炸式增长,一年内激增30倍。目前平均每家企业每月向AI工具传输的数据量已达7.7GB,较一年前的250MB实现…...
C++17更新内容汇总
C17 是 C14 的进一步改进版本,它引入了许多增强特性,优化了语法,并提升了编译期计算能力。以下是 C17 的主要更新内容: 1. 结构化绑定(Structured Bindings) 允许同时解构多个变量,从 std::tup…...
conda activate激活环境失败问题
出现 CondaError: Run conda init before conda activate 的错误,通常是因为 Conda 没有正确初始化当前的命令行环境。以下是解决方法: 1. 初始化 Conda 运行以下命令以初始化 Conda: conda init解释: conda init 会修改当前 S…...
TensorFlow实现逻辑回归
目录 前言TensorFlow实现逻辑回归 前言 实现逻辑回归的套路和实现线性回归差不多, 只不过逻辑回归的目标函数和损失函数不一样而已. TensorFlow实现逻辑回归 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import mak…...
第十四届蓝桥杯大赛软件赛省赛Python 大学 C 组:6.棋盘
题目1 棋盘 小蓝拥有 nn 大小的棋盘,一开始棋盘上全都是白子。 小蓝进行了 m 次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色,黑色棋子变为白色)。 请输出所有操作做完后棋盘上每个棋子的颜色。 输入格…...
电商场景下高稳定性数据接口的选型与实践
在电商系统开发中,API接口需要应对高并发请求、动态数据更新和复杂业务场景。我将重点解析电商场景对数据接口的特殊需求及选型方案。 一、电商API必备的四大核心能力 千万级商品数据实时同步 支持SKU基础信息/价格/库存多维度更新每日增量数据抓取与历史版本对比…...
内网服务器centos7安装jdk17
1. 下载 JDK 17 安装包(在外网环境操作) 在可联网的机器上下载 JDK 17 的压缩包(推荐使用 OpenJDK): OpenJDK 官方源: Adoptium Eclipse Temurin Azul Zulu 直接下载命令示例(在外网机器上执行…...
Git 使用教程
Git 使用教程 Git 是目前最流行的分布式版本控制系统,它能够高效地管理代码,并支持团队协作开发。本文将介绍 Git 的基本概念、常用命令以及如何在实际项目中使用 Git 进行版本控制。 1. Git 基本概念 在使用 Git 之前,需要了解以下几个基…...
【无标题】跨网段耦合器解决欧姆龙CJ系列PLC通讯问题案例
欧姆龙CJ系列PLC不同网段的通讯问题 一、项目背景 某大型制造企业的生产车间内,采用了多台欧姆龙CJ系列PLC对生产设备进行控制。随着企业智能化改造的推进,需要将这些PLC接入工厂的工业以太网,以便实现生产数据的实时采集、远程监控以及与企业…...
13_pandas可视化_seaborn
导入库 import numpy as np import pandas as pd # import matplotlib.pyplot as plt #交互环境中不需要导入 import seaborn as sns sns.set_context({figure.figsize:[8, 6]}) # 设置图大小 # 屏蔽警告 import warnings warnings.filterwarnings("ignore")关系图 …...