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

深入探究Java内存模型

文章目录

  • 🌟 Java虚拟机内存模型
    • 🍊 一、方法区
    • 🍊 二、堆
      • 🎉 堆的基本概念
      • 🎉 堆的结构
        • 📝 新生代
        • 📝 老年代
      • 🎉 堆的分配策略
        • 📝 对象优先分配
        • 📝 空间优先分配
      • 🎉 堆的性能调优
    • 🍊 三、Java虚拟机栈
      • 🎉 栈帧的创建过程
      • 🎉 局部变量表
      • 🎉 操作数栈
      • 🎉 动态链接
      • 🎉 方法出口
      • 🎉 线程信息
      • 🎉 栈帧的销毁过程
    • 🍊 四、本地方法栈
    • 🍊 五、程序计数器

📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。🌎跑过十五公里、徒步爬过衡山、🔥有过三个月减肥20斤的经历、是个喜欢躺平的狠人。

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、Spring MVC、SpringCould、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RockerMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。🎥有从0到1的高并发项目经验,利用弹性伸缩、负载均衡、报警任务、自启动脚本,最高压测过200台机器,有着丰富的项目调优经验。

📙经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续在明年出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码–沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!

以梦为马,不负韶华

希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

  • 💂 博客主页: 我是廖志伟
  • 👉开源项目:java_wxid
  • 🌥 哔哩哔哩:我是廖志伟
  • 🎏个人社区:幕后大佬
  • 🔖个人微信号SeniorRD

💡在这个美好的时刻,本人不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

CSDN
深入探究Java内存模型

🌟 Java虚拟机内存模型

Java虚拟机(JVM)是一种能够在不同平台上运行Java程序的虚拟机。JVM内部有一个内存模型,用于管理其内部的内存分配。JVM内存模型可以分为以下五个部分:

🍊 一、方法区

方法区也被称为永久代(Permanent Generation),是Java虚拟机用于存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据的区域。它是虚拟机规范中的一部分,属于非堆内存。在JDK1.8之前,方法区是使用永久代实现的,而JDK1.8之后则使用元空间(Metaspace)来代替永久代,将方法区移到了本地内存中。

在Java虚拟机中,有一种名为“即时编译器”的技术,它可以将Java字节码转换为本地机器代码,并将这些代码存储在方法区中。一些框架,如Spring、MyBatis等,需要进行反射等操作,这些操作会用到通过类加载器加载的类信息和一些常量,而这些信息会存储在方法区中。

方法区中存储的数据包括:

  • 已加载类的类型信息,包括类的元数据(如类的访问修饰符、父类、实现的接口、字段、方法等)和类的静态变量。
  • 常量池(Constant Pool):常量池是类加载后存储在方法区的一段内存空间,用于存储编译器生成的各种字面量和符号引用。
  • 即时编译器编译后的字节码:将Java字节码转换为本地机器代码,并将这些代码存储在方法区中。
  • 字符串常量池:存储Java字符串常量。

由于方法区存储的是不可变的数据,容易出现内存泄漏的情况。特别是在使用自定义类加载器时,如果频繁进行类的加载和卸载操作,就有可能导致方法区中的数据越来越多,最终导致内存泄漏。

在JDK1.8之前,方法区使用永久代实现,其大小是固定的且无法回收的,因此容易导致过度内存占用。即使在JDK1.8之后,方法区使用元空间代替永久代,但在默认情况下,元空间也是没有大小限制的,因此仍可能导致过度内存占用。

由于方法区存储的数据通常都是不可变的,因此垃圾回收器在进行垃圾回收时需要扫描大量的无用数据,导致GC效率低下。

为了避免方法区带来的问题,可以采取以下优化手段:

  • 设置方法区最大值:可以通过JVM启动参数来进行控制方法区的大小,包括最小值、最大值、初始值。当方法区达到最大值时,JVM会发生OOM(Out Of Memory)错误。

  • 使用内存泄漏检测工具:在使用自定义类加载器时,可以采用内存泄漏检测工具来检测是否存在内存泄漏问题。

  • 对不需要的类进行卸载:在加载某个类时,可以根据需要选择是否卸载该类。当某个类不再被需要时,可以手动将其卸载,从而避免方法区中的数据越来越多,导致过度内存占用和GC效率低下。

  • 调整元空间大小:在JDK1.8之后,可以使用元空间代替永久代,将方法区移到了本地内存中。可以通过JVM启动参数来控制元空间的大小,从而避免过度内存占用。

  • 使用弱引用:在使用动态语言和代码生成技术时,可以使用弱引用来避免内存泄漏问题。当某个对象不再被使用时,弱引用会自动将其清除。

🍊 二、堆

🎉 堆的基本概念

堆是Java虚拟机运行时数据区之一,用于存储对象实例。堆是在JVM启动时创建,并且在JVM关闭时才会被销毁,堆的大小可以通过-Xmx参数控制。堆的大小不足会导致OutOfMemoryError,而堆的过大会导致GC时间过长,影响程序的实际性能。

🎉 堆的结构

堆由不同的区域构成:新生代、老年代。新生代由Eden区和Survivor0区、Survivor1区组成。

📝 新生代

新生代是堆的一部分,用于存放新创建的对象。新生代中的对象生命周期短暂,一般很快就会被回收掉。新生代分为Eden区和Survivor0区、Survivor1区。其中,Eden区用于存放新创建的对象,Survivor0区和Survivor1区用于存放经过一次Minor GC后仍然存活的对象。一块Eden区和两块Survivor区比例是8:1:1。

在新生代,每个对象都有一个年龄计数器。当对象在Eden区中被创建时,年龄计数器初始化为0,每经过一次Minor GC年龄计数器的值就会加1。当年龄计数器的值达到一定阈值时,对象将会被晋升到老年代中。晋升到老年代中的对象将会在进行Full GC时被回收。

📝 老年代

老年代是堆的一部分,用于存放存活时间较长的对象。老年代中的对象生命周期较长,一般不会被频繁回收。老年代中的对象在进行Full GC时才会被回收。

🎉 堆的分配策略

堆的分配策略包括两种:对象优先分配和空间优先分配。

📝 对象优先分配

对象优先分配是JVM默认的分配策略,它将新创建的对象分配到Eden区中,如果Eden区空间不足,就会触发Minor GC。在Minor GC时,经过垃圾回收后,如果对象还存活,就会被移动到Survivor0区或Survivor1区中,如果Survivor0区或Survivor1区空间不足,就会触发Minor GC。当对象在Survivor0区或Survivor1区中经过一定次数的垃圾回收后仍然存活,就会被晋升到老年代中。

📝 空间优先分配

空间优先分配是指JVM将新创建的对象分配到空间使用率较低的区域中。通常情况下,空间使用率较低的区域是老年代。在空间使用率较低的情况下,空间优先分配策略可以减少垃圾回收的次数,从而提高程序的性能。

🎉 堆的性能调优

堆的性能调优是Java程序优化的重要部分,主要包括以下几个方面:

  • 堆的大小调优:堆的大小直接影响程序的性能,需要根据实际情况对堆的大小进行调优。
  • 新生代和老年代的分配比例:新生代和老年代的分配比例也影响程序的性能,通常情况下,新生代占总堆大小的1/3到1/4比较合适。
  • 垃圾回收算法的选择:垃圾回收算法的选择也影响程序的性能,需要根据实际情况选择合适的垃圾回收算法。

总的来说,堆是Java虚拟机运行时数据区之一,用于存储对象实例。堆的大小和分配策略对程序的性能有着至关重要的影响。因此,需要根据实际情况对堆进行性能调优,以提高程序的效率和性能。

🍊 三、Java虚拟机栈

栈帧是Java虚拟机执行Java程序的基本单元。在Java程序中,每个方法被调用时,都会为该方法创建一个栈帧。栈帧包括了局部变量表、操作数栈、动态链接、方法出口和线程信息等。当方法执行完成时,栈帧会被销毁。Java虚拟机通过栈帧的入栈和出栈来管理Java程序的方法调用过程。在栈帧的执行过程中,Java虚拟机可以实现动态查找和链接,从而实现了Java程序的跨平台执行。

🎉 栈帧的创建过程

当Java程序调用一个方法时,虚拟机会根据方法的描述信息,为该方法创建一个栈帧。栈帧包括了局部变量表、操作数栈、动态链接、方法出口等信息。Java虚拟机栈将该栈帧入栈,使得该栈帧成为当前栈帧。从而,被调用方法开始执行。

🎉 局部变量表

局部变量表是用于存放方法参数和局部变量的。在栈帧被创建的时候,局部变量表就会被分配空间。局部变量表的大小在编译期间就已经确定了,但是其所需的大小在运行时才能确定。因此,在方法运行之前,Java虚拟机需要根据局部变量表的大小来分配栈帧所需的内存空间。局部变量表所需的内存空间取决于方法所需的局部变量的数量。

🎉 操作数栈

操作数栈是一个后进先出的栈,用于存放方法所有的中间结果。它是栈帧的一个重要组成部分,在方法执行过程中,任何操作都必须通过操作数栈来完成。当方法被调用时,操作数栈是空的。在方法执行过程中,操作数栈中的元素会因为方法中的操作而被推入或弹出。当方法执行完成时,操作数栈被清除,而栈帧也随之出栈。

🎉 动态链接

动态链接是在编译期无法确定的方法调用跳转。在Java虚拟机中,每个栈帧都有一个指向它所属的类的指针,称为类指针(Class Pointer)。在Java虚拟机中,方法的调用通常是通过一个符号引用来实现的。符号引用包括了方法的名字、返回值类型和参数列表的描述符。当Java虚拟机遇到一个符号引用时,它会通过该符号引用查找对应的方法。这个查找过程就称为动态链接。这种动态查找和链接的方式,是Java虚拟机实现跨平台的一种技术手段。如果在查找过程中发现方法没有找到,虚拟机会抛出NoSuchMethodError错误。

🎉 方法出口

方法出口是一个指向方法调用者的返回地址的指针。当一个方法被调用时,方法出口会被压入操作数栈中。当方法执行完成时,该方法的返回值会被压入操作数栈中,返回地址也会从栈中弹出到程序计数器(PC)中,使程序继续执行。

🎉 线程信息

Java程序中的线程是轻量级的执行单元。Java虚拟机会为每个线程分配一个Java虚拟机栈,每个栈由多个栈帧组成。每个线程在运行时,都有一个栈帧作为当前栈帧。每个栈帧包括了线程所需的局部变量表、操作数栈、动态链接、方法出口和线程信息等。线程信息包括了线程的ID、线程名、线程状态等信息。

🎉 栈帧的销毁过程

栈帧的销毁是指栈帧从虚拟机中出栈的过程。当方法执行完成时,Java虚拟机会将该方法的栈帧出栈,并将方法的返回值压入方法调用者的操作数栈中。当方法调用者继续执行时,它会弹出被调用方法的返回值。这个过程就完成了栈帧的销毁。

🍊 四、本地方法栈

本地方法栈是Java虚拟机中的一个重要组成部分,是Java程序中调用的本地方法所使用的内存区域,也是线程私有的。在Java虚拟机栈中,栈帧保存的是Java方法的状态,而在本地方法栈中,栈帧保存的是本地方法(Native Method)的状态。本地方法是Java程序中调用本地库(Native Library)的接口,也就是通过JNI(Java Native Interface)调用外部的C/C++等本地代码,在这种情况下,Java虚拟机就需要提供一片内存区域来支持本地方法的执行。

本地方法栈的空间大小也是可以通过JVM启动参数来控制的,参数为-Xss。默认情况下,64位JVM的本地方法栈大小为1MB,32位JVM的本地方法栈大小为320KB。当本地方法栈空间不足时,会发生StackOverflowError;当本地方法栈空间无法继续扩展时,会发生OutOfMemoryError。

本地方法栈与Java虚拟机栈的区别在于,Java虚拟机栈保存的是Java方法的状态,而本地方法栈保存的是本地方法的状态。另外,Java虚拟机栈是由JVM自动管理的,包括分配和释放;而本地方法栈则是由本地方法本身负责管理的。在调用本地方法之前,JVM需要将本地方法的参数传递给本地方法,参数传递的方式和C语言类似,有寄存器传递和栈传递两种方式。当本地方法执行完毕后,JVM需要将本地方法的返回值传递回Java程序中,返回值传递的方式同样有寄存器传递和栈传递两种方式。

本地方法栈的创建和销毁与方法调用的进入和返回有关,在Java程序调用本地方法时,JVM会检查是否已经加载了本地方法所在的本地库,并确保本地库已经正确地链接到JVM中。然后,JVM会创建一个新的本地方法栈,并将本地方法的参数复制到本地方法栈中,本地方法开始执行。当本地方法执行完毕并返回时,JVM会将返回值复制回到Java程序中,然后销毁本地方法栈,继续执行Java程序中的其他代码。

本地方法栈在Java程序中的使用相对较少,通常是在需要调用本地库的情况下才使用本地方法栈。如果本地方法栈的空间不足,可以通过增加JVM的栈空间来解决。但是,在实际开发中,我们应该尽量避免使用本地方法,因为本地方法容易引起内存泄漏和安全问题,同时本地方法的跨平台性也比较差。

🍊 五、程序计数器

程序计数器是JVM中的一块较小内存区域,主要用于记录当前线程运行的字节码指令地址,也就是下一条要执行的指令在代码中的位置。JVM中所有线程都有一个独立的程序计数器,它是线程私有的,不会被其他线程访问。

程序计数器的作用是在多线程环境下保证线程切换后能恢复到正确的执行位置。当线程被中断或被抢占时,程序计数器记录了断点的位置,下次恢复时就可以从这个位置继续执行。线程执行Java代码时,程序计数器记录的是当前执行的字节码行数。

除了恢复现场,程序计数器还有一个作用就是支持代码的解释执行。字节码解释器按照程序计数器中的地址,从方法字节码中依次获取指令并执行。如果执行的是Java方法,则程序计数器记录的是该线程当前执行的Java方法地址,如果执行的是本地方法,则程序计数器记录的是undefined。

当线程调用了本地方法时,程序计数器保存的是undefined,当返回到Java方法时,程序计数器会恢复到该方法的指令地址。Java虚拟机规范要求程序计数器是线程私有的,每个线程独立维护。这种设计方案在一定程度上简化了线程上下文切换的操作。

程序计数器的大小是固定的,不会发生OOM错误。对于32位JVM来说,程序计数器的最大值是2的32次方,也就是4GB。对于64位JVM来说,程序计数器的最大值是2的64次方,也就是18EB(Exabytes),完全无需考虑OOM的问题。

程序计数器是JVM中非常重要的一个概念,它是实现Java虚拟机线程安全的关键所在。虽然它的作用看起来比较简单,但是却不可少。程序计数器负责记录线程下一条执行的指令,遇到中断或者线程切换时能够恢复到正确的执行位置,从而保证线程的正确性和安全性。

CSDN

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

  • 💂 博客主页: 我是廖志伟
  • 👉开源项目:java_wxid
  • 🌥 哔哩哔哩:我是廖志伟
  • 🎏个人社区:幕后大佬
  • 🔖个人微信号SeniorRD

📥博主的人生感悟和目标

探寻内心世界,博主分享人生感悟与未来目标

  • 🍋程序开发这条路不能停,停下来容易被淘汰掉,吃不了自律的苦,就要受平庸的罪,持续的能力才能带来持续的自信。我本身是一个很普通程序员,放在人堆里,除了与生俱来的盛世美颜,就剩180的大高个了,就是我这样的一个人,默默写博文也有好多年了。
  • 📺有句老话说的好,牛逼之前都是傻逼式的坚持,希望自己可以通过大量的作品、时间的积累、个人魅力、运气、时机,可以打造属于自己的技术影响力。
  • 💥内心起伏不定,我时而激动,时而沉思。我希望自己能成为一个综合性人才,具备技术、业务和管理方面的精湛技能。我想成为产品架构路线的总设计师,团队的指挥者,技术团队的中流砥柱,企业战略和资本规划的实战专家。
  • 🎉这个目标的实现需要不懈的努力和持续的成长,但我必须努力追求。因为我知道,只有成为这样的人才,我才能在职业生涯中不断前进并为企业的发展带来真正的价值。在这个不断变化的时代,我必须随时准备好迎接挑战,不断学习和探索新的领域,才能不断地向前推进。我坚信,只要我不断努力,我一定会达到自己的目标。

相关文章:

深入探究Java内存模型

文章目录 🌟 Java虚拟机内存模型🍊 一、方法区🍊 二、堆🎉 堆的基本概念🎉 堆的结构📝 新生代📝 老年代 🎉 堆的分配策略📝 对象优先分配📝 空间优先分配 &am…...

深度学习 | Pytorch深度学习实践 (Chapter 10、11 CNN)

十、CNN 卷积神经网络 基础篇 首先引入 —— 二维卷积:卷积层保留原空间信息关键:判断输入输出的维度大小特征提取:卷积层、下采样分类器:全连接 引例:RGB图像(栅格图像) 首先,老师…...

谈谈你对spring boot 3.0的理解

谈谈你对spring boot 3.0的理解 一,Spring Boot 3.0 的兼容性 Spring Boot 3.0 在兼容性方面做出了很大的努力,以支持存量项目和老项目。尽管如此,仍需注意以下几点: Java 版本要求:Spring Boot 3.0 要求使用 Java 1…...

【大数据】Hadoop

文章目录 概述Hadoop组成HDFSMapReduce写MapReduce程序(Hadoop streaming) YARNHadoop 启动 工作方式Hadoop的主从工作方式Hadoop的守护进程 运行模式本地运行模式伪分布式运行模式完全分布式运行模式 Hadoop高可用的解决方案ZooKeeper quorumZKFC 环境搭…...

Spring实例化源码解析之Bean的实例化(十二)

前言 本章开始分析finishBeanFactoryInitialization(beanFactory)方法,直译过来就是完成Bean工厂的初始化,这中间就是非lazy单例Bean的实例化流程。ConversionService在第十章已经提前分析了。重点就是最后一句,我们的bean实例化分析就从这里…...

git常用的几条命令介绍

必须了解的命令整理 1,git init 初始化一个新的Git仓库。 这将在当前目录中创建一个名为".git"的子目录,Git会将所有仓库的元数据存储在其中。 2,git clone 克隆一个已存在的仓库。 这会创建一个本地仓库的副本,包…...

使用VisualSVN在Windows系统上设置SVN服务器,并结合内网穿透实现公网访问

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写,是一个开放源代码的版本控制系统…...

第18章 SpringCloud生态(三)

18.21 Nacos能存储什么样格式的数据(配置中心) 难度:★ 重点:★ 白话解析 看下面这副Nacos控制台的截图就明白了 参考答案 六种格式数据:Text、JSON、XML、Yaml、HTML和Properties格式。 18.22 Nacos是如何实现配置动态更新的(配置中心) 难度:★★ 重点:★★★ 白话…...

leetcode:2347. 最好的扑克手牌(python3解法)

难度:简单 给你一个整数数组 ranks 和一个字符数组 suit 。你有 5 张扑克牌,第 i 张牌大小为 ranks[i] ,花色为 suits[i] 。 下述是从好到坏你可能持有的 手牌类型 : "Flush":同花,五张相同花色的…...

2007-2022 年上市公司国内外专利授权情况数据

2007-2022 年上市公司国内外专利授权情况 1、来源:国家知识产权局 2、时间:2007-2022 年 3、范围:上市公司 4、指标: 证券代码、年份、省份、城市、行业代码、授权地区、申请类型、专利、发明专利、实用新型、外观设计 5、…...

安全渗透测试网络基础知识之路由技术

#1.静态路由技术 ##1.1路由技术种类: 静态路由技术、动态路由技术 ##1.2静态路由原理 静态路由是网络中一种手动配置的路由方式,用于指定数据包在网络中的传输路径。与动态路由协议不同,静态路由需要管理员手动配置路由表,指定目的网络和下一跳路由器的关联关系。 比较适合…...

【大数据】Kafka 实战教程(二)

Kafka 实战教程(二) 1.下载2.安装3.配置4.运行4.1 启动 Zookeeper4.2 启动 Kafka 5.第一个消息5.1 创建一个 Topic5.2 创建一个消息消费者5.3 创建一个消息生产者 1.下载 你可以在 Kafka 官网:http://kafka.apache.org/downloads&#xff0c…...

React 框架

1、React 框架简介 1.1、介绍 CS 与 BS结合:像 React,Vue 此类框架,转移了部分服务器的功能到客户端。将CS 和 BS 加以结合。客户端只用请求一次服务器,服务器就将所有js代码返回给客户端,所有交互类操作都不再依赖服…...

数据结构与算法之图: Leetcode 133. 克隆图 (Typescript版)

克隆图 https://leetcode.cn/problems/clone-graph/description/ 描述 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[No…...

illuminate/database 使用 一

illuminate/database 是完整的php数据库工具包,即ORM(Object-Relational Mapping)类库。 提供丰富的查询构造器,和多个驱动的服务。作为Laravel的数据库层使用,也可以单独使用。 一 使用 加载composer之后&#xff…...

前端koa搭建服务器(保姆级教程)——part1

目录 koa简介前端项目搭建koa环境第一步:新建项目第二步:环境初始化,安装依赖初始化项目,生成package.json文件安装koa依赖安装koa-router 路由管理依赖安装dotenv 环境变量依赖安装nodemon 热启动依赖 第三步:代码调用…...

js逆向第一课 密码学介绍

什么是密码学? 密码学(Cryptology)是一种用来混淆的技术,它希望将正常的、可识别的信息转变为无法识别的信息。 目前密码学的研究,一种是偏应用,把现有的,别人研究出来的密码学算法,放在一个合…...

Dynamic DataSource 多数据源配置【 Springboot + DataSource + MyBatis Plus + Druid】

一、前言 MybatisPlus多数据源配置主要解决的是多数据库连接和切换的问题。在一些大型应用中,由于数据量的增长或者业务模块的增多,可能需要访问多个数据库。这时,就需要配置多个数据源。 二、Springboot MyBatis Plus 数据源配置 2.1、单数…...

MyBatis:配置文件

MyBatis 前言全局配置文件映射配置文件注 前言 在 MyBatis 中,配置文件分为 全局配置文件(核心配置文件) 和 映射配置文件 。通过这两个配置文件,MyBatis 可以根据需要动态地生成 SQL 语句并执行,同时将结果集转换成 …...

ARM,基础、寄存器

1.认识ARM 1)是一家公司 2)做RISC处理器内核 3)不生产芯片 2.ARM处理器的最新发展(重要) 高端产品线: cortex-A9 主要做音视频开发,例如:手机 平板..... 中端产品线:cortex-R 主要做实时性要求比较高的系统 例如&#…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求&#xff…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率&#xff0c…...