Java内存模型和 JVM 内存运行时

文章目录

  • 前言
  • 一、什么是Java 的内存模型?
  • 二、什么是 JVM 的运行时数据区
      • Java8 之前和之后的区别
      • JVM 内存模型
        • JVM 内存区域
        • JVM 内存垃圾回收
        • JVM如何判断哪些对象不在存活?
        • JVM运行过程中如何判断哪些对象是垃圾?
      • JVM 垃圾回收
        • Java8 中的 jvm如何进行垃圾回收?
        • Serial、Parallel、CMS、G1 的工作原理和适用场景
          • Serial 收集器
          • Parallel 收集器
          • CMS 收集器
          • G1 收集器
          • Java8 默认的垃圾收集器为什么不是 G1 ?


前言

当我们提到 Java 的内存模型的时候通常会想到 JVM 运行时候的数据区域,比如包括线程私有的堆,方法区,线程共享的有本地方法栈,虚拟机栈,程序计数器。Java程序启动后,就会初始化这些内存的数据。但是这就是 Java 的内存模型了吗?


一、什么是Java 的内存模型?

Java的内存模型(Java Memory Model,JMM)是Java虚拟机(JVM)规范中定义的一种抽象概念,用于描述Java程序中各种变量的存储方式、访问规则以及线程之间的交互关系。JMM规定了Java程序中多线程并发访问共享变量时的行为规范,确保多线程程序在不同的硬件平台和操作系统上都能获得一致的行为
在这里插入图片描述

JMM主要包含以下几个关键概念:

  1. 主内存(Main Memory): 主内存是所有线程享的内存区域,用于存储Java对象实例、静态变量等数据。所有的变量都存储在主内存中,而且每个线程都可以访问主内存中的变量。

  2. 工作内存(Working Memory): 每个线程都有自己的工作内存,用于存储该线程需要使用的变量副本。线程对变量的所有操作都在工作内存中进行,而不是直接在主内存中进行。

  3. 内存间交互操作: Java内存模型定义了一组规则,用于描述线程如何与主内存中的变量进行交互。这些规则包括读取变量、写入变量、锁定变量等操作,确保多线程并发访问时的可见性、有序性和原子性。

  4. 原子性、可见性和有序性: JMM通过各种机制来保证共享变量的原子性、可见性和有序性。原子性指一个操作是不可中断的;可见性指一个线程对共享变量的修改能被其他线程立即感知到;有序性指程序执行的顺序与代码的编写顺序一致。

通过定义Java内存模型,Java程序员可以编写多线程程序而无需考虑底层硬件和操作系统的差异,确保程序的正确性和可移植性。。

二、什么是 JVM 的运行时数据区

Java8 之前和之后的区别

在这里插入图片描述
Java 8 之前的 JVM(Java Virtual Machine)与 Java 8 及之后的 JVM 主要在以下几个方面存在区别:

  1. 内存模型改进

    • 元空间(Metaspace)替代永久代(PermGen):Java 8 中,JVM 去除了永久代(Permanent Generation),并将类元数据存储转移到了一个称为元空间的新区域。元空间不在 JVM 堆内存中分配,而是使用本地内存,从而避免了永久代大小限制和 Full GC 问题。这改善了 JVM 内存管理和垃圾回收的效率。
  2. 字符串去重复

    • Java 8 引入了字符串去重复(String deduplication)特性,JVM 在堆中对相同的字符串字面量和字符串驻留池进行共享,减少内存占用。当大量字符串重复时,这项优化可以显著节省内存空间。
  3. G1垃圾收集器成熟

    • 虽然 G1(Garbage-First)垃圾收集器在 Java 7 更新中引入,但直到 Java 8,G1 才被标记为“production-ready”,成为官方推荐的垃圾收集器之一,尤其适用于大内存服务器和需要低停顿时间的应用。G1 收集器提供了更细粒度的内存分区和更灵活的垃圾回收策略,实现了更平滑的垃圾回收过程和更好的吞吐量。
  4. Lambda表达式与 invokedynamic

    • Java 8 引入了 Lambda 表达式,它改变了匿名内部类的实现方式,使用了 invokedynamic JVM 指令。invokedynamic 是 Java 7 引入的 JVM 新特性,但在 Java 8 中得到了广泛应用。它允许在运行时动态解析和调用方法,使得 Lambda 表达式的创建和执行更加高效,同时也简化了方法和函数的处理。
  5. Compact Strings

    • Java 8 引入了 Compact Strings(紧凑字符串)优化,对于只包含 ASCII 字符的字符串,其内部字节数组不再使用 2 字节的 char 类型存储每个字符,而是改为使用 1 字节的 byte 类型,从而减少了内存占用。
  6. 内存分配改进

    • Java 8 对 TLAB(Thread Local Allocation Buffers)进行了优化,提高了对象分配速度和并发性能。TLAB 是每个线程私有的内存区域,用于快速分配小对象,减少多线程环境下的锁竞争。
  7. JVM监控与诊断工具增强

    • Java 8 对现有的 JVM 监控与诊断工具(如 jcmdjstackjmapjstat 等)进行了增强,提供了更丰富的命令选项和更详细的输出信息,便于开发者更好地分析和调试 JVM 性能问题。
  8. 新的 JVM 命令行选项

    • Java 8 引入了一些新的 JVM 命令行选项,如 -XX:+UseStringDeduplication(启用字符串去重复)、-XX:+UnlockExperimentalVMOptions(解锁实验性 VM 选项)等,为 JVM 调优提供了更多可能性。

JVM 内存模型

在这里插入图片描述

JVM 内存区域

Java虚拟机(JVM)内存模型是Java程序运行时的内存布局,它规定了程序在执行过程中如何分配和管理内存。JVM内存模型主要分为以下几个区域:

  1. 方法区(Method Area)

    • 用于存储类信息、常量、静态变量等数据。
    • 也是垃圾回收的主要区域之一。
  2. 堆(Heap)

    • 存储对象实例,几乎所有的对象实例都是在这里分配内存。
    • 堆是垃圾回收的主要区域。
  3. 栈(Stacks)

    • 用于存储局部变量和部分结果,并在方法调用时用于传递参数和返回值。
    • 每个线程有自己的调用栈。
  4. 程序计数器(Program Counter Register)

    • 存储指向下一条指令的地址,即将要执行的指令代码。
    • 每个线程有自己的程序计数器。
  5. 本地方法栈(Native Method Stacks)

    • 为JVM使用到的Native方法服务,如直接调用C/C++编写的库。
  6. 虚拟机栈(VM Stack)

    • 也称为Java栈,用于存储局部变量表、操作数栈、动态链接、方法出口等。
  7. 元空间(Metaspace)

    • 从JDK 8开始,取代了永久代(PermGen),用于存储类元数据。
    • 元空间位于本地内存(Native Memory)而不是虚拟机内存中。
  8. 直接内存(Direct Memory)

    • 不属于虚拟机规范定义的内存区域,但也被频繁使用,如NIO中的ByteBuffer分配的内存就属于直接内存。
JVM 内存垃圾回收

JVM内存垃圾回收(Garbage Collection,GC)是指JVM自动对内存中不再使用的对象进行识别和清理的过程,以释放内存资源供其他对象使用。这一机制对于Java语言的自动内存管理至关重要。以下是JVM内存垃圾回收的一些关键点:

  1. 垃圾回收的目的:识别并清除不再被引用的对象,即“垃圾”,以避免内存泄漏和内存溢出。

  2. 垃圾回收的算法:JVM采用了多种垃圾回收算法,包括但不限于:

    • 引用计数法:通过计数器记录对象被引用的次数来判定对象是否可回收,但由于难以处理循环引用问题,在Java中并不常用。
    • 标记-清除(Mark-Sweep):首先标记所有需要回收的对象,然后清除这些被标记的对象。
    • 复制算法(Copying):将内存分为两块,每次只使用一块,垃圾回收时将存活的对象复制到另一块,然后清除已使用的内存。
    • 标记-整理(Mark-Compact):先标记可回收对象,然后将所有存活的对象压缩到内存的一端,之后清理边界外的内存。
    • 分代收集算法:根据对象的生命周期将堆内存分为新生代和老年代,新生代使用复制算法,老年代使用标记-清除或标记-整理算法。
  3. 垃圾回收的触发条件:通常当新生代空间不足时,会触发Minor GC;当整个堆或老年代空间不足时,会触发Full GC。

  4. 垃圾回收的性能影响:GC过程中会暂停应用线程,这种“Stop The World”事件可能会影响应用性能。

  5. 垃圾回收器的选择:不同的垃圾回收器适用于不同的场景,如Serial、Parallel、CMS、G1等,开发者可以根据应用特点选择合适的垃圾回收器。

  6. 内存模型的变化:从JDK 7到JDK 8,永久代(PermGen)被元空间(Metaspace)取代,元空间使用的是直接内存。

  7. 垃圾回收的监控和调优:开发者可以通过监控GC日志和调整JVM参数来优化GC性能,如调整Eden区与Survivor区的比例、设置老年代的大小等。

  8. 对象的晋升:长期存活的对象或大对象可能会直接进入老年代,对象在Survivor区熬过一定次数的Minor GC后,也会晋升到老年代。

JVM如何判断哪些对象不在存活?

JVM判断对象是否存活主要依赖于“可达性分析”(Reachability Analysis)算法。这个算法的基本思想是通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链。如果一个对象到GC Roots没有任何引用链相连,即GC Roots到对象不可达,那么JVM就认为此对象不再存活,可以进行回收。

以下是可达性分析的具体步骤:

GC Roots的设置:在JVM中,作为GC Roots的对象包括:

  • 虚拟机栈(栈帧中的局部变量表)中引用的对象。
  • 方法区中的类静态属性引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中JNI(Native方法)引用的对象。

从GC Roots开始:垃圾回收器从GC Roots对象开始进行扫描。

搜索引用链:垃圾回收器会递归地跟踪GC Roots对象所引用的所有对象,以及这些对象所引用的其他对象。

标记存活对象:所有通过GC Roots直接或间接可达的对象都会被标记为存活。

确定垃圾对象:在完成引用链的遍历后,仍然没有被标记的对象被认为是垃圾,因为它们不可达,即没有任何活动线程或GC Roots引用它们。

回收垃圾对象:最后,垃圾回收器会回收那些被标记为垃圾的对象,释放它们占用的内存空间。

JVM运行过程中如何判断哪些对象是垃圾?

JVM 运行过程中,数据结构是动态变化的,因此可以使用三色标记算法来解决并发标记中一些问题。

三色标记算法是JVM中用于垃圾回收的一种算法,特别是在老年代的垃圾回收中。这种算法主要用于解决并发标记过程中的一些问题,如在并发清除过程中,对象的引用关系还在不断变化,导致清除工作不准确或遗漏。

在三色标记算法中,对象被分为三种颜色:

  1. 黑色:黑色对象是已经检查过的对象,它们的子对象也已经被检查过,这些对象不会被回收,并且不会被其他回收线程所改变。

  2. 灰色:灰色对象是已经检查过,但是其子对象还没有被检查的对象。灰色对象可能会被其他线程改变其子对象的引用关系,因此需要额外的同步措施来保证安全。

  3. 白色:白色对象是尚未检查的对象,也即是可能的垃圾对象。如果一个对象在完成标记过程后仍然是白色的,那么它将被认为是垃圾,可以被回收。

三色标记算法的基本步骤如下:

  1. 初始化:开始时,除了GC Roots直接引用的对象被标记为黑色外,所有其他对象都被认为是白色的。

  2. 并发标记:从GC Roots开始,遍历所有对象,将所有可达的对象标记为灰色,并检查它们的子对象。

  3. 重新标记:由于并发标记过程中,应用程序线程可能改变对象的引用关系,可能会产生新的灰色对象。因此,需要重新扫描这些灰色对象,以确保所有新增的子对象都被检查过。

  4. 清理:在所有对象都被重新标记后,所有白色的对象都可以安全地被回收。

三色标记算法通过引入灰色对象,解决了并发标记过程中对象引用关系变化的问题。然而,这种算法需要额外的同步机制来保证并发标记的安全性,这可能会影响垃圾回收的效率。

在实际的JVM实现中,如G1垃圾回收器,采用了类似的三色标记策略,但做了一些优化,以减少并发标记对应用程序性能的影响。

JVM 垃圾回收

Java8 中的 jvm如何进行垃圾回收?

Java 8中的垃圾回收(Garbage Collection,GC)机制与Java的其他版本基本相同,它依赖于垃圾回收器(Garbage Collector,GC)来自动管理对象的生命周期,回收不再使用的对象以释放内存。Java虚拟机(JVM)提供了几种不同的垃圾回收器,它们在Java 8中得到了进一步的优化和改进。

以下是Java 8中垃圾回收的一些关键概念和组件:

  1. 分代收集:Java的垃圾回收器通常采用分代收集的策略,将堆内存分为新生代(Young Generation)和老年代(Old Generation)。

    • 新生代:新创建的对象首先分配在新生代。新生代进一步分为Eden区和两个Survivor区(S0和S1)。对象在Eden区创建,当Eden区满时,触发一次Minor GC,将存活的对象复制到Survivor区,每经过一次Minor GC,对象的年龄就会增加,当达到一定年龄后,对象会被晋升到老年代。
    • 老年代:长期存活的对象以及大对象直接分配在老年代。老年代的垃圾回收不如新生代频繁,因为老年代的对象通常生命周期较长,垃圾回收成本较高。
  2. 垃圾回收器:Java 8提供了多种垃圾回收器,包括:

    • Serial GC:单线程的垃圾回收器,适用于对延迟不敏感的小应用。
    • Parallel GC:也称为吞吐量优先收集器,使用多个线程进行垃圾回收,适合多核处理器,以高吞吐量为目标。
    • Concurrent Mark Sweep (CMS):以最短的停顿时间为目标,通过并发的方式进行垃圾回收,适合需要低延迟的应用。
    • G1 (Garbage-First) GC:是Java 7引入的,Java 9中成为默认的垃圾回收器。G1 GC旨在替换CMS,它将堆分割成多个小块(Region),可以更灵活地进行垃圾回收,减少停顿时间。
  3. 堆外内存:除了堆内存,Java 8还允许使用堆外内存(Off-Heap Memory),这允许JVM管理的内存超出传统的堆限制。
    注意:在Java 8中,随着元空间的引入,JVM对堆外内存的使用变得更加普遍。元空间用于存储类元数据,从而减少了对堆内存的压力,并提高了性能。然而,即使是在Java 8中,直接内存等堆外内存的使用仍然需要谨慎,以避免潜在的内存管理问题。

  4. 元空间(Metaspace):在Java 8中,永久代(PermGen)被元空间所取代。元空间用于存储类的元数据,而不是传统的堆内存。这减少了内存溢出的风险,因为元空间使用的是本地内存(Native Memory),理论上可以更大。

  5. 垃圾回收触发条件:垃圾回收通常在以下情况下触发:

    • 系统空闲时。
    • 堆内存使用达到一定阈值。
    • 显式的调用System.gc(),尽管这只是一个建议,JVM可以决定是否执行。
  6. 垃圾回收日志:Java 8增强了垃圾回收日志的功能,允许开发者更详细地监控垃圾回收的行为。

  7. 性能监控和调优工具:Java 8提供了更强大的监控和调优工具,如JMC(Java Mission Control)和JFR(Java Flight Recorder),帮助开发者分析和优化垃圾回收性能。

Serial、Parallel、CMS、G1 的工作原理和适用场景
Serial 收集器

工作原理

  • Serial 收集器是一个单线程的收集器,它在进行垃圾收集时,必须暂停其他所有工作线程(即"Stop The World")。
  • 它采用复制算法,将内存划分为两块,只使用一块,待这个内存满了,把里面的对象清除到另一块内存。

适用场景

  • 适用于单核处理器和小型应用,以及对延迟不敏感的场合。
Parallel 收集器

工作原理

  • Parallel 收集器又称为吞吐量优先收集器,是一个多线程的收集器,它在多核处理器上可以提高垃圾收集的效率。
  • 同样使用复制算法进行新生代的垃圾收集,与Serial收集器相比,它可以并行地执行垃圾收集任务,减少GC造成的停顿时间。

适用场景

  • 适用于多核服务器,当吞吐量是主要考虑因素时,尤其是在后台处理系统,如批处理系统。
CMS 收集器

工作原理

  • CMS(Concurrent Mark Sweep)收集器主要用于老年代,它通过并发标记和清除来最小化GC的停顿时间。
  • 它包括四个主要步骤:初始标记、并发标记、重新标记和并发清理,其中大部分工作可以与应用程序并发进行,从而减少了停顿时间。

适用场景

  • 适用于对响应时间和延迟敏感的应用,如Web服务器。
G1 收集器

工作原理

  • G1(Garbage-First)收集器是一个面向服务端应用的垃圾收集器,它将堆划分为多个大小相等的独立区域(Region),并发地进行垃圾回收。
  • G1同时采用了复制算法和标记-整理算法,以减少内存碎片,并提供可预测的停顿时间。

适用场景

  • 适用于大堆内存,需要可预测的停顿时间的应用,如大型电子商务平台或高负载的在线服务。

在选择垃圾回收器时,需要根据应用的特点和性能要求进行选择,以确保既满足性能需求,又能有效管理内存。

Java8 默认的垃圾收集器为什么不是 G1 ?

Java 8 默认的垃圾收集器不是 G1,而是基于吞吐量优先的 Parallel GC(Parallel Scavenge 用于新生代,Parallel Old 用于老年代)。以下是几个原因:

  1. 吞吐量优先:Parallel GC 专注于提供高吞吐量,这意味着它允许垃圾收集线程与应用线程并行运行,从而在多核处理器上提高性能。

  2. 延迟性考虑:虽然 G1 垃圾收集器旨在提供可预测的低延迟GC停顿时间,但 Parallel GC 在追求最大吞吐量的同时,其停顿时间可能会更长。

  3. 适用场景:Parallel GC 适用于后台处理系统,如批处理系统,这些系统对延迟的容忍度较高,而更注重整体的处理能力。

  4. 性能测试:一些基准测试表明,在某些场景下,Parallel GC 的性能可能优于 G1,尤其是在较小的堆内存配置下。

  5. 社区反馈和选择:Java 社区的反馈和Oracle公司的性能测试结果导致 Parallel GC 被选为 Java 8 的默认 GC。G1 虽然是一个强大的垃圾收集器,但在当时可能还没有得到足够的认可来取代 Parallel GC 成为默认选项。

  6. JDK 版本演化:随着 JDK 版本的演化,G1 逐渐获得了更多的改进和优化,最终在 JDK 9 中被提议作为服务端默认的垃圾收集器。

  7. 技术成熟度:在 Java 8 发布时,G1 可能还没有达到足够的成熟度,以作为所有应用场景下的默认选择。

  8. 避免不必要的复杂性:对于不需要特别关注 GC 停顿时间的应用,使用 Parallel GC 可以避免引入 G1 的额外复杂性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/556044.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

.rmallox勒索病毒来袭:如何守护您的数据安全?

引言: 随着信息技术的飞速发展,网络安全问题日益凸显,其中勒索病毒更是成为了网络安全领域的一大难题。.rmallox勒索病毒作为一种典型的恶意软件,通过加密受害者文件并勒索赎金的方式,给企业和个人带来了巨大的经济损…

指纹浏览器如何高效帮助TikTok账号矩阵搭建?

TikTok的账号矩阵,可能听起来还比较陌生,但随着TikTok业务已经成为吃手可热的跨境业务,TikTok多账号矩阵已成为流行策略。但它有什么优点呢?操作多个帐户会导致被禁止吗?如何有效地建立账户矩阵开展业务?这…

爬虫 | 基于 requests 实现加密 POST 请求发送与身份验证

Hi,大家好,我是半亩花海。本项目旨在实现一个简单的 Python 脚本,用于向指定的 URL 发送 POST 请求,并通过特定的加密算法生成请求头中的签名信息。这个脚本的背后是与某个特定的网络服务交互,发送特定格式的 JSON 数据…

深入理解MySQL中的UPDATE JOIN语句

在MySQL数据库中,UPDATE语句用于修改表中现有的记录。有时,我们需要根据另一个相关联表中的条件来更新表中的数据。这时就需要使用UPDATE JOIN语句。最近我们遇到了这样的需求:我们有一张历史记录表,其中一个字段记录了用,连接的多…

网络爬虫软件学习

1 什么是爬虫软件 爬虫软件,也称为网络爬虫或网络蜘蛛,是一种自动抓取万维网信息的程序或脚本。它基于一定的规则,自动地访问网页并抓取需要的信息。爬虫软件可以应用于大规模数据采集和分析,广泛应用于舆情监测、品牌竞争分析、…

在 Linux 终端中创建目录

目录 ⛳️推荐 前言 在 Linux 中创建一个新目录 创建多个新目录 创建多个嵌套的子目录 测试你的知识 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 前言 在本系列的这一部…

Day09 React———— 第九天

ReactRoter 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候,path 对应的组件会在页面中进行渲染 基础用法 import { createBrowserRouter, RouterProvider } from "react-router-dom"; const router createBrowserRoute…

解决Mac使用Vscode无法调用外部终端

前言 今天遇到一个很奇怪的问题,之前好好的用Vscode还能调用外部终端,怎么今天不行了?问题出在哪里呢?请听我娓娓道来。 检查配置文件 我查看了一下配置文件,发现配置文件都是调用外部控制台,没毛病啊。 …

linux启动minicom、u-boot的常用命令、网络命令tftp、nfs/根文件系统、u-boot的bootargs环境变量

linux启动minicom sudo minicom -con进入minicom界面: 打开单片机 在打开之后,我们通过 printenv查看环境配置 在修改配置之前,我们最好先将环境初始化一下,初始化代码为 nand erase.chipu-boot的常用命令 尽管u-boot是一个…

Torch 模型 感受野可视化

前言:感受野是卷积神经网络 (CNN) 中一个重要的概念,它表示 CNN 每一层输出的特征图上的像素点在输入图像上映射的区域。感受野的大小和形状直接影响到网络对输入图像的感知范围和精度,进而调整网络结构、卷积核大小和步长等参数,…

后端-MySQL-week11 多表查询

tips: distinct————紧跟“select”之后,用于去重 多表查询 概述 一对多(多对一) 多对多 一对一 多表查询概述 分类 连接查询 内连接 外连接 自连接 必须起别名! 联合查询-union,union all 子查询 概念 分类 …

OpenMesh 极小曲面(局部迭代法)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 我们的目标是想得到一个曲率处处为0的曲面,具体操作如下所述: 二、实现代码 #define _USE_MATH_DEFINES #include

量子时代加密安全与区块链应用的未来

量子时代加密安全与区块链应用的未来 现代密码学仍然是一门相对年轻的学科,但其历史却显示了一种重要的模式。大多数的发展都是基于几年甚至几十年前的研究。而这种缓慢的发展速度也是有原因的,就像药物和疫苗在进入市场之前需要经过多年的严格测试一样&…

【Web】2022DASCTF X SU 三月春季挑战赛 题解(全)

目录 ezpop calc upgdstore ezpop 瞪眼看链子 fin#__destruct -> what#__toString -> fin.run() -> crow#__invoke -> fin#__call -> mix.get_flag() exp <?php class crow {public $v1;public $v2;}class fin {public $f1; }class what {public $a; }…

MATLAB中gurobi 运行报错与调试

问题背景如下&#xff1a;刚拿到一份MATLAB的代码&#xff0c;但是电脑第一次安装gurobi&#xff0c;在运行过程中发生了报错&#xff0c;使用断点进行调试和步进调试方法&#xff0c;最终发现&#xff0c;这个问题出在了哪一步&#xff0c;然后向了人工智能和CSDN、百度寻求答…

VScode远程连接虚拟机提示: 无法建立连接:XHR failed.问题解决方案

一问题描述 在vscode下载插件Remote-SSH远程连接虚拟机时提示无法建立连接 二.最大嫌疑原因&#xff1a; 我也是在网上找了许久&#xff0c;发现就是网络原因&#xff0c;具体不知&#xff0c;明明访问别的网页没问题&#xff0c;就是连不上&#xff0c;然后发现下载vscode的…

数据赋能(61)——要求:数据管理部门职责

“要求&#xff1a;数据管理部门职责”是作为标准的参考内容编写的。 数据管理部门职责在于以数据资源为核心&#xff0c;将原始数据转化为可被业务部门与数据服务部门有效利用的数据资源&#xff0c;以支持业务赋能的实现。 数据管理要确保数据的完整性、准确性与一致性&…

Debian12 中重新安装MSSQL 并指定服务器、数据库、数据表字段的字符排序规则和默认语言等参数

在 Linux 上配置 SQL Server 设置 - SQL Server | Microsoft Learn 零、查看sql server 服务器支持的字符排序规则 SELECT Name from sys.fn_helpcollations() where name Like Chinese% go------ Chinese_PRC_CI_AI Chinese_PRC_CI_AI_WS Chinese_PRC_CI_AI_KS Chinese_PRC_…

【工具使用】CSDN中如何给文章添加目录跳转

这里写需要添加的目录名称 一级标题二级标题三级标题 一级标题 二级标题 三级标题 文章添加标题示例&#xff1a;

YoloV8改进策略:注意力改进、Neck层改进|自研全新的Mamba注意力|即插即用,简单易懂|附结构图|检测、分割、关键点均适用(独家原创,全世界首发)

摘要 无Mamba不狂欢,本文打造基于Mamba的注意力机制。全世界首发基于Mamba的注意力啊!对Mamba感兴趣的朋友一定不要错过啊! 基于Mamba的高效注意力代码和结构图 import torch import torch.nn as nn # 导入自定义的Mamba模块 from mamba_ssm import Mamba class Eff…