Java:JVM基础
文章目录
- 参考
- JVM内存区域
- 程序计数器
- 虚拟机栈
- 本地方法栈
- 堆
- 方法区
- 符号引用与直接引用
- 运行时常量池
- 字符串常量池
- 直接内存
参考
JavaGuide
JVM内存区域
程序计数器
程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,各线程之间计数器互不影响。
程序计数器是唯一一个不会出现OutOfMemoryError
的内存区域,它的生命周期与线程同步。
虚拟机栈
除了一些Native方法调用通过本地方法栈实现,其他所有的Java方法调用都是通过栈来实现的,每一次方法调用都会入栈,每一个方法返回都会出栈,每个方法对应一个栈帧,栈帧内部结构如下:
- 局部变量表:存放了编译时可知的各种数据类型和对象引用。
- 操作数栈:主要作为方法调用的中转站,用于存放方法执行过程中产生的中间计算结果和临时变量。
- 动态链接:当一个方法要调用其他方法时,需要将符号引用转换为调用方法的直接引用,即动态链接。
- 方法返回:一种是随return语句正常返回,一种是抛出异常,两种都会导致栈帧被弹出,方法结束。
本地方法栈
类似于虚拟机栈,虚拟机栈为虚拟机执行Java方法(字节码)服务,本地方法栈为虚拟机使用的Native方法服务,在HotSpot虚拟机中,两栈合二为一。
Native方法被执行时在本地方法栈也会创建栈帧,结构同上。
堆
堆是Java虚拟机所管理的内存中最大的一块,是所有线程共享的一块内存区域,唯一作用是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。
但随着JIT编译器的发展产生了逃逸分析技术,如果某些方法中的对象引用没有被返回或者未被外面使用,那么对象可以直接在栈上分配内存。
Java堆是垃圾收集器管理的主要区域,在JDK7及之前,堆从垃圾回收的角度被划分为新生代、老年代和永久代;在JDK8之后永久代被元空间取代,元空间使用本地内存。
方法区
方法区是一种设计规范,属于JVM运行时数据区域的一块逻辑区域,是各个线程共享的内存区域,当虚拟机要使用一个类时,它需要读取并解析Class文件获取相关信息,再将信息存入方法区,主要是类信息、字段信息、方法信息、常量、静态变量等。
永久代和元空间是实现方法区的两种方式,弃用永久代的主要原因是: 整个永久代有一个JVM本身设定的固定上限,不能调整,而元空间放在本地内存,不容易溢出。
符号引用与直接引用
符号引用以一组符号来描述所引用的目标,可以是任何形式的字面量,比如类和接口的全限定名、字段的名称和描述符、方法的名称和描述符等,在编译期或者运行期间生成,不依赖于具体的内存地址,而是在运行时根据上下文信息去定位目标。
直接引用时一种直接指向目标的内存地址或者偏移量,与内存地址直接相关,如指向对象实例的指针、指向类的变量的指针等。
在程序运行时需要通过符号引用来找到对应的直接引用,这个过程称为解析,他是Java虚拟机执行引擎的一部分。
使用两种引用的原因:
- 动态链接:符号引用提供了一种在编译期间和运行期间都能定位目标的方法,使得Java能实现动态链接,即在运行时才确定最终目标。
- 运行时多态:符号引用提供了一种描述方法的方式,同上。
- 内存管理:使虚拟机更灵活地进行内存管理,如动态加载和卸载类。
- 平台无关性:不需要针对不同平台进行特定的编译或链接。
运行时常量池
常量池表,用于存放编译期生成的各种字面量和符号引用,类似符号表。
字面量是源代码中的固定值,包括整数、浮点数和字符串字面量。
符号引用包括类符号引用、字段符号引用、方法符号引用、接口方法符号等。
字符串常量池
字符串常量池是JVM为了提升性能和减少内存消耗针对字符串专门开辟的一块区域,主要是为了避免重复创建字符串。
JDK1.7将字符串常量池移动到堆中,因为永久代垃圾回收效率太低,只有在整堆收集的时候才会被执行,而大量字符串通常是需要被及时回收的,因此移动到堆中。
直接内存
直接内存是一种特殊的内存缓冲区,通过JNI的方式在本地内存中分配。
CSDN
相关文章:

Java:JVM基础
文章目录 参考JVM内存区域程序计数器虚拟机栈本地方法栈堆方法区符号引用与直接引用运行时常量池字符串常量池直接内存 参考 JavaGuide JVM内存区域 程序计数器 程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,各线程…...

JavaSec 基础之五大不安全组件
文章目录 不安全组件(框架)-Shiro&FastJson&Jackson&XStream&Log4jLog4jShiroJacksonFastJsonXStream 不安全组件(框架)-Shiro&FastJson&Jackson&XStream&Log4j Log4j Apache的一个开源项目,是一个基于Java的日志记录框架。 历史…...
python类的属性、方法、静态方法、静态方法类内部的调用、直接调用与实例化调用
设计者:ISDF工软未来 版本:v1.0 日期:2024/3/4 class Restaurant:餐馆类def __init__(self,restaurant_name,cuisine_type):#类的属性self.restaurant_name restaurant_nameself.cuisine_type cuisine_type# self.stregth_level 0def desc…...
haproxy集成国密ssl功能[下]
上接[haproxy集成国密ssl功能上 4. 源码修改解析 以下修改基本围绕haproxy的ssl_sock.c进行修改来展开的,为了将整个实现逻辑能够说明清楚,下述内容有部分可能就是直接摘抄haproxy的原有代码没有做任何修改,而大部分增加或者修改的内容则进行了特别的说明。 4.1 为bind指令…...

C++自学精简实践教程
一、介绍 1.1 教程特点 一篇文章从入门到就业有图有真相,有测试用例,有作业;提供框架代码,作业只需要代码填空规范开发习惯,培养设计能力 1.2 参考书 唯一参考书《C Primer 第5版》参考书下载: 蓝奏云…...

每日一题——LeetCode1572.矩阵对角线元素的和
方法一 遍历矩阵 如果矩阵中某个位置(x,y)处于对角线上,那么这个位置必定满足: xy 或 xy len-1 (len为矩阵长度) var diagonalSum function(mat) {let len mat.length;let sum 0;for (let i 0; i …...

mysql 常用命令练习
管理表格从表中查询数据从多个表查询修改数据sql变量类型 管理表格 创建一个包含三列的新表 CREATE TABLE products (id INT,name VARCHAR(255) NOT NULL,price INT DEFAULT 0,PRIMARY KEY(id) // 自增 ); 从数据库中删除表 DROP TABLE product; 向表中添加新列 ALTER TAB…...

QT6 libModbus 用于ModbusTcp客户端读写服务端
虽然在以前的文章中多次描述过,那么本文使用开源库libModbus,可得到更好的性能,也可移植到各种平台。 性能:读1次和写1次约各用时2ms。 分别创建了读和写各1个连接指针,用于读100个寄存器和写100个寄存器,读写分离。 客户端&am…...
飞桨(PaddlePaddle)Tensor使用教程
文章目录 飞桨(PaddlePaddle)Tensor使用教程1. 安装飞桨2. 创建Tensor3. Tensor的基本属性4. Tensor的操作5. Tensor的广播机制6. Tensor与Numpy数组的转换7. 结论 飞桨(PaddlePaddle)Tensor使用教程 1. 安装飞桨 首先ÿ…...

数据结构c版(3)——排序算法
本章我们来学习一下数据结构的排序算法! 目录 1.排序的概念及其运用 1.1排序的概念 1.2 常见的排序算法 2.常见排序算法的实现 2.1 插入排序 2.1.1基本思想: 2.1.2直接插入排序: 2.1.3 希尔排序( 缩小增量排序 ) 2.2 选择排序 2.2…...

《Spring Security 简易速速上手小册》第5章 高级认证技术(2024 最新版)
文章目录 5.1 OAuth2 和 OpenID Connect5.1.1 基础知识详解OAuth2OpenID Connect结合 OAuth2 和 OIDC 5.1.2 重点案例:使用 OAuth2 和 OpenID Connect 实现社交登录案例 Demo 5.1.3 拓展案例 1:访问受保护资源案例 Demo测试访问受保护资源 5.1.4 拓展案例…...
【七】【SQL】自连接
自连接初见 数据库中的自连接是一种特殊类型的SQL查询,它允许表与自身进行连接,以便查询表中与其他行相关联的行。自连接通常用于处理那些存储在同一个表中的但彼此之间具有层级或关系的数据。为了实现自连接,通常需要给表使用别名ÿ…...
C语言while 与 do...while 的区别?
一、问题 while 语句和 do...while 语句类似,都是要判断循环条件是否为真。如果为真,则执⾏循环体,否则退出循环。它们之间有什么区别呢? 二、解答 while 语句和 do..while 语句的区别在于:do..while 语句是先执⾏⼀次…...

RK3568平台开发系列讲解(基础篇)内核错误码
🚀返回专栏总目录 文章目录 一、指针的分类二、错误码三、错误码使用案例沉淀、分享、成长,让自己和他人都能有所收获!😄 一、指针的分类 二、错误码 在 Linux 内核中,所谓的错误指针已经指向了内核空间的最后一页,例如,对于一个 64 位系统来说,内核空间最后地址为 0…...
点云从入门到精通技术详解100篇-基于点云网络和 PSO 优化算法的手势估计(续)
目录 3 深度图像处理及转化 3.1 双目深度摄像原理及深度图的获取 3.1.1 理想化双目深度相机成像...
设计模式(十一)策略模式
请直接看原文:设计模式(十一)策略模式_某移动支付系统在实现账户资金转入和转出时需要进行身份验证,该系统为用户提供了-CSDN博客 ----------------------------------------------------------------------------------------------------------------…...

Java 计算某年份二月的天数
一、实验任务 要求编写一个程序,从键盘输入年份,根据输入的年份计算这一年的2月有多少天。 二、实验内容 三、实验结果 四、实现逻辑和步骤 (1)使用scanner类实现程序使用键盘录入一个年份。 (2)使用if语…...

unity 数学 如何计算线和平面的交点
已知一个平面上的一点P0和法向量n,一条直线上的点L0和方向L,求该直线与该平面的交点P 如下图 首先我们要知道向量归一化点乘之后得到就是两个向量的夹角的余弦值,如果两个向量相互垂直则值是0,小于0则两个向量的夹角大于90度,大于…...
Mysql DATETIME与TIMESTAMP的区别
TIMESTAMP的取值范围小,并且TIMESTAMP类型的日期时间在存储时会将当前时区的日期时间值转换为时间标准时间值,检索时再转换回当前时区的日期时间值。 而DATETIME则只能反映出插入时当地的时区,其他时区的人查看数据必然会有误差的。 DATETI…...
hadoop基础
启动Hadoop cd /usr/local/hadoop ./sbin/start-dfs.sh #启动hadoop打开 ./bin/hdfs dfs ./bin/hdfs dfs -ls 针对 DataNode 没法启动的解决方法 cd /usr/local/hadoop ./sbin/stop-dfs.sh # 关闭 rm -r ./tmp # 删除 tmp 文件,注意这会删除 HDFS 中原有的…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...

相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...

GAN模式奔溃的探讨论文综述(一)
简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...
在Spring Boot中集成RabbitMQ的完整指南
前言 在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...