JVM虚拟机篇(三):JVM运行时数据区与方法区详解
JVM虚拟机篇(三):JVM运行时数据区与方法区详解
- JVM虚拟机篇(三):JVM运行时数据区与方法区详解
- 一、引言
- 二、JVM运行时数据区
- 2.1 概述
- 2.2 各部分的作用与交互
- 2.2.1 堆与其他区域的关系
- 2.2.2 方法区与其他区域的交互
- 2.2.3 Java栈与本地方法栈
- 2.2.4 程序计数器与Java栈
- 三、方法区
- 3.1 概述
- 3.2 常量池
- 3.2.1 常量池的定义与作用
- 3.2.2 常量池的分类
- 3.2.3 常量池示例分析
- 3.3 运行时常量池
- 3.3.1 运行时常量池的动态特性
- 3.3.2 运行时常量池与方法调用
- 3.3.3 运行时常量池的内存管理
- 四、方法区的其他重要内容
- 4.1 类的元数据存储
- 4.2 静态变量与类的初始化
- 4.3 即时编译器编译后的代码缓存
- 五、总结
JVM虚拟机篇(三):JVM运行时数据区与方法区详解
一、引言
Java虚拟机(JVM)作为Java语言的核心运行环境,其内部的运行时数据区是程序运行过程中数据存储和管理的关键所在。而方法区作为运行时数据区的重要组成部分,承载着类的元数据等关键信息,对Java程序的执行起着至关重要的作用。深入了解JVM运行时数据区的结构以及方法区的具体细节,对于Java开发者理解程序的运行机制、优化代码性能以及排查问题都有着深远的意义。接下来,我们将详细探讨这两个主题。
二、JVM运行时数据区
2.1 概述
JVM运行时数据区是JVM在执行Java程序时管理内存的核心区域,它被划分为多个不同的部分,每个部分都有其特定的用途和生命周期。根据《Java虚拟机规范》,运行时数据区主要包括以下几个部分:
- 堆(Heap):是JVM中最大的一块内存区域,被所有线程共享。几乎所有的对象实例和数组都在堆上分配内存。堆可以进一步细分为新生代和老年代,新生代又包含伊甸园区(Eden Space)、幸存0区(Survivor 0 Space)和幸存1区(Survivor 1 Space)。对象优先在伊甸园区分配,当伊甸园区空间不足时,会触发Minor GC(新生代垃圾回收),将存活的对象移动到幸存区,经过多次GC后,若对象仍然存活,会被晋升到老年代。堆的大小可以通过JVM参数(如
-Xmx
设置最大堆大小,-Xms
设置初始堆大小)进行调整。 - 方法区(Method Area):也是被所有线程共享的区域,用于存储已被加载的类的元数据信息(如类的结构信息、常量池、静态变量、即时编译器编译后的代码缓存等)。在Java 8之前,方法区的实现是永久代(PermGen),从Java 8开始,使用元空间(Meta - Space)来替代永久代。元空间使用本地内存,其大小不再受限于
-XX:MaxPermSize
参数,而是受限于系统的可用内存。 - Java栈(Java Stack):是线程私有的区域,它描述的是Java方法执行的内存模型。每个方法在执行时都会创建一个栈帧(Stack Frame),栈帧中存储了局部变量表、操作数栈、动态链接、方法返回地址等信息。当方法被调用时,对应的栈帧入栈,方法执行完毕后,栈帧出栈。Java栈的大小可以通过
-Xss
参数进行设置。 - 本地方法栈(Native Method Stack):与Java栈类似,也是线程私有的,主要用于支持Native方法的执行。当Java程序调用Native方法(通常是用C或C++编写的本地代码)时,会在本地方法栈中创建相应的栈帧来管理方法的执行。
- 程序计数器(Program Counter Register):同样是线程私有的,它记录了当前线程所执行的字节码指令的地址(行号)。在多线程环境下,每个线程都有自己独立的程序计数器,以保证线程切换时能够继续正确地执行。
2.2 各部分的作用与交互
2.2.1 堆与其他区域的关系
堆是对象存储的主要场所,当Java程序创建对象时,会在堆中分配内存。例如,在执行Object obj = new Object();
这样的语句时,JVM会在堆中为Object
实例分配空间。方法区中存储的类元数据信息决定了对象的结构和行为,当在堆中创建对象时,会依据方法区中类的定义来分配相应的内存并进行初始化。
Java栈中的局部变量表可能会引用堆中的对象。比如在一个方法中定义Object obj = new Object();
,这里的obj
变量存储在栈帧的局部变量表中,它指向堆中实际创建的Object
对象。当方法执行结束,栈帧出栈,但堆中的对象并不会立即被回收,只有当没有任何引用指向该对象时,才会被垃圾回收器回收。
2.2.2 方法区与其他区域的交互
方法区存储的类元数据是JVM执行字节码指令的重要依据。当JVM加载一个类时,会将类的元数据信息存储在方法区中。在执行方法时,Java栈中的栈帧会通过动态链接从方法区中获取类的方法信息,确定要执行的方法字节码指令。
例如,当调用一个类的方法时,栈帧中的动态链接会根据方法的符号引用,在方法区中查找对应的方法实现。同时,方法区中的常量池也会被Java栈中的指令引用,如在执行System.out.println("Hello");
时,"Hello"
这个字符串常量会从方法区的常量池中获取。
2.2.3 Java栈与本地方法栈
Java栈用于管理Java方法的执行,而本地方法栈用于管理Native方法的执行。当Java方法调用Native方法时,会从Java栈切换到本地方法栈。例如,在Java程序中通过JNI(Java Native Interface)调用一个C语言编写的本地方法时,JVM会在本地方法栈中创建相应的栈帧来管理该本地方法的执行,当本地方法执行完毕后,再切换回Java栈继续执行后续的Java方法。
2.2.4 程序计数器与Java栈
程序计数器记录了当前线程在Java栈中执行的字节码指令地址。当线程执行Java方法时,每执行一条字节码指令,程序计数器就会递增指向下一条指令。如果遇到方法调用等跳转指令,程序计数器会根据指令的要求调整指向的地址。在多线程环境下,线程切换时,程序计数器会保存当前线程的执行位置,以便在该线程再次被调度执行时能够从正确的位置继续执行。
三、方法区
3.1 概述
方法区是JVM运行时数据区中一个非常重要的部分,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据。方法区在逻辑上是堆的一部分,但为了便于管理和区分,将其单独划分出来。
在Java的发展历程中,方法区的实现经历了一些变化。在Java 8之前,方法区的实现是永久代(PermGen),永久代有固定的内存大小限制,通过-XX:MaxPermSize
参数来设置。然而,这种方式存在一些问题,如内存大小难以准确预估,容易出现java.lang.OutOfMemoryError: PermGen space
错误,并且类加载回收困难等。从Java 8开始,引入了元空间(Meta - Space)来替代永久代,元空间使用本地内存,其大小不再受限于固定的参数,而是仅受系统可用内存的限制,这在很大程度上缓解了内存管理方面的压力。
3.2 常量池
3.2.1 常量池的定义与作用
常量池是方法区中的一个重要组成部分,它用于存放编译期生成的各种字面量和符号引用。字面量包括文本字符串、被声明为final的常量值等;符号引用则包括类和接口的全限定名、字段的名称和描述符、方法的名称和描述符等。
常量池的作用主要体现在以下几个方面:
- 节省内存空间:对于一些重复出现的字面量,如字符串常量,在常量池中只存储一份,多个地方引用时指向同一个常量池中的对象,避免了重复存储,节省了内存空间。例如,在多个地方使用
"Hello"
字符串,它们都指向常量池中的同一个"Hello"
字符串对象。 - 支持符号解析:在类加载和方法调用等过程中,需要根据符号引用在常量池中查找对应的实际类、字段或方法信息,进行符号解析。例如,在方法调用时,通过方法的符号引用在常量池中找到方法的具体实现信息,然后进行调用。
3.2.2 常量池的分类
- Class文件常量池:在Class文件中,有一个专门的区域用于存储常量池信息。它是在编译阶段生成的,包含了类中定义的各种常量以及符号引用等信息。当JVM加载Class文件时,会将Class文件常量池中的内容加载到方法区的常量池中。
- 运行时常量池:运行时常量池是方法区常量池在运行时的表现形式。它在类加载过程中被创建和初始化,除了包含从Class文件常量池加载过来的内容外,还可能在运行时动态地添加一些常量。例如,通过
String.intern()
方法可以将字符串对象添加到运行时常量池中。
3.2.3 常量池示例分析
假设有以下Java代码:
public class ConstantPoolExample {public static final int CONSTANT_VALUE = 10;public static final String HELLO_WORLD = "Hello, World!";public void printHello() {System.out.println(HELLO_WORLD);}
}
在编译后的Class文件中,常量池会记录CONSTANT_VALUE
的值为10,HELLO_WORLD
字符串常量以及printHello
方法的符号引用等信息。当JVM加载ConstantPoolExample
类时,这些信息会被加载到方法区的运行时常量池中。在执行printHello
方法时,System.out.println(HELLO_WORLD)
语句会通过常量池中的HELLO_WORLD
符号引用找到对应的字符串对象,并进行输出。
3.3 运行时常量池
3.3.1 运行时常量池的动态特性
运行时常量池不仅仅是加载Class文件常量池中的内容,它还具有动态性。在程序运行过程中,可以向运行时常量池中添加新的常量。例如,对于字符串常量,当调用String.intern()
方法时,如果字符串常量在运行时常量池中不存在,就会将该字符串对象添加到运行时常量池中。
String str1 = new String("hello");
String str2 = str1.intern();
在上述代码中,str1
是在堆中创建的一个String
对象,当调用str1.intern()
时,会检查运行时常量池中是否存在"hello"
字符串常量,如果不存在,则将str1
所指向的字符串对象添加到运行时常量池中,并返回该对象的引用给str2
。
3.3.2 运行时常量池与方法调用
在方法调用过程中,运行时常量池起着关键作用。当一个方法被调用时,JVM首先会根据方法的符号引用在运行时常量池中查找对应的方法信息。例如,对于Object obj = new Object(); obj.toString();
这样的代码,在调用toString
方法时,JVM会通过obj
的类信息在运行时常量池中找到Object
类的toString
方法的具体实现,然后进行调用。
3.3.3 运行时常量池的内存管理
运行时常量池位于方法区中,在Java 8之前,由于方法区是通过永久代实现的,可能会出现永久代内存不足的问题,导致运行时常量池相关的内存溢出错误。从Java 8开始,使用元空间替代永久代,运行时常量池的内存管理得到了优化,只要系统有足够的本地内存,一般不会出现因运行时常量池导致的内存溢出问题。但在一些极端情况下,如不断地向运行时常量池中添加大量的常量,仍然可能会耗尽系统内存资源,因此在开发中也需要注意合理使用运行时常量池。
四、方法区的其他重要内容
4.1 类的元数据存储
方法区存储了类的元数据信息,这些信息包括类的全限定名、父类的全限定名、实现的接口列表、字段信息(字段名、字段类型、修饰符等)、方法信息(方法名、方法参数列表、返回值类型、修饰符等)。这些元数据是JVM执行字节码指令的重要依据,例如在执行方法调用指令时,JVM会根据方法区中类的元数据信息找到对应的方法字节码并执行。
4.2 静态变量与类的初始化
方法区中还存储了类的静态变量。静态变量属于类本身,而不是类的实例,它们在类加载的准备阶段会被分配内存并设置默认初始值,在初始化阶段会被赋予实际的初始值。例如:
public class StaticVariableExample {public static int staticVariable = 10;static {staticVariable = 20;}
}
在类加载的准备阶段,staticVariable
会被初始化为0,在初始化阶段,执行静态代码块,staticVariable
会被赋值为20。
4.3 即时编译器编译后的代码缓存
JVM的即时编译器(JIT)会将热点代码(被频繁执行的代码)编译成机器码,编译后的代码缓存也存储在方法区中。这样在后续执行时可以直接执行编译后的机器码,提高执行效率。例如,对于一个被频繁调用的方法,JIT编译器会将其编译成机器码并存储在方法区的代码缓存中,下次调用该方法时,就可以直接执行机器码,避免了再次解释执行字节码的开销。
五、总结
JVM运行时数据区是Java程序运行的核心内存区域,其各个组成部分相互协作,共同保障了程序的正常执行。而方法区作为其中存储类元数据等关键信息的部分,对于Java程序的运行起着至关重要的作用。常量池和运行时常量池在存储常量、支持符号解析以及方法调用等方面都有着不可或缺的地位。
深入理解JVM运行时数据区和方法区的原理,有助于我们在开发过程中更好地进行性能优化,避免内存相关的问题。例如,合理设置堆和方法区的大小参数,可以提高程序的运行效率;了解常量池的机制,可以避免不必要的内存浪费。随着Java技术的不断发展,JVM也在持续演进,我们需要不断学习和关注其新特性和新变化,以更好地应用Java进行软件开发。希望通过本文的介绍,读者能够对JVM运行时数据区和方法区有一个全面、深入的认识。
相关文章:
JVM虚拟机篇(三):JVM运行时数据区与方法区详解
JVM虚拟机篇(三):JVM运行时数据区与方法区详解 JVM虚拟机篇(三):JVM运行时数据区与方法区详解一、引言二、JVM运行时数据区2.1 概述2.2 各部分的作用与交互2.2.1 堆与其他区域的关系2.2.2 方法区与其他区域…...
Rust学习日记:编写一个Python扩展
参考https://segmentfault.com/a/1190000044555330 命令行创建一个新的Rust项目cargo new --lib rust_python_ext 配置Cargo.toml [package] name "rust_python_ext" version "0.1.0" edition "2024"[lib] name "rust_python_ext"…...
Pod的调度
在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上&…...
系统思考:思考的快与慢
在做重大决策之前,什么原因一定要补充碳水化合物?人类的大脑其实有两套运作模式:系统1:自动驾驶模式,依赖直觉,反应快但易出错;系统2:手动驾驶模式,理性严谨,…...
[ 计算机网络 ] | HTTP协议(一)
目录 前置知识: URL URL的URLENCODE和URLDECODE HTTP协议的宏观格式 如何保证报文是完整的?怎么做序列,反序列化的? 前置知识: URL 我们把数据给别人,别人把数据给我们,不是在做IO嘛~&am…...
大模型快速 ASGI 服务器uvicorn
基础概念类 1. 什么是 Uvicorn,它的作用是什么? 答案:Uvicorn 是一个基于 Python 的快速 ASGI(异步服务器网关接口)服务器。它的主要作用是作为 Web 应用程序的服务器,负责接收客户端的请求,并…...
android studio 基础
1.android Module not specified 今天做一个实验时出现:Android Studio Run/Debug configuration error: Module not specified,要想解决这个问题: 1、打开根目录的 settings.gradle,删除 include :exampleapp 2、在 Android Stu…...
python爬虫爬取淘宝热销(热门)零食商品加数据清洗、销量、店铺及词云数据分析_源码及相关说明文档;售后可私博主
TOC 如有侵权,联系删除 一、环境说明 使用前必须检查以下环境 (1)python编译环境 (2)python脚本执行所需要的库,具体看代码(main.py)import导入的部分库 (3)确保电脑可…...
Android /proc/meminfo解释
高通8295设备 msmnile_gvmq:/proc # cat meminfo MemTotal: 16433968 kB MemFree: 7709832 kB…...
VScode 玩 MCP的server
vscode 1.99版本刚支持MCP server,我就测试了一下 翻到一个gitte的MCP sever 我本身是Mac版本1.99居然没更新agent,所以我就直接用1.100版本的vscode inside了来掩饰一下了 点击setting,然后你要edit一下这个json配置文件 主要修改的其实是…...
详解 MySQL 索引的最左前缀匹配原则
MySQL 的最左前缀匹配原则主要是针对复合索引(也称为联合索引)而言的。其核心思想是:只有查询条件中包含索引最左侧(第一列)开始的连续一段列,才能让 MySQL 有效地利用该索引。 一、 复合索引的结构 复合…...
ROS Master多设备连接
Bash Shell Shell是位于用户与操作系统内核之间的桥梁,当用户在终端敲入命令后,这些输入首先会进入内核中的tty子系统,TTY子系统负责捕获并处理终端的输入输出流,确保数据正确无误的在终端和系统内核之中。Shell在此过程不仅仅是…...
【Mysql】数据库备份与恢复
一、备份类型 物理备份:直接对数据库的数据文件、日志文件、索引文件进行备份 逻辑备份:对数据库对象(库、表)以SQL语句的形式导出进行备份 二、备份工具 1、使用tar、gzip等方式压缩打包数据库文件(完全备份、物理冷…...
Java HttpURLConnection修仙指南:从萌新到HTTP请求大能的渡劫手册
一、筑基篇:初识HttpURLConnection 1.1 基础开光(创建连接) URL url new URL("https://api.example.com/data"); HttpURLConnection conn (HttpURLConnection) url.openConnection(); // 注意!此处可能抛出Malforme…...
python 重要易忘 语言基础
Collections 1、Counter 计数器 counter:计数器 类似字典 统计可迭代对象中元素的出现次数, Counter({b: 3, c: 2, a: 1, d: 1}) 相当于字典{b: 3, c: 2, a: 1, d: 1} a.items() 取键值对 对应为dict_items([(a, 1), (b, 3), (c, 2), (d, 1)]) 也可以是 list(a.items…...
【新能源汽车研发测试数据深度分析:从传感器到智能决策的硬核方法论】
摘要: 本文系统性解构新能源汽车(NEV)研发测试中的数据采集、处理及分析全链条,覆盖传感器融合、大数据清洗、AI算法优化等核心技术,并引入行业顶级案例(如特斯拉Autopilot验证、宁德时代BMS算法迭代&#…...
GD32H759IMT6 Cortex-M7 OpenHarmony轻量系统移植——接管中断修改为不接管
笔者在去年利用国庆时间,将Cortex-M7 的国产厂商兆易创新GD32H459移植OpenHarmony轻量系统,但是适配不太完善——只能选择liteos-m接管中断。这样导致使用中断非常麻烦。于是笔者最近将接管中断模式修改为不接管,这样可以方便的使用gd32提供的…...
MySQL基础学习笔记
学习笔记 1. 基础小知识1.1 数据库分类1.2 下载安装、变量配置过程(略)1.3 连接命令1.4 连接mysql服务端的软件选择1.4.1 要求不高的话,选择有很多1.4.2 适合做企业级管理的工具(适合团队协作)1.4.3 总结 1.5 编程语言…...
[Linux]进程状态、僵尸进程处理回收、进程优先级 + 图例展示
目录 一、进程状态 1.一般操作系统学科的进程状态 二、Linux操作系统的进程状态 运行状态(R) 睡眠状态(S) 深度睡眠状态(D) 暂停状态(T) 追踪暂停状态&#x…...
2022 年 6 月青少年软编等考 C 语言七级真题解析
目录 T1. 有多少种二叉树思路分析T2. 城堡问题T3. 快速堆猪思路分析T4. 重建二叉树思路分析T1. 有多少种二叉树 题目链接:SOJ D1189 输入 n ( 1 < n < 13 ) n\ (1<n<13) n (1<n<13),求 n n n 个结点的二叉树有多少种形态? 思路分析 此题考查 C a…...
flutter修改 Container 中的 Text 和 Image 的样式
在Flutter中,Container 是一个常用的布局组件,它可以包含子组件(如文本、图片等),并允许你通过设置各种属性来自定义样式。如果你需要修改 Container 中的 Text 和 Image 的样式,可以通过以下方式实现。 1.…...
零基础入门unity游戏开发——动画篇】Animation动画窗口,创建编辑动画
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、…...
【设计模式】命令模式
简介 假设你有一个智能家居遥控器,上面有多个按钮,每个按钮对应不同的设备操作(如开灯、关灯、调空调温度)。 命令模式的解决方案是: 将每个操作(如“开灯”)封装成一个独立的命令对象&#x…...
Python作业3 字符田字格绘制
字符田字格绘制:编写程序,用字符方式打印输出一个简单的田字格,要求采用函数方式,以田字格宽度为参数,能够根据参数绘制任意大小的田字格。 def draw(n):line 3 * n 1for i in range(1, line 1):if i % 3 1:print(n * " —— —— ", end"&quo…...
文章记单词 | 第23篇(六级)
一,单词释义 occupy /ˈɒkjupaɪ/v. 占用,占领,使忙碌thermal /ˈθɜːml/adj. 热的,热量的,保暖的;n. 热气流persistent /pəˈsɪstənt/adj. 执着的,坚持不懈的,持续存在的wee…...
【算法】滑动窗口
什么是滑动窗口算法? 滑动窗口算法本质上就是双指针的一种情况,当两个指针进行移动的方向是同一个方向,并且这两个指针并不会向后回退,一直是往一个方向进行移动的。这也就是滑动窗口的使用场景。 滑动窗口算法的一般步骤 进窗…...
可视化工具
在PyTorch中,可视化工具对于模型调试、性能分析和结果解释至关重要。以下是常用的可视化工具及其应用场景: 1. 训练过程监控 TensorBoard (PyTorch官方集成) 用途:跟踪训练指标(损失、准确率)、可视化模型结构、分析…...
hashtable遍历的方法有哪些
在 Java 中,遍历 Hashtable(或其现代替代品 HashMap)有多种方式,以下是 6 种常用方法的详细说明和代码示例: 1. 使用 keySet() 增强 for 循环 Hashtable<String, Integer> table new Hashtable<>(); // …...
LeetCode --- 443周赛
题目列表 Q1. 到达每个位置的最小费用 Q2. 子字符串连接后的最长回文串 I Q3. 子字符串连接后的最长回文串 II Q4. 使 K 个子数组内元素相等的最少操作数 一、到达每个位置的最小费用 题目要求返回从队尾到达任意位置的最小费用,规则:如果下标 i i i …...
从零构建大语言模型全栈开发指南:附录与资源-3.面试与进阶-200道大模型面试真题与职业发展路线图-基础理论篇50题
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 附录与资源-3. 面试与进阶:200道大模型面试真题与职业发展路线图一、大模型面试真题分类与解析1. 基础理论篇(50+题精选)2. 进阶实战篇(50+题精选)3. 应用场景篇(70题精选)二、职业发展路线图1. …...
使用Android Studio开发基于Java+xml的安卓app之环境搭建
以下是使用Android Studio搭建基于Java和XML的Android应用开发环境的详细步骤: 一、系统要求 操作系统:Windows 7/8/10/11(64位)内存:建议8GB及以上磁盘空间:至少5GB空闲(建议预留10GB以上&…...
GD32H759IMT6 Cortex-M7 OpenHarmony轻量系统移植——4.1版本升级到5.0.3
笔者在去年利用国庆时间,将Cortex-M7 的国产厂商兆易创新GD32H459移植OpenHarmony轻量系统,但是适配不太完善——只能选择liteos-m接管中断。这样导致使用中断非常麻烦。于是笔者最近将接管中断模式修改为不接管,这样可以方便的使用gd32提供的…...
学习汇编随手记
学习汇编随手记 前言 本笔记是关于王爽汇编的笔记,覆盖不全,到了内中断就完结了,听从学长建议,我跑去学xv6了,x86告辞。 1. 寄存器 1.1 寄存器初步 (A,B,C,D)X是通用寄存器,通常存放一般性数据&#x…...
打造高效英文单词记忆系统:基于Python的实现与分析
在当今全球化的世界中,掌握一门外语已成为必不可少的技能。对于许多学习者来说,记忆大量的英文单词是一个漫长而艰难的过程。为了提高学习效率,我们开发了一个基于Python的英文单词记忆系统。这个系统结合了数据管理、复习计划、学习统计和测试练习等多个模块,旨在为用户提…...
【漫话机器学习系列】182.噪声修正线性单元(Noisy ReLU)
噪声修正线性单元(Noisy ReLU)详解 1. 引言 在深度学习中,修正线性单元(ReLU, Rectified Linear Unit) 是一种常见的激活函数,具有计算简单、梯度稳定等优点。然而,ReLU 也有一些缺点…...
连续数据离散化与逆离散化策略
数学语言描述: 在区间[a,b]中有一组符合某分布的数据: 1.求相同区间中另一组符合同样分布的数据与这组数据的均方误差 2.求区间中点与数据的均方误差 3.求在区间中均匀分布的一组数据与这组数据的均方误差 一:同分布数据随机映射 假设在…...
《安富莱嵌入式周报》第352期:手持开源终端,基于参数阵列的定向扬声器,炫酷ASCII播放器,PCB电阻箱,支持1Ω到500KΩ,Pebble智能手表代码重构
周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版 https://www.bilibili.com/video/BV1DEf3YiEqE/ 《安富莱嵌入式周报》第352期:手持开源终端&#x…...
游戏引擎学习第205天
回顾 我们今天要实现的是一些实体浏览功能,原本是昨天就计划好的,但因为渲染上的一些问题耽搁了一些时间。 实际上,我们遇到的并不是一个真正的bug,尽管我们花了大约40分钟才搞清楚,最终发现它只是渲染方式的一个正常…...
Boost库搜索引擎项目(版本1)
Boost库搜索引擎 项目开源地址 Github:https://github.com/H0308/BoostSearchingEngine Gitee:https://gitee.com/EPSDA/BoostSearchingEngine 版本声明 当前为最初版本,后续会根据其他内容对当前项目进行修改,具体见后续版本…...
复古千禧Y2风格霓虹发光酸性镀铬金属短片音乐视频文字标题动画AE/PR模板
踏入时光机,重温 21 世纪初大胆、未来主义和超光彩的美学!这是一个动态的 After Effects 模板,旨在重现千禧年的标志性视觉效果——铬反射、霓虹灯发光、闪亮的金属和流畅的动态图形。无论您是在制作时尚宣传片、怀旧音乐视频还是时尚的社交媒…...
如何高效使用 Ubuntu 中文官方网站
Ubuntu 中文官方网站 一、快速导航与核心模块 首页焦点区 顶部菜单栏:快速访问「下载」「文档」「支持」「商店」等核心功能。轮播图区:展示最新版本(如 Ubuntu 24.04 LTS)和特色功能(如 Ubuntu Pro 订阅服务)。搜索框:支持中文关键词搜索(如 "边缘计算"),…...
简单多状态dp问题 + 总结(一)
文章目录 按摩师题解代码 打家劫舍II题解代码 删除并获得点数题解代码 粉刷房子题解代码 按摩师 题目链接 题解 1. 细节处理:题目是有没有客人的时候,所有n等于零时返回零 2. 状态表示:到达i位置时的最长预约时长 3. 状态转移方程…...
2022 CCF CSP-S2.假期计划
题目 4732. 假期计划 算法标签: 搜索, 枚举, 贪心 思路 最多转车 k k k次等价于路线长度小于等于 k 1 k 1 k1, 经过的点没有限制, 注意到点的数量 2500 2500 2500, 因此 n 2 n ^ 2 n2的时间复杂度是可以考虑的, 边的数量 10000 10000 10000, n m n \times m nm时间复杂…...
STM32低功耗模式详解:睡眠、停机、待机模式原理与实践(下) | 零基础入门STM32第九十三步
主题内容教学目的/扩展视频低功耗模式什么是低功耗,模式介绍,切换方法。为电池设备开发做准备。 师从洋桃电子,杜洋老师 📑文章目录 一、低功耗模式基本工作原理1.1 功耗层级对比1.2 工作流程 二、睡眠模式实践2.1 测试程序解析2.…...
【Docker】在Orin Nano上使用Docker
1、安装Docker 1)使用 SDKManager 烧写系统时,选择NVIDIA Container Runtime,将会安装Docker, 并将 NVIDIA GPU 暴露给容器中的应用程序,这样可以在Docker中使用GPU等NVIDIA的特性。 2)使用命令安装 添加源 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \…...
C# 程序脱壳,去除强签名StrongNameRemove
由于.net程序的运行机制,利用Reflector,ilspy等反射工具很容易就能看到原代码。很多程序都做了代码混淆,加壳。代码混淆后反编译乱码,不容易理解;加壳使反编译工具不能正常反射,提示无效的程序集。 需要做…...
【mongodb】mongodb和MySQL体系结构的对比
目录 1. 说明2. 数据存储模型2.1 MySQL2.2 MongoDB 3. 扩展性3.1 MySQL3.2 MongoDB 4. 查询语言4.1 MySQL4.2 MongoDB 5. 索引和性能5.1 MySQL5.2 MongoDB 6. 一致性模型6.1 MySQL6.2 MongoDB 7. 架构组件7.1 MySQL7.2 MongoDB 8. 使用场景7.1 MySQL7.2 MongoDB 9. 总结对比表 …...
【深度学习新浪潮】视觉与多模态大模型文字生成技术研究进展与产品实践
一、研究进展 跨模态架构创新 原生多模态模型:微软KOSMOS系列通过统一框架支持文本、图像、语音等多模态输入输出,实现跨模态推理与迁移。例如,KOSMOS-2.5可处理文本密集图像,生成结构化文本描述,并通过重采样模块优化视觉与语言的对齐。混合专家架构:第三代模型(如Deep…...
麒麟系统桌面版本v10安装教程
下载地址 共享文件下载 - Kylin Distro 虚拟机安装教程 选择默认兼容 内核数量选择2个 内存给2g 存储为单个文件的话,占用你内存大,多个文件的话,用多少就占多少内存 打开虚拟机 开机 补充 安装来源 Live 安装:通过镜像文件进行…...
Python-文件操作
1. 文件操作基础 1.1 打开文件 在Python中使用open()函数来打开文件: file open(example.txt, r) # 以只读模式打开文件文件打开模式: r - 只读(默认)w - 写入,会覆盖已有文件a - 追加,写入到文件末尾…...