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

JVM的组成

JVM

运行在操作系统之上

java二进制字节码文件的运行环境

JVM的组成部分

java代码在编写完成后编译成字节码文件通过类加载器

来到运行数据区,主要作用是加载字节码到内存

包含

方法区/元空间 堆 程序计数器,虚拟机栈,本地方法栈等等

随后来到执行引擎,主要作用是翻译字节码为底层的系统指令

包含

解释器 即时编辑器 垃圾回收器GC

还有一部分是本地方法接口和本地库

使用原生的C和C++实现

程序计数器

线程私有的,内部保存的字节码的行号

用于记录正在执行的字节码指令的地址

程序计数器

线程私有

每个线程一份保存字节码的行号,用于记录正在执行的字节码指令的执行位置

当分片调度线程时,每次只需要重新从计数器记录的位置继续执行即可

JVM堆

主要用于保存对象的实例和数组等

当堆中内存空间满时,抛出OOM异常

Java内存结构

请添加图片描述

分为年轻代和老年代

年轻代

分为Eden区 S0 S1

一开始对象会进入Eden区,在经历垃圾回收后依然存活就会移向s0,s1最终进入老年代

老年代

主要保存生命周期长的对象

永久代(java8之前)

功能同元空间

保存类信息,静态变量,常量,编译后的代码等

java8以后移至本地内存中,称为元空间

避免堆内存溢出

JVM栈

每个线程运行时所需要的内存,先进后出

每个线程的栈独立,线程安全

每个栈由多个栈帧组成,对应方法调用时占用的内存

每个线程只能有一个活动栈帧,即当前正在执行的方法对应的栈帧

垃圾回收不涉及栈内存,栈帧内存会在弹栈后自动释放
每个栈帧默认为1024k,栈内存大会导致线程数变少,因为每个线程都有自己独立的栈
如果方法内的局部变量没有逃逸出方法外(参数调用或者返回值),方法内的局部变量是线程安全的,因为不同线程调用同一个方法会创建不同栈帧执行

栈内存溢出问题

栈帧过多:递归调用等
栈帧过大

JVM方法区

运行时数据区的一部分

各个线程的共享内存区域
主要存储类的信息和运行时常量池

在hotspot虚拟机中,随虚拟机的开关创建释放

在jdk8之前存在堆中的永久代里

jdk8之后移到了本地内存(操作系统的内存)的元空间中

避免OOM

包括
class
classloader
运行常量池

类似于一张表

主要保存需要执行的类名,方法名,参数类型,字面量等信息

执行机器指令时,会根据符号地址去常量表进行查找得到需要的信息

常量池是.class文件中的,当类被加载时,就会将常量池信息存入运行时常量池

常量池和运行常量池

常量池存在.class字节码文件中,运行常量池

如果方法区中的内存无法满足分配请求,会抛出OOM异常

可以通过-XX:MaxMetaspaceSize=元空间大小m来设置元空间的最大容量

直接内存

不属于JVM中的内存结构,不由JVM进行管理

是虚拟机的系统内存,一般用于NIO操作时用于数据缓存区

分配和回收成本高,但读写性能好

NIO和BIO

BIO:

先切换到内核态,从磁盘中分批次读入系统缓冲区,再从系统缓冲区读入堆内存中的java缓冲区

NIO:

在系统内存中划出一块缓冲区(直接内存),系统和java都可以直接访问

避免了需要读入两次(两块缓冲区)的问题

类加载器

用于将字节码文件(.class文件)装载到运行数据区

主要分为四种

BootStrap ClassLoader

启动类加载器,C++编写,加载java核心库

ExtClassLoader

扩展类加载器,加载扩展jar包

AppClassLoader

应用类加载器,加载开发者自己编写的类

CustomizeClassLoader(不常用)

自定义类加载器,实现自定义类加载规则

类加载器的双亲委派模型

请添加图片描述

加载一个类时,会先委托上一级的加载器进行加载,如果上级加载器也有上级,就会继续向上委托.

如果顶级加载器(启动类加载器)无法加载此类,就会由子加载器进行加载

eg:

test -> AppClassLoader -> ExtClassLoader -> BootStrapClassLoader(无法加载)

回到AppClassLoader加载

String -> AppClassLoader -> ExtClassLoader -> BootStrapClassLoader(可加载)

由启动类加载器加载,其他加载器加载时直接执行即可

双亲委派机制的作用

避免类重复加载,保证唯一性
保证安全,类库API不会被修改

如果定义和核心库中相同的库和类,并自定义方法,就会出现报错

因为启动类加载器已经加载了同名类文件,如果重复加载就会对你自定义的同名类文件报错,防止恶意篡改核心API库

相关文章:

JVM的组成

JVM 运行在操作系统之上 java二进制字节码文件的运行环境 JVM的组成部分 java代码在编写完成后编译成字节码文件通过类加载器 来到运行数据区,主要作用是加载字节码到内存 包含 方法区/元空间 堆 程序计数器,虚拟机栈,本地方法栈等等 随后来到执行引擎,主要作用是翻译字…...

快速上手 iOS Protocol Buffer

快速上手 iOS Protocol Buffer | 来自缤纷多彩的灰 本文主要介绍在 iOS 开发中如何快速上手使用 Protobuf。更多关于 Protobuf 的介绍和相关的功能 api,读者可自行查阅官网。 Protocol Buffer(简称 Protobuf)是一种由Google开发的语言中立、…...

每天一个数据分析题(四百八十)- 线性回归建模

关于线性回归建模,线性回归模型假设说法不正确的是? A. 因变量和自变量要有因果关系 B. 残差均值为0 C. 残差服从正态分布 D. 自变量不存在共线性 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专…...

电动汽车和混动汽车DC-DC转换器的创新设计与测试方法

汽车 DC-DC 转换器市场规模将达到187亿美元,年复合增长率为10%。 DC-DC 转换器是汽车的重要组成部分,它可以通过电压转换为各种车载系统供电,例如日益复杂的车载信息娱乐系统、使用驾驶辅助系统(ADAS)实现的增强安全功…...

OriginPro快速上手指南:数据可视化与分析的利器

目录 OriginLab - Origin and OriginPro - Data Analysis and Graphing Softwarehttps://www.originlab.com/​编辑 一、安装与界面概览 安装 界面概览 二、基础操作 数据输入 创建图表 三、高级功能 数据分析 自动化与脚本 Origin 提供了几个小工具 四、技巧与提示…...

缓存学习

缓存基本概念 概念 对于缓存,最普遍的理解是能让打开某些页面速度更快的工具。从技术角度来看,其本质上是因为缓存是基于内存建立的,而内存的读写速度相比之于硬盘快了xx倍,因此用内存来代替硬盘作为读写的介质当然能大大提高访…...

亚世光电:消费电子年度表演

机圈风云再起,消费电子乘风而起? 今天我们来聊——亚世光电 最近,华为mate60突然降价,被大家怀疑是为新品上市做准备,算算时间,下半年的消费电子大战也即将拉开帷幕,而亚世光电所在的光电显示领…...

AI 工程应用 建筑表面检测及修复

文章目录 1 项目概述(必写):2 技术方案与实施步骤2.1 模型选择(必写):2.2 数据的构建:2.3 功能整合(进阶): 3 实施步骤:3.1 环境搭建(…...

Qt-Qt中的小事项(7)

目录 命名风格 快捷键 查询文档 坐标系 代码理解 move 命名风格 这个也是老生常谈的问题了,入乡随俗就好啦 快捷键 这里是一些常用的快捷键,用多了自然就熟悉了 • 注释:ctrl/ • 运行:ctrlR • 编译:ctrlB …...

Android MediaRecorder 视频录制及报错解决

目录 一、start failed: -19 二、使用MediaRecorder录制视频 2.1 申请权限 2.2 布局文件 2.3 MediaRecordActivity 2.4 运行结果 三、拓展 3.1 录制视频模糊(解决) 3.2 阿里云OSS上传文件 3.2.1 权限(刚需) 3.2.2 安装SDK 3.2.3 使用 相关链接 一、start failed…...

HarmonyOS应用程序访问控制探究

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 一、引言 随着信息技术的飞速发展,移动应用程序已经成为…...

董卫民赴考拉悠然等企业调研,强调加快发展人工智能产业

8月14日,按照省政府重点产业链协同推进机制有关工作安排,省委常委、常务副省长董卫民在成都市调研人工智能产业发展情况,并召开座谈会。他强调,要坚决落实党的二十届三中全会精神和省委省政府决策部署,充分把握人工智能…...

MFC将类A中的事件在类B中处理采用回调函数实现

需求: 在类A的界面上有一个tab控件。tab控件上面有那个页面。在MFC编程中一个tab的一个页面就应该是一个新的类。在tab的一个页面上有一个list控件。现在需要将list控件的点击事件,双击事件等在类A里面处理。 解决: 在类B里面给控件list添加…...

公众号 微信登录

export function getWxCode(that, localhostUrl) { // localhostUrl 当前页面的路径 传这个也可以this.$route.fullPath// console.log(that.$store.state.wxSessionData)// console.log(that.$store.state.wxSessionData.openId)//openId为undefine执行获取openid判断是否没有…...

sanic + webSocket:股票实时行情推送服务实现

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…...

Unity动态给按钮各个状态下的图片赋值

Unity动态给按钮各个状态下的图片赋值 using UnityEngine; using UnityEngine.UI; public class ButtonOnClickTest : MonoBehaviour {public Button btn;public Sprite _highlighterSprite;public Sprite _pressedSprite;public Sprite _selectesdSprite;public Sprite _disa…...

xiaomi pad 6PRO 小米平板6 pro hyperOS降级 澎湃os 降级MIUI 14 教程 免解锁BL 降级,168小时解锁绑定

小米平板 6 Pro 机型代号 :liuqin 降级MIUI 14 小米澎湃 OS 正式版 澎湃OS安卓发布日期卡刷包线刷包OS1.0.7.0.UMYCNXM14.02024-07-13miui_LIUQIN_OS1.0.7.0.UMYCNXM_d618a5c980_14.0.zipliuqin_images_OS1.0.7.0.UMYCNXM_20240705.0000.00_14.0_cn_8cbf5920be.…...

MySQL 备份一个表

语法(创建一个与table1结构相同的新表table2,并且将table1的数据复制到table2): create table table2 as select * from table1 举例(备份tb_log表到tb_log_20240815中去): create table tb_log_20240815 as select * from tb_log...

鸿蒙开发入门day10-组件导航

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,还请三连支持一波哇ヾ(@^∇^@)ノ) 目录 组件导航 (Navigation) 设置页面显示模式 设置标题栏模式 设置菜…...

虚拟机Linux的坑 | VMware无法从主机向虚拟机 跨系统复制粘贴拖动 文件/文本

这个情况下,还是没办法跨系统拖拽文件 解决办法: 在终端中输入命令 sudo apt-get autoremove open-vm-tools sudo apt-get install open-vm-tools sudo apt-get install open-vm-tools-desktop过程中只要需要选择是否覆盖的地方,都输入&…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

Linux-进程间的通信

1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...