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

JVM速成=。=

JVM跨平台原理

跨平台:一次编译,到处运行
本质:不同操作系统上运行的JVM不一样,只需要把java程序编译成一份字节码文件,JVM执行不同的字节码文件。

在这里插入图片描述
Java是高级语言,提前编译一下(变成字节码文件),再执行起来就会快一点

很多高级语言,都可以编译成字节码格式。字节码可以到不同平台上运行,这也体现的字节码的跨平台效果。在这里插入图片描述

JVM整体结构

在这里插入图片描述

解释器:执行方法区中存储的字节码指令
垃圾回收器:回收垃圾对象
JIT编译器:处理一些热点的字节码指令。【字节码里可能存在一些热点指令,这些热点指令翻译过一次,就把他们缓存起来,下一次再执行热点指令,就去缓存中取。从而提高执行效率】
方法区:类加载子系统把字节码加载到方法区中
:执行过程中产生的对象
Java方法栈:当前线程执行到某个java里的方法,就会放入这里
本地方法栈:当前线程执行native方法,就会放入这里(用Java语言以外的语言编写的方法)
程序计数器:记录下一条指令的地址

类加载子系统

在这里插入图片描述

  1. 加载:把字节码文件,加载到方法区的内存空间中。

  2. 链接:(static int i = 10)

  • 验证:检查字节码文件的格式
  • 准备:先给i变量赋值为0(先赋值0
  • 解析:将符号引用解析为直接引用

符号引用可以理解为类的名字(一般由包名 + 类名确定一个类)
直接引用可以理解为这个类在方法区中对应的地址
符号引用解析为直接引用:类的名字解析为这个类在方法区对应的地址

  1. 初始化:给类里边的static属性赋值(后赋值为10

类加载器的分类

在这里插入图片描述

  1. 引导类加载器(BootStrapClassLoader)(用c++写的)
  2. 自定义类加载器(继承自ExtClassLoader 或 AppClassLoader)

ExtClassLoader 和 AppClassLoader都继承自ClassLoader类
BootStrapClassLoader:加载jre/lib目录下的类
ExtClassLoader:jre/lib/ext目录下的类
AppClassLoader:classpath(自己指定的)类加载的路径
WebAppClassLoader:Tomcat自定义的类加载器

双亲委派

作用:避免类的重复加载,防止核心API被篡改
在这里插入图片描述

当加载一个类的时候,先从应用加载器加载,这个时候应用加载器会在已加载过的库里面查看是否加载过该类,如果没有就往上调,使用父加载器,也就是扩展类加载器来加载。

  1. 先判断当前类是否被加载过
  2. 被加载过,直接返回
  3. 没有被加载过,
    • 查看AppClassLoader对象的parent属性是否为空,
    • 如果不为空,直接用parent属性加载(AppClassLoader对象的parent属性就是ExtClassLoader的对象)
    • 如果为空,则利用BootStrapClassLoader加载
      • BootStrapClassLoader如果加载到,就直接结束
      • 如果加载不到,返回ExtClassLoader,如果还是加载不到,就退回AppClassLoader,由它自己去加载当前类。

为什么Tomcat要自定义类加载器?

为了进行类的隔离,如果tomcat直接使用AppClassLoader类加载器,那么会出现以下情况:

  1. 应用A中有个com.xiaolin.Hello.class
  2. 应用B中也有个com.xiaolin.Hello.class
  3. 虽然都叫Hello.class,但是这两个类的方法、属性可能不一样
  4. 如果AppClassLoader先加载了应用A中的Hello.class文件,那么应用B就不能被加载了,因为这两个类的名字一样
  5. 所以就需要针对应用A、B设置单独的类加载器,也就是WebAppClassLoader,这样两个应用中的Hello.class都会被各自的类加载器加载到,不会产生冲突。

JVM中判断一个类是否被加载到的逻辑:类名 + 对应的类加载器实例

运行时数据区

在这里插入图片描述

方法区、堆区:多个线程共享
Java方法栈、本地方法栈、程序计数器:每个线程都有一个

程序计数器PC

是物理寄存器的抽象实现的,用来记录待执行的下一条指令的地址,是程序控制流的指示器(for、if else…都依赖它完成)。
解释器工作时,就是通过程序计数器获取下一条需要执行新的字节码指令,是JVM规范中没有规定任何OutOfMemoryError情况的区域。

虚拟机栈(Java栈、本地方法栈)

虚拟机栈是线程私有的,一个方法开始执行栈帧入栈,方法执行完后,对应的栈帧就出栈,因此不需要进行垃圾回收。

虚拟机栈存在OutOfMemoryError(内存不够)、StackOverflowError(栈溢出)

  1. 线程太多了,就可能会出现OutOfMemoryError,线程创建时没有足够的空间去创建虚拟机栈了。
  2. 方法调用的层数太多,就可能会出现StackOverflowError
    在这里插入图片描述
    栈帧:
    • 操作数栈:执行字节码指令过程中用来辅助计算的
    • 局部变量表:记录方法里的每个变量的值
      在这里插入图片描述

堆区

在这里插入图片描述
所有的对象和数组都应该存放在堆区,在执行字节码指令的时候,会把创建的对象存入堆区, 对象对应的引用地址放入虚拟机栈的栈帧中。

方法执行完之后,创建的对象不会立马被回收,而是等JVM后台执行GC后,对象才会被回收。

Eden:新对象都会先放入Eden区(除非对象的大小都超过Eden区,那么就放入老年代)
S0:也叫做from区
S1:也叫做to区
S0、S1都是用来存放MinorGC(YGC)后存在的对象
如果一个对象经过15次垃圾回收(YGC)后都没有被回收掉,那么就会被放入老年代里

默认:
新生代 : 老年代 = 1 : 2
Eden : S0区 : S1区 = 8 : 1 : 1

在这里插入图片描述
Yong GC / Minor GC:负责堆新生代进行垃圾回收
Old GC / Major GC:负责堆老年代进行垃圾回收(目前只有CMS垃圾回收器会单独对老年代进行垃圾收集,其他垃圾收集器基本都是整堆回收的时候堆老年代进行垃圾收集)
Full GC:整堆回收,也会对方法区进行垃圾收集

垃圾回收过程

为什么要进行垃圾回收?

垃圾是指在JVM中没有任何指向它的对象,如果不清理这些垃圾,他们就会一直占用内存,而不能给其他对象,最终垃圾对象会越来越多从而出现内存溢出。

如何标记垃圾对象?

  1. 引用计数器:每个对象都保存一个引用计数器属性,用户记录对象被引用的次数。
    • 优点:实现简单,计数为0表示是垃圾对象
    • 缺点:需要额外的空间来存储引用计数,需要额外的时间来维护引用计数,无法处理循环引用的问题
      在这里插入图片描述
  2. 可达性分析法:以GC Root作为起始点,然后一层一层找到所引用的对象,被找到的对象就是存活对象,其他不可达的对象就是垃圾对象。(找到可达对象)
    在这里插入图片描述

GC Root是一组引用,包括:

  • 线程中虚拟机栈 / 本地方法栈中正在执行的方法中的方法参数、局部变量所对应的对象引用
  • 方法区中保存的类的信息中的静态 / 常量属性所对应的对象引用

怎么回收垃圾对象?

  1. 标记 - 清除算法:如果可用内存不够,就会暂停用户线程的执行,然后执行算法进行垃圾回收
    • 标记阶段:从GC Roots开始遍历,找到可达对象,并在对象头中进行标记
    • 清除阶段:堆内存空间进行线性遍历,如果发现对象头中没有记录是可达,就回收他
      在这里插入图片描述

缺点:效率不高,会产生内存碎片
优点:易实现

  1. 复制算法:将内存空间分为两块,每次使用一块,进行垃圾回收时,将可达对象复制到另一块没有使用的内存中,然后再清除当前内存块中的所有对象,后续一直重复上边操作,交换着来。在这里插入图片描述

只遍历一次,如果可达就直接转移。比较适合垃圾对象比较多的场景(复制成本低、例如:新生代)
优点:没有标记和清除阶段,不会出现内存碎片
缺点:

  • 需要更多的内存,始终有一半内存空闲;
  • 对象复制后,对象存放的内存地址发生了变化,需要额外时间修改栈帧中记录的引用地址
  • 可达对象比较多,垃圾对象比较少,复制算法的效率低
  1. 标记 - 整理阶段
    • 标记阶段:标记可达对象
    • 移动阶段:将所有存活的对象移动到内存的一端
    • 整理阶段:清除边界外所有空间
      在这里插入图片描述

总结:
在这里插入图片描述
新生代中的对象存活时间比较短,可以利用复制算法(适合垃圾对象比较多的情况)

老年代中的对象存货时间比较长,可以用标记 - 清除标记 - 整理算法,比如:

  • CMS垃圾收集器采用的就是 标记 - 清除算法
  • Serial Old垃圾收集器采用的就是 标记 - 整理算法

常见的垃圾收集器

在这里插入图片描述

  1. Serial GC(新生代)和 Serial Old GC(老年代):工作线程暂停,只有一个线程进行垃圾回收
  2. Parallel GC(新生代)和 Parallel Old GC(老年代):工作线程暂停,开启多个线程进行垃圾回收
    在这里插入图片描述
  3. CMS GC(老年代):整个收集的过程更长,暂停的时间变短,而且在垃圾收集过程中大部分用户线程也还在执行,所以用户体验更好,但是吞吐量更低(单位时间内执行的用户时间更少了)
    在这里插入图片描述
  • 初始标记:暂停所有工作线程,标记处所有GC Roots能直接可达的对象,标记完后恢复工作线程。(初始标记只找到直接可达对象,不需要找到所有可达对象,只找了一层)
  • 并发标记:垃圾回收线程和用户线程一起工作,垃圾回收线程也会去剩余的可达对象(初始标记中没有找到的可达对象,但是也会存在误差)
  • 重新标记:并发标记阶段可能会产生一些误差,需要进行修正
  • 并发清理:垃圾回收线程和用户线程一起工作,删除垃圾对象(可能新生成的垃圾对象没有被清除掉)
  • 并发重置:重置一下,方便下一次垃圾回收

初始标记、并发标记、重新标记,这三个阶段都是在找垃圾对象,其实最费时的是并发标记阶段,因为这个阶段需要找出大量的垃圾对象,但是在最费时的阶段里,用户线程也在工作。

  1. G1(整堆):
    每一个方块叫做region,堆内存会分为2048个region,还是分成了Eden区、S0区、S1区、老年代,只不过空间是不连续的。
    在这里插入图片描述

Humongous区:专门用来存放大对象(一个对象的大小超过一个region的50%)

在这里插入图片描述

初始标记并发标记最终标记:同CMS
筛选回收:提前设置一个时间t(默认200ms),按照指定这个的时间t来做筛选回收(不一定会回收掉所有的垃圾)

相关文章:

JVM速成=。=

JVM跨平台原理 跨平台:一次编译,到处运行 本质:不同操作系统上运行的JVM不一样,只需要把java程序编译成一份字节码文件,JVM执行不同的字节码文件。 Java是高级语言,提前编译一下(变成字节码文件…...

Packer 手动修复安装腾讯云插件

文章目录 Packer [腾讯云插件文档](https://developer.hashicorp.com/packer/integrations/hashicorp/tencentcloud) 提供的版本:v1.2.0,目前 Packer 构建镜像时,不支持现有2种[硬盘类型](https://www.tencentcloud.com/zh/document/product/…...

学习总结三十

下头论文 # P10605 下头论文 题目背景 莲子一直在苦恼关于论文的灵感。她为此花了太多时间,以至于没有时间理会她的伙伴梅莉。 题目描述 一天,莲子发现了一个绝妙的点子,并希望通过实验等过程将其完善。具体来说,她需要依次完成 n…...

开发完的小程序如何分包

好几次了,终于想起来写个笔记记一下 我最开始并不会给小程序分包,然后我就各种搜,发现讲的基本上都是开发之前的小程序分包,可是我都开发完要发布了,提示我说主包太大需要分包,所以我就不会了。。。 好了…...

Flutter PIP 插件 ---- Android

在 Flutter Android 应用中实现画中画功能 画中画(Picture-in-Picture, PiP)模式允许您的应用在一个固定在屏幕角落的小窗口中运行,同时用户可以与其他应用进行交互。本指南将介绍如何在 Flutter Android 应用中实现画中画功能,包括其局限性和解决方案。 项目地址 flutter_p…...

【20250211】字符串:459.重复的子字符串

#方法一&#xff1a;暴力求解法 # class Solution: # def repeatedSubstringPattern(self, s): # n len(s) # substr "" # #只重复一次不算“重复多次” # if n < 1: # return False # else: # …...

【DeepSeek学Cuda】矩阵转置:行读取优先还是列读取优先。

目录 **1. 实现A&#xff08;按行读取&#xff0c;按列存储&#xff09;2. 实现B&#xff08;按列读取&#xff0c;按行存储&#xff09;**3. 哪种更好 Professional cuda programming5. "当L1缓存被禁用时&#xff0c;所有内存访问都直接指向全局内存&#xff08;Global …...

如何将3DMAX中的3D文件转换为AutoCAD中的2D图形?

大家好,今天我们来探讨一下如何将3DMAX中的3D文件转换为AutoCAD中的2D图形。无论是出于设计交流、施工准备还是其他实际需求,这种转换在工程设计领域都是一项非常实用的技能。接下来,我将为大家详细介绍几种实现这一转换的方法,帮助大家轻松跨越3D与2D设计之间的鸿沟。让我…...

Softhsm储存安全数据性能整理

目标&#xff1a;存储百万条数据对象 测试方案一&#xff1a;总大小2GB&#xff0c;每个数据对象大小约512KB&#xff0c;总条数4096条&#xff1b; 测试方案一&#xff1a;总大小2GB&#xff0c;每个数据对象大小约256B&#xff0c;总条数8388608条&#xff1b; 测试环境&am…...

【C++】——精细化哈希表架构:理论与实践的综合分析

先找出你的能力在哪里&#xff0c;然后再决定你是谁。 —— 塔拉韦斯特弗 《你当像鸟飞往你的山》 目录 1. C 与哈希表&#xff1a;核心概念与引入 2. 哈希表的底层机制&#xff1a;原理与挑战 2.1 核心功能解析&#xff1a;效率与灵活性的平衡 2.2 哈希冲突的本质&#x…...

【cocos creator】拖拽排序列表

DEMO下载 GameCtrl.ts import ItemCtrl from "./ItemCtrl";const { ccclass, property } cc._decorator;ccclass export default class GameCtrl extends cc.Component {property(cc.Node)content: cc.Node null;property(cc.Node)prefab: cc.Node null;arr []…...

b站——《【强化学习】一小时完全入门》学习笔记及代码(1-3 多臂老虎机)

问题陈述 我们有两个多臂老虎机&#xff08;Multi-Armed Bandit&#xff09;&#xff0c;分别称为左边的老虎机和右边的老虎机。每个老虎机的奖励服从不同的正态分布&#xff1a; 左边的老虎机&#xff1a;奖励服从均值为 500&#xff0c;标准差为 50 的正态分布&#xff0c;即…...

【Mac排错】ls: command not found 终端命令失效的解决办法

【TroubleShooting on Mac】ls: command not found 终端命令失效的解决办法 A Solution to Solve “Command not found” of Terminal on Mac 一直在使用心爱的MacBook Pro的Terminal&#xff0c;并且为她定制了不同的Profile。 这样&#xff0c;看起来她可以在不同季节&…...

探秘Hugging Face与DeepSeek:AI开源世界的闪耀双子星

目录 一、引言&#xff1a;AI 开源浪潮的澎湃二、Hugging Face&#xff1a;AI 开源社区的基石&#xff08;一&#xff09;起源与发展历程&#xff08;二&#xff09;核心技术与特色&#xff08;三&#xff09;在 AI 领域的广泛应用 三、DeepSeek&#xff1a;东方崛起的 AI 新势…...

SkyWalking 10.1.0 实战:从零构建全链路监控,解锁微服务性能优化新境界

文章目录 前言一、集成SkyWalking二、SkyWalking使用三、SkyWalking性能剖析四、SkyWalking 告警推送4.1 配置告警规则4.2 配置告警通知地址4.3 下发告警信息4.4 测试告警4.5 慢SQL查询 总结 前言 在传统监控系统中&#xff0c;我们通过进程监控和日志分析来发现系统问题&…...

本地部署DeepSeek-R1(Mac版)

本地部署DeepSeek-R1&#xff08;Mac版&#xff09; 前言&#xff1a;过年这段时间&#xff0c;DeepSeek火遍全球&#xff0c;但遭受黑客攻击&#xff0c;10次对话基本9次都是服务器繁忙&#xff0c;请稍后重试。那么&#xff0c;本地部署整起来 总体来说&#xff0c;本地部署…...

网易易盾接入DeepSeek,数字内容安全“智”理能力全面升级

今年农历新年期间&#xff0c;全球AI领域再度掀起了一波革命性浪潮&#xff0c;国产通用大模型DeepSeek凭借其强大的多场景理解与内容生成能力迅速“出圈”&#xff0c;彻底改写全球人工智能产业的格局。 作为国内领先的数字内容风控服务商&#xff0c;网易易盾一直致力于探索…...

apachePoi中XSSFClientAnchor图片坐标简述;填充多张图片

概述 业务中经常会遇到在单元格内填充图片的需求&#xff0c;而且要求指定图片在单元格内的位置。 一般都是用的apache的poi&#xff0c;设置图片坐标。 HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2)dx1 dy1 起始单元…...

Java、Go、Rust、Node.js 的内存占比及优缺点分析

在选择编程语言进行项目开发时&#xff0c;内存占用是一个重要的考量因素。不同语言在内存管理、垃圾回收、并发模型等方面各有特点&#xff0c;影响着它们的内存使用情况。本文将对 Java、Go、Rust 和 Node.js 的内存占比进行对比&#xff0c;并分析它们的优缺点。 1. Java 的…...

C++智能指针的使用

文章目录 智能指针的使用和原理智能指针的使用场景RAII和智能指针C标准库智能指针的使用 智能指针的使用和原理 智能指针的使用场景 1. 下面的程序中&#xff0c;new了以后&#xff0c;我们也delete了&#xff0c;但是因为抛异常导致后面的delete没有得到执行&#xff0c;所以…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...