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

JVM的深入理解

1、JVM(Java虚拟机):我们java编译时候,下通过把avac把.java文件转换成.class文件(字节码文件),之后我们通过jvm把字节码文件转换成对应的cpu能识别的机器指令(翻译官角色),我们发布一个Java程序,我们只需要发布.class文件即可,不同平台上的jvm是有差异的,对java提供的内容是一致的,但是对不同的操作系统来说是可能不一致的

一、JVM中的内存区域划分

1、jvm其实也是一个进程(任务管理器中看到的java进程),进程运行过程中要从操作系统这里申请一些资源(内存就是其中典型的资源),JVM从系统中申请了一大块内存,这一大块内存给Java程序使用的时候,又根据实际的使用用途划分出不同的空间

(1)堆:代码中new出来的对象,都是在堆里,对象中持有的非静态成员变量,也就是在堆里

(2)栈:本地方法栈(jvm内部的调用关系和局部变量)/虚拟机栈(java代码的调用关系和局部变量)包含了方法的调用关系和局部变量(一般不会关注本地方法栈,默认只得是虚拟机栈)此处中的堆和栈和数据结构中的堆和栈是不一样的

(3)程序计数器:这个区域比较小的空间,专门用来存储下一条要执行的java指令地址

(4)元数据区(以前叫方法区):往往只的是一些辅助性质的,描述性质的属性(例如:文件大小,文件的位置等,这些信息成为元数据)最主要的是保存类的信息,方法的信息,一个程序有哪些类,每个类里有哪些方法,每个方法里面要包含哪些指令,我们写的Java代码if,while,for各种逻辑运算都会被转换成字节码,最后将这些字节码存储到元数据区中,接下来就会按照上述元数据区里记录的字节码依次执行了,带有static变量的就是在类对象中,就存储在元数据区中

(5)堆只有一份,元数据区只有一份,栈和程序计数器可能由N份(每个线程都有自己的栈和程序计数器)

2、JVM的类加载机制

1、类加载指的是Java进程运行的时候,需要把.class文件从硬盘读到内存,并进行一系列的校验和解析的过程(从.class文件到类对象,从硬盘到内存)类加载分5步

(1)加载:把硬盘上的.class文件找到打开文件,读取到文件内容(认为读到的是二进制数据)

(2)验证:确保读到的文件内容是合法的.class文件(字节码文件)格式

(3)准备:给类对象申请内存空间(空间内什么都没有,是默认值全是零)

(4)解析:主要是针对类中的字符串常量进行处理,字符引用转换成直接引用:比如要存储字符串s=“hello”

因为文件中不存在地址这样的概念,地址是内存的地址但是我们这里是硬盘,所以我们需要用偏移量(这就叫符号引用)来找到文件中的hello,之后我们转换到内存上是此时就有地址(直接引用)了就不需要再用偏移量了

(5)初始化:针对类对象完成后续的初始化(还需要执行讲台代码的逻辑,还可能出发父类的加载)

3、双亲委派模型(描述了如何查找.class文件的策略)

1、JVM中进行类加载操作,是有一个专门的模块,称为“类加载器”,类加载器的作用,给他一个全限定类名,java.lang.String给定全限定类名之后找到对应的.class文件,下面是三类加载器,实际上类加载器只是一个父亲,也可以叫单亲

如果最后ApplicationClassLoader没有找到,因为ApplicationClassLoader没有孩子最后就会抛出ClassNotFoundException异常

(1)这样的操作也避免了我们自己写了类与标准类名重复,导致标准库类的功能失效

(2)我们也可以自己写类加载器,此时就不会涉及到双亲委派了

4、垃圾回收机制(GC)(避免内存泄漏问题)

(1)垃圾回收中有一个很重要的问题:STW问题,出发垃圾回收的时候,很可能会是当前程序和其他业务暂停,JAVA现在已经可以把STW的时间控制在1ms之内,影响就很小了

(2)垃圾回收是回收内存,程序计数器和栈不需要GC他们可以自行释放内存,元数据区一般不需要GC一般涉及到类加载,很少涉及到类卸载,堆是主要的GC区域(主要的就是回收对象)

4.1、垃圾回收我们要分两部展开:

(1)识别出垃圾(1.1-1.4)

(2)把标记为垃圾的对象的内存空间进行释放(2.1-)

识别出垃圾:

(1.1)在Java中,适用对象都需要通过引用的方式来使用(匿名对象是例外)

如果一个对象没有任何引用指向他,就是为无法被代码使用,就可以作为垃圾了

简单情况:

(1.2)

当我们局部变量t执行完,也就没有引用指向new Test()了此时new Test()就被认定成垃圾了

较复杂的情况(1.3)(1.4):

(1.3)引用计数:这种思想方法,并没有在JVM中使用,但是他的思想我们需要了解(给对象安排一个额外的空间,空间里要保存当前这个对象有多少个引用)

垃圾回收的时候,如果发现他的引用计数器为0了就定义为垃圾

引用计数器存在两个关键问题:

1)消耗额外的内存空间

2)引用计数可能产生循环引用问题,此时引用计数就无法工作了,这个问题就是可能会两个对象在内部分别对对方进行引用,导致计数器一直不为零

(1.4)可达性分析:本质上使用时间换空间,相比于引用计数,需要消耗额外的时间,是可控的,不会长生循环引用的问题,例如二叉树那样遍历访问,访问不到的就是垃圾

(2.1)把标记为垃圾的对象进行内存空间的释放

(2.2)标记-清除

(2.3)复制算法

将左边不是垃圾的对象复制到内存的另一边(内存碎片问题没了,但是使用的空间小了,而且如果数据很多复制两会很大,会增加很多开销)

(2.4)标记-整理,也能解决内存碎片问题

将后面的元素往前移将释放的垃圾覆盖掉,能解决内存碎片问题,但是移动复制成本依然很大

(2.5)分代回收(取长补短,非常好的回收方式,现在应用的 )

引入对象的年龄,JVM中有专门负责周期想扫面的线程,一个对象扫描一次,能扫描到就不是垃圾,年龄加1,不能扫描到就直接释放掉

第一轮扫描在伊甸区会有很多对象被消灭掉,剩下的线程年龄加1,转移到生存区,第二轮扫描伊甸区和上一轮一样,生存区左边扫描去掉大部分剩下的年龄加1转移到生存区的右边,如果经过若干轮的对象仍然健在,之后我们就转移到老年区,老年区不是不扫描,老年区的扫描频率会降低很多,如果扫描到为引用的对象直接也消灭掉掉

相关文章:

JVM的深入理解

1、JVM(Java虚拟机):我们java编译时候,下通过把avac把.java文件转换成.class文件(字节码文件),之后我们通过jvm把字节码文件转换成对应的cpu能识别的机器指令(翻译官角色&#xff09…...

JavaWeb——007MYSQL(DQL多表设计)

# 数据库开发-MySQL 一级目录二级目录三级目录 1. 数据库操作-DQL1.1 介绍1.2 语法1.3 基本查询1.4 条件查询1.5 聚合函数1.6 分组查询1.7 排序查询1.8 分页查询1.9 案例1.9.1 案例一1.9.2 案例二 2. 多表设计2.1 一对多2.1.1 表设计2.1.2 外键约束 2.2 一对一2.3 多对多2.4 案…...

深度学习500问——Chapter01:数学基础

文章目录 前言 1.1 向量和矩阵 1.1.1 标量、向量、矩阵、张量之间的联系 1.1.2 张量与矩阵的区别 1.1.3 矩阵和向量相乘结果 1.1.4 向量和矩阵的范数归纳 1.1.5 如何判断一个矩阵为正定 1.2 导数和偏导数 1.2.1 导数偏导计算 1.2.2 导数和偏导数有什么区别 1.3 特征值和特征向量…...

day03_登录注销(前端接入登录,异常处理, 图片验证码,获取用户信息接口,退出功能)

文章目录 1. 前端接入登录1.1 修改前端代码1.2 跨域请求1.2.1 跨域请求简介1.2.2 COSR概述CORS简介CORS原理 1.2.3 CORS解决跨域 2. 异常处理2.1 提示空消息分析2.2 系统异常分类2.3 异常处理2.2.1 方案一2.2.2 方案二 3. 图片验证码3.1 图片验证码意义3.2 实现思路3.3 后端接口…...

k8s初始化报错 [ERROR CRI]: container runtime is not running: ......

一、环境参数 linux系统为centos7kubernetes版本为v1.28.2containerd版本为1.6.28 二、报错内容 执行初始化命令kubeadm init命令时报错,内容如下 error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR CRI]: container runtime is…...

vscode windows 免密登录 powershell.sh

Linux 生成秘钥 ssh-keygenwindows powershell.sh $HOST_IP"zhang192.168.1.1" $PUBPATH"$HOME\.ssh\id_rsa.pub" $KEY(Get-Content "$PUBPATH" | Out-String); ssh "$HOST_IP" "mkdir -p ~/.ssh && chmod 700 ~/.ssh …...

10 种3D 建模技术

在本文中,我将列出 10 种不同类型的 3D 建模。也许可以了解下一个项目将走向何方,或者你可能会像我一样惊讶,究竟有多少 3D 被用作以多种方式进行可视化的工具。这些是我们将讨论和探索的建模类型: 盒子造型多边形建模Nurbs 和曲…...

常见的socket函数封装和多进程和多线程实现服务器并发

常见的socket函数封装和多进程和多线程实现服务器并发 1.常见的socket函数封装2.多进程和多线程实现服务器的并发2.1多进程服务器2.2多线程服务器2.3运行效果 1.常见的socket函数封装 accept函数或者read函数是阻塞函数,会被信号打断,我们不能让它停止&a…...

Tomcat架构分析

Tomcat的核心组件 Tomcat将请求器和处理器分离,使用多种请求器支持不同的网络协议,而处理器只有一个。从而网络协议和容器解耦。 Tomcat的容器 Host:Tomcat提供多个域名的服务,其将每个域名都视为一个虚拟的主机,在…...

旧项目集成阿里云滑动验证码(web和H5方式)

简述 旧项目集成阿里云滑动验证码(web和H5方式) 适用于servlet和HTML项目,VUE + springboot请看另一篇文档 前情提示 系统: 一说 部分截图、链接等因过期、更换域名、MD语法等可能不显示,可联系反馈(备注好博文地址),谢谢❤带有​​#号、删除线、不操作、不执行​…...

机器人内部传感器阅读梳理及心得-速度传感器-数字式速度传感器

在机器人控制系统中,增量式编码器既可以作为位置传感器测量关节相对位置,又可作为速度传感器测量关节速度。当作为速度传感器时,既可以在模拟量方式下使用,又可以在数字量方式下使用。 模拟式方法 在这种方式下,需要…...

【vue+element ui】大屏自适应中el-select下拉内容在低分辨率下显示不全问题解决

目录 背景 现象 解决方案 背景 最近要把一个1920px*1080px的大屏改成自适应的;最低适配到1028px*720px; 现象 自适应适配改完之后 将电脑屏幕改成1028px*720px分辨率后,下拉显示正常 通过谷歌浏览器设置Toggle device toolbar为1028px*…...

前端架构: 脚手架之多package项目管理和架构

多package项目管理 1 )多package项目管理概述 通常来说,当一个项目变大了以后,我们就要对这个项目进行拆分在前端当中,对于项目进行拆分的方式,通常把它称之为javascript包管理需要使用一个工具叫做 npm (Node Packag…...

【C# 多线程】如何停止正在运行中的子线程

如何停止正在运行中的子线程 通过协作式取消模式强制终止线程(可能存在资源不能及时释放的泄漏风险) 通过协作式取消模式 在线程函数中,你可以周期性地检查一个标志位,以确定是否应该停止线程。该标记位可以是共享变量&#xff0…...

服务器机房安全守护:五大物理安全实践

服务器机房是数字企业的心脏。无论是企业家还是经验丰富的IT专业人员,都知道服务器机房的安全性至关重要。如果没有采用适当的物理安全措施,其服务器很容易受到盗窃、人为破坏和自然灾害的破坏。 在保护服务器机房的领域内,需要采用多方面的…...

spring boot 修复 Spring Framework URL解析不当漏洞(CVE-2024-22243)

漏洞描述 当应用程序使用UriComponentsBuilder来解析外部提供的URL&#xff08;如通过查询参数&#xff09;并对解析的URL的主机执行验证检查时可能容易受到Open重定向攻击和SSRF攻击&#xff0c;导致网络钓鱼和内部网络探测等。 受影响产品或系统 6.1.0 < Spring Framew…...

VR全景HDR拍摄教程

什么是HDR&#xff1f; HDR可以用在哪里&#xff1f; 书面解释&#xff1a;HDR&#xff08;高动态范围 High Dynamic Range&#xff09;摄影&#xff0c;是摄影领域广泛使用的一种技术。 是不是有点懵&#xff1f; 我们来看一个实际的拍摄现场环境&#xff0c;你就懂了 我们…...

hive执行select count(1)返回0

背景&#xff1a; 做数据质量检核任务的时候&#xff0c;有些数据表有数据&#xff0c;直接查hive执行select count(1) from table返回的值一直是0 问题原因&#xff1a; hive通过select count(1)或者select count(*) 查询的是元数据库里面的rownum,如果数据表数据是通过load、…...

3D Gaussian splatting 协方差矩阵 球谐函数 简单理解

3D Gaussian splatting 是一种图形和视觉处理技术&#xff0c;常用于体积渲染、点云渲染和其他应用中&#xff0c;以便对数据进行平滑或重建。在这个上下文中&#xff0c;高斯分布&#xff08;或高斯“splat”&#xff09;用于表示单个数据点&#xff08;如一个点云中的点&…...

代码随想录算法刷题训练营day27:LeetCode(39)组合总和、LeetCode(40)组合总和 II、LeetCode(131)分割回文串

代码随想录算法刷题训练营day27&#xff1a;LeetCode(39)组合总和、LeetCode(40)组合总和 II、LeetCode(131)分割回文串 LeetCode(39)组合总和 题目 代码 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List;clas…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...