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

JVM知识点(一)---内存管理

一、JVM概念

什么是JVM?

定义:
Java Virtual Machine - java程序的运行环境(java二进制字节码的运行环境)
好处:

  • 一次编写,到处运行
  • 自动内存管理,垃圾回收功能
  • 数组下标越界越界检查
  • 多态

比较jvm jre jdk区别

学习路线

二、内存结构

1.程序计数器

1.1定义

Program Counter Register程序计数器(寄存器)
作用:是记住下一条jvm指令的执行地址
特点:

  1. 是线程私有的
  2. 不会存在内存溢出

线程私有指的是:每个线程有一个自己的计数器。在线程即将切换时,计数器记住下次要执行指令的地址,等线程再次切换回来时,会根据计数器记住的指令地址,继续执行上次未执行完的流程。

1.2作用

java源代码对应一份二进制字节码,这些二进制字节码代表jvm指令。这些指令通过解释器变成机器码,然后cpu识别机器码开始运行。

程序计数器的作用是:在解释器解释jvm指令后,记住下一条jvm指令在内存中的地址。等cpu执行完后,解释器通过计数器保存的地址找到将要执行的jvm指令。

2.虚拟机栈

2.1定义

Java Virtual Machine Stacks(Java虚拟机栈)

  • 每个线程运行时所需要的内存,称为虚拟机栈
  • 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
     

栈和栈桢怎么联系起来的?

当有方法被调用时,栈桢被压入栈,方法调用结束后,栈桢弹出栈,栈桢占用内存被释放。

问题辨析
1.垃圾回收是否涉及栈内存?

不涉及,垃圾回收的是堆内存中无用的对象。栈内存是一次方法调用产生的栈桢内存,方法调用结束后内存会被自动回收。


2.栈内存分配越大越好吗?

不是越大越好。

系统默认栈内存为1M,因为内存大小是固定的,栈内存分配越大,可分配的线程数就越少。


3.方法内的局部变量是否线程安全?

要判断变量是否安全,要看这个变量是私有变量还是共享变量。而方法内的局部变量是线程内的私有变量,在多线程情况下,(如果此变量没有作为返回结果返回)不会受到其他线程访问影响,所以是线程安全的。

static修饰的变量不加线程保护是共享变量,每个线程都可以修改它的值,存在线程安全问题。

总结:

  • 如果方法内局部变量没有逃离方法的作用范围,它是线程安全的
  • 如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全

下图三个方法的局部变量sb,只有m1是线程安全的。

2.2栈内存溢出

  • 栈帧过多导致栈内存溢出
  • 栈帧过大导致栈内存溢出
     

一般出现在方法无线递归,和调用第三方框架方法无限递归造成。

可以在idea中VM options添加参数 -Xss256k 修改栈内存大小

2.3线程运行诊断

案例1:cpu占用过多
定位:可以根据线程id找到有问题的线程,进一步定位到问题代码的源码行号


用top定位哪个进程对cpu的占用过高

nohup命令让程序在后台运行


ps H -eo pid,tid,%cpu | grep 进程id(用ps命令进一步定位是哪个线程引起的cpu占用过高)


jstack 进程id

jstack输出的线程是十六进制的,需要将十进制32655换算成十六进制7f99查看


 

案例2:程序运行很长时间没有结果

通过jstack排查死锁问题


3.本地方法栈

  • 本地方法表示不是由Java代码编写的方法
  • java代码不能直接和操作系统底层api打交道,需要通过C/C++编写的本地方法间接调用底层功能
  • java虚拟机调用本地方法时,给本地方法提供内存空间。


4.堆

4.1定义

Heap 堆
通过new关键字,创建对象都会使用堆内存


特点

  • 它是线程共享的,堆中对象都需要考虑线程安全的问题
  • 有垃圾回收机制
     

4.2堆内存溢出

通过 -Xmx 修改堆内存大小

4.3堆内存诊断

1.jps工具

查看当前系统中有哪些java进程

2.jmap工具

查看堆内存占用情况,jmap -heap 进程id

jdk9以后:jhsdb jmap --heap --pid 进程id

3.jconsole工具

图形界面的,多功能的监测工具,可以连续监测

4.jvisualvm工具
 

案例:垃圾回收后,内存占用仍然很高

首先用jconsole执行垃圾回收,发现内存占用依然很高

打开jvisualvm,执行堆Dump,抓取堆的当前快照,对里面详细内容分析

点击查找就可查看当前堆内存较大的对象信息


5.方法区

5.1定义

Java虚拟机(JVM)有一个方法区,该区域在所有Java虚拟机线程之间共享。

它存储每个类的结构,例如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括用于类和实例初始化以及接口初始化的特殊方法.

方法区在虚拟机启动时创建。方法区在逻辑上是堆的一部分(可以不在堆内存实现,比如下图的元空间)

如果方法区中的内存无法满足分配请求,Java虚拟机将抛出OutOfMemoryError

5.2组成

5.3方法区内存溢出

1.8以前会导致永久代内存溢出
1.8之后会导致元空间内存溢出
1.8版本之后通过 -XX:MaxMetaspaceSize 设置方法区内存大小

1.8版本之前通过 -XX:MaxPermSize 设置方法区内存大小

5.4运行时常量池

  • 常量池,就是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息
  • 运行时常量池,常量池是*.class文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址
     

常量池作用:为jvm指令提供常量符号,以便在常量池找到对应信息

通过 javap -v HelloWorld.class 反编译获取二进制字节码文件内容

二进制字节码主要包括:类基本信息,常量池,类方法定义,包含了虚拟机指令

PS D:\JavaCode\netty_demo\reactor-demo\target\classes> javap -v HelloWorld.class
Classfile /D:/JavaCode/netty_demo/reactor-demo/target/classes/HelloWorld.class
  Last modified 2025年4月26日; size 534 bytes
  SHA-256 checksum ff57c608d401e6857e5eaf152482d23ad567492c290624935e0a43f26533bf94
  Compiled from "HelloWorld.java"
public class HelloWorld
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #21                         // HelloWorld
  super_class: #2                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 2, attributes: 1
Constant pool:
   #1 = Methodref          #2.#3          // java/lang/Object."<init>":()V
   #2 = Class              #4             // java/lang/Object
   #3 = NameAndType        #5:#6          // "<init>":()V
   #4 = Utf8               java/lang/Object
   #5 = Utf8               <init>
   #6 = Utf8               ()V
   #7 = Fieldref           #8.#9          // java/lang/System.out:Ljava/io/PrintStream;
   #8 = Class              #10            // java/lang/System
   #9 = NameAndType        #11:#12        // out:Ljava/io/PrintStream;
  #10 = Utf8               java/lang/System
  #11 = Utf8               out
  #12 = Utf8               Ljava/io/PrintStream;
  #13 = String             #14            // Hello World!
  #14 = Utf8               Hello World!
  #15 = Methodref          #16.#17        // java/io/PrintStream.println:(Ljava/lang/String;)V
  #16 = Class              #18            // java/io/PrintStream
  #17 = NameAndType        #19:#20        // println:(Ljava/lang/String;)V
  #18 = Utf8               java/io/PrintStream
  #19 = Utf8               println
  #20 = Utf8               (Ljava/lang/String;)V
  #21 = Class              #22            // HelloWorld
  #22 = Utf8               HelloWorld
  #23 = Utf8               Code
  #24 = Utf8               LineNumberTable
  #25 = Utf8               LocalVariableTable
  #26 = Utf8               this
  #27 = Utf8               LHelloWorld;
  #28 = Utf8               main
  #29 = Utf8               ([Ljava/lang/String;)V
  #30 = Utf8               args
  #31 = Utf8               [Ljava/lang/String;
  #32 = Utf8               SourceFile
  #33 = Utf8               HelloWorld.java
{
  public HelloWorld();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   LHelloWorld;

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #13                 // String Hello World!
         5: invokevirtual #15                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 3: 0
        line 4: 8
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       9     0  args   [Ljava/lang/String;
}
SourceFile: "HelloWorld.java"
 

5.5 StringTable

StringTable(字符串常量池)是 JVM 在启动时创建的。

 StringTable 的管理
  • 哈希表结构:StringTable 是一个哈希表,用于快速查找和存储字符串。
  • 垃圾回收:在 Java 7 之前,StringTable 位于永久代(PermGen),不参与垃圾回收。从 Java 7 开始,StringTable 被移到堆内存(Heap),并参与垃圾回收。
  • 大小调整:可以通过 JVM 参数调整 StringTable 的大小,例如:-XX:StringTableSize=<size>:设置 StringTable 的桶数量(默认值因 JVM 版本而异)。
字符串常量池的作用
  • 字符串常量池是 JVM 中用于存储字符串字面量(如 "a"、"b"、"ab")的一个特殊区域。
  • 它的目的是避免重复创建相同的字符串对象,节省内存。
  • 只有通过字面量赋值(如 String s = "abc")或显式调用 intern() 方法的字符串才会被放入字符串常量池。

编译下方代码得到字节码文件

public class Demo1_3 {public Demo1_3() {}public static void main(String[] args) {String s1 = "a";String s2 = "b";String s3 = "ab";}
}

ldc指令:将从常量池 #7 位置加载一个字符串对象

astore_1:将这个对象存放局部变量表 LocalVariableTable 的 Slot 的 1 号位置

常量池与串池的关系

程序运行时,常量池中的信息,都会被加戴到运行时常量池中,这时a、b、ab都是常量池中的符号,还没有变为 java 字符串对象(懒惰的)。

当执行ldc指令,要加载字符串对象a时,JVM 首先在字符串常量池中查找 "a":

  • 如果找到,则直接返回常量池中的引用。
  • 如果未找到,则创建 "a" 对象并放入常量池,然后返回引用。

StringTable[ ]:hashtable结构,不能扩容

字符串变量拼接
public class Demo1_4 {public static void main(String[] args) {String s1 = "a";String s2 = "b";String s3 = "ab";String s4 = s1 + s2;}
}

jdk8之前:字符串拼接底层通过创建StringBuilder对象,最后toString()生成新的字符串对象。

显式使用 StringBuilder 会带来以下内存开销:

  • 对象创建开销:每次拼接字符串时,都需要创建一个新的 StringBuilder 对象。
  • 缓冲区扩容开销:StringBuilder 内部使用字符数组存储数据,当字符数组容量不足时,需要扩容并复制数据,这会增加额外的内存分配和复制操作。
  • 临时对象开销:StringBuilder 最终会调用 toString() 方法生成一个新的 String 对象,这也会增加内存占用。

通过 invokedynamic 和 makeConcatWithConstants,Java 可以:

  • 避免创建 StringBuilder 对象:直接在运行时生成拼接逻辑,无需中间对象。
  • 优化内存分配:动态生成的拼接逻辑可以更高效地分配内存,减少不必要的扩容和复制操作。
  • 减少临时对象:直接生成最终的 String 对象,避免中间步骤的临时对象。

jdk9之后:底层在字符串拼接时,invokedynamic 会调用 makeConcatWithConstants 方法,动态生成拼接逻辑。

直接生成的 s4 不会自动放入字符串常量池,而是分配在堆内存中。
如果需要将 s4 放入字符串常量池,可以显式调用 intern() 方法。

String s4 = (s1 + s2).intern();
System.out.println(s3 == s4); // true
编译期优化

“a” + "b" 是两个确定的常量,不会改变,拼接结果确定为“ab”。而s1+s2是两个在运行期间可变的变量。

字符串变量拼接的原理是StringBuilder(1.8)
字符串常量拼接的原理是编译期优化
 

intern

1.8版本的intern()会将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池,会把串池中的对象返回.

1.6将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有会把此对象复制一份,放入串池,会把串池中的对象返回 (s拷贝一份放入串池,也就是s没有放入串池,与串池的引用不相同)
 

5.6 StringTable位置

Java 7 之前,StringTable 位于永久代,存在大小限制、垃圾回收效率低、内存泄漏风险和性能问题。
Java 7 开始,StringTable 被移到堆内存,解决了永久代的不足,提供了更好的内存管理和性能表现。

在 Java 7 之前,StringTable(字符串常量池)位于永久代(PermGen),这种设计存在一些明显的不足。以下是主要问题及其影响:

永久代的垃圾回收是Full GC时触发,而Full GC要等到老年代的空间不足才会触发,触发时机较晚,导致回收效率不高。

1. 永久代的大小限制
固定大小:永久代的大小是固定的,默认值较小(例如 64MB),无法动态扩展。
容易溢出:如果应用程序中使用了大量字符串(尤其是通过 intern() 方法显式添加的字符串),永久代可能会快速耗尽,导致 java.lang.OutOfMemoryError: PermGen space 错误。

2. 垃圾回收问题
不支持高效回收:永久代的垃圾回收机制不够高效,尤其是对于字符串常量池中的对象。
内存泄漏风险:如果字符串常量池中的对象不再被使用,但由于永久代的垃圾回收机制不完善,这些对象可能无法被及时回收,导致内存泄漏。
 
3. 性能问题
Full GC 影响:永久代的垃圾回收通常与 Full GC 相关联,而 Full GC 会暂停整个应用程序(Stop-The-World),影响性能。
扩展性差:由于永久代的大小固定且无法动态调整,对于需要处理大量字符串的应用程序(如 Web 应用),性能问题尤为突出。
 
4. 从永久代移到堆内存的改进
从 Java 7 开始,StringTable 被移到了堆内存(Heap),这一改进解决了上述问题:
动态扩展:堆内存的大小可以根据需要动态调整,避免了永久代大小固定的限制。
高效垃圾回收:堆内存的垃圾回收机制更加高效,尤其是年轻代的 Minor GC 可以快速回收不再使用的字符串对象。
减少内存泄漏:由于堆内存的垃圾回收机制更完善,字符串常量池中的无用对象可以及时回收,减少了内存泄漏的风险。
性能提升:堆内存的垃圾回收(尤其是年轻代的 Minor GC)对应用程序的影响较小,提升了整体性能。

5.7StringTable垃圾回收

-Xmx10m 设置堆内存大小

-XX:+PrintstringTablestatistics 打印字符串表的统计信息

-XX:+PrintGCDetails  -verbose:go  打印发生垃圾回收的详细信息
 

发生了垃圾回收

5.8StringTable性能调优

  • 调整-XX:String TableSize-=桶个数
  • 考虑将字符串对象是否入池
     

底层HashTable,桶的个数越多,越分散,hash碰撞概率越低,链表越短,查询速度就越快。

测试代码

设置桶个数为200000时,耗时0.4s

使用默认桶个数时,耗时0.6s

设置桶个数最小时,耗时12s

6.直接内存

  • 常见于IO操作时,用于数据缓冲区
  • 分配回收成本较高,但读写性能高
  • 不受JVM内存回收管理
public class DirectByteBuffer {static final String FROM = "D:\\upload\\2.mp4";static final String To = "D:\\upload\\test.mp4";static final int _1Mb = 1024 * 1024;public static void main(String[] args) {io();directBuffer();}private static void directBuffer() {long start = System.nanoTime();try (FileChannel from = new FileInputStream(FROM).getChannel();FileChannel to = new FileOutputStream(To).getChannel();) {ByteBuffer bb = ByteBuffer.allocateDirect(_1Mb);while (true) {int len = from.read(bb);if (len == -1) {break;}bb.flip();to.write(bb);bb.clear();}} catch (IOException e) {e.printStackTrace();}long end = System.nanoTime();System.out.println("directBuffer用时:" + (end - start) / 1000_000.0);}private static void io() {long start = System.nanoTime();try (FileInputStream from = new FileInputStream(FROM);FileOutputStream to = new FileOutputStream(To);) {byte[] buf = new byte[_1Mb];while (true) {int len = from.read(buf);if (len == -1) {break;}to.write(buf, 0, len);}} catch (IOException e) {e.printStackTrace();}long end = System.nanoTime();System.out.println("io用时:" + (end - start) / 1000_000.0);}
}

使用ByteBuffer效率比io高

6.1基本使用

java本身不具备磁盘读写能力,需要调用本地方法(操作系统提供的函数),此时CPU运行状态由java的用户态切换到系统的内核态

内存读取磁盘内容到系统内存的系统缓存区,处在系统缓存区的数据java是不能运行的,java会在堆内存中划分一块java缓存区,将系统缓存区数据读入到java缓存区。

我们可以发现一份数据占了两个内存,造成不必要的复制,导致效率不高

上述方法调用后会在操作系统内存划分一块直接内存,这块内存,系统和java代码都可用,比上图的流程少了一步复制数据的操作,速度得到了提升。

6.2直接内存溢出

6.3直接内存释放原理

使用了Unsafe对象完成直接内存的分配回收,并且回收需要主动调用freeMemory方法

ByteBuffer的实现类内部,使用了Cleaner(虚引用)来监测ByteBuffer对象,一旦ByteBuffer对象被垃
圾回收,那么就会由ReferenceHandler线程通过Cleaner的clean方法调用freeMemory来释放直接内存
 

在任务管理器查看直接内存占用。

直接内存释放需要调用unsafe.freeMemory()方法

当directByteBuffer被回收后会调用(虚引用)Cleaner的clean()方法执行任务对象的run()方法

他们是关联的

6.4禁用显式的垃圾回收

在JVM调优时会使用

-XX:+DisableExplicitGC 显式的

作用:使代码中的System.gc()无效

显式的垃圾回收,触发的是Full GC 既回收新生代,也回收老年代,造成系统暂停时间较长。

影响:直接内存的回收受到影响,没有执行内存垃圾回收,btyeBuffer = null时,虽然没人引用它,由于内存充足,还会继续存活,继而导致直接内存也没回收。

解决方法:手动调用unsafe.freeMemory()方法


 

相关文章:

JVM知识点(一)---内存管理

一、JVM概念 什么是JVM&#xff1f; 定义&#xff1a; Java Virtual Machine - java程序的运行环境(java二进制字节码的运行环境) 好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收功能数组下标越界越界检查多态 比较jvm jre jdk区别 学习路…...

Apache NetBeans 25 发布

Apache NetBeans 25 已于 2025 年 2 月 20 日发布3。NetBeans 是一个主要面向 Java 的集成开发环境&#xff0c;同时支持 C/C、PHP、JavaScript 和其他编程语言1。以下是一些主要的更新内容&#xff1a; Gradle 的优化与增强&#xff1a;优化单文件测试功能&#xff0c;即使测试…...

【设计模式区别】装饰器模式和适配器模式区别

装饰器模式&#xff08;Decorator Pattern&#xff09;和适配器模式&#xff08;Adapter Pattern&#xff09;都是 结构型设计模式 或者说 包装模式 &#xff08;Wrapper&#xff09;&#xff0c;用于解决对象的组合和扩展问题&#xff0c;但它们的核心目的、结构和使用场景有显…...

矫平机终极指南:特殊材料处理、工艺链协同与全球供应链管理

一、特殊材料矫平&#xff1a;挑战与创新解决方案 1. 高温合金&#xff08;如Inconel 718&#xff09;处理 技术难点&#xff1a; 屈服强度高达1100 MPa&#xff0c;传统矫平力不足 高温下易氧化&#xff0c;需惰性气体保护环境 解决方案&#xff1a; 采用双伺服电机驱动&a…...

stm32进入睡眠模式的几个注意点

&#xff08;1&#xff09;关闭systick &#xff08;2&#xff09;先关闭外设时钟&#xff0c;再屏蔽中断&#xff0c;避免先屏蔽中断再关闭外设时钟导致中断挂起无法进入睡眠模式&#xff08;立即被唤醒&#xff09;。 参考&#xff1a; 注&#xff1a;图片截自《RM0433参考手…...

深入理解网络安全中的加密技术

1 引言 在当今数字化的世界中&#xff0c;网络安全已经成为个人隐私保护、企业数据安全乃至国家安全的重要组成部分。随着网络攻击的复杂性和频率不断增加&#xff0c;保护敏感信息不被未授权访问变得尤为关键。加密技术作为保障信息安全的核心手段&#xff0c;通过将信息转换为…...

学习设计模式《六》——抽象工厂方法模式

一、基础概念 抽象工厂模式的本质是【选择产品簇(系列)的实现】&#xff1b; 抽象工厂模式定义&#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类&#xff1b; 抽象工厂模式功能&#xff1a;抽象工厂的功能是为一系列相关对象或相互依…...

MySQL 数据类型

文章目录 数据类型数据类型分类数据类型tinyint类型&#xff08;整型&#xff09;总结bit类型&#xff08;字节&#xff09; 浮点类型float类型decimal类型 字符串类型char类型varchar&#xff08;变长字符串&#xff09; char 和 varchar的对比日期类型enum和set类型&#xff…...

基于Tcp协议的应用层协议定制

前言&#xff1a;本文默认读者已掌握 TCP 协议相关网络接口知识&#xff0c;将聚焦于应用层协议的设计与剖析&#xff0c;有关底层通信机制及业务逻辑部分仅作简要概述&#xff0c;不再展开详述。 目录 服务器 一、通信 二、协议 1.序列化与反序列化 2. 封包与解包 三、业…...

Flink反压问题解析

一、什么是反压(Backpressure)? 反压(Backpressure) 是流处理系统中的一种流量控制机制。当下游算子处理速度低于上游数据生产速度时,系统会向上游传递压力信号,迫使上游降低数据发送速率,避免数据堆积和系统崩溃。 Flink 通过动态反压机制实现这一过程,但其副作用是…...

C语言中结构体的字节对齐的应用

一、字节对齐的基本原理 计算机的内存访问通常以固定大小的块&#xff08;如 4 字节、8 字节&#xff09;为单位。若数据的内存地址是块大小的整数倍&#xff0c;称为 自然对齐。例如&#xff1a; int&#xff08;4 字节&#xff09;的地址应为 4 的倍数。 double&#xff08…...

大规模数据同步后数据总条数对不上的系统性解决方案:从字段映射到全链路一致性保障

一、引言 在数据同步&#xff08;如系统重构、分库分表、多源整合&#xff09;场景中&#xff0c;“本地数据一致&#xff0c;生产环境条数对不上”是典型痛点。问题常源于并发处理失控、数据库性能瓶颈、字段映射错误、缓存脏数据等多维度缺陷。本文结合实战经验&#xff0c;…...

美团Java后端二面面经!

场景题是面试的大头&#xff0c;建议好好准备 Q. [美团]如何设计一个外卖订单的并发扣减库存系统&#xff1f; Q.[美团]为啥初始标记和重新标记需要STW&#xff1f; Q.[美团]骑手位置实时更新&#xff0c;如何保证高并发写入&#xff1f; Q.[美团]订单表数据量过大导致查询…...

35-疫苗预约管理系统(微服务)

技术&#xff1a; RuoYi框架 后端: SpringBootMySQLspringCloudnacosRedis 前端: vue3 环境&#xff1a; Idea mysql maven jdk1.8 用户端功能 1.首页:展示疫苗接种须知标语、快速预约模块 2.疫苗列表:展示可接种的疫苗 3.预约接种: 用户可进行疫苗预约接种 修改预约时间 …...

Ext JS模拟后端数据之SimManager

Ext.ux.ajax.SimManager 是 Ext JS 框架中用于拦截 Ajax 请求并返回模拟数据的核心工具,适用于前后端分离开发、原型验证或独立测试场景。它通过配置灵活的规则和模拟处理器(Simlet),帮助开发者在不依赖真实后端的情况下完成前端功能开发。 simlets 是simulated servers的…...

BT169-ASEMI无人机专用功率器件BT169

编辑&#xff1a;ll BT169-ASEMI无人机专用功率器件BT169 型号&#xff1a;BT169 品牌&#xff1a;ASEMI 封装&#xff1a;SOT-23 批号&#xff1a;最新 引脚数量&#xff1a;3 特性&#xff1a;单向可控硅 工作温度&#xff1a;-40℃~150℃ BT169单向可控硅&#xff…...

4月26日星期六今日早报简报微语报早读

4月26日星期六&#xff0c;农历三月廿九&#xff0c;早报#微语早读。 1、广州多条BRT相关线路将停运&#xff0c;全市BRT客运量较高峰时大幅下降&#xff1b; 2、国务院批复&#xff1a;同意在海南全岛等15地设立跨境电商综合试验区&#xff1b; 3、我国首次实现地月距离尺度…...

如何将 sNp 文件导入并绘制到 AEDT (HFSS)

导入 sNp 文件 打开您的项目&#xff0c;右键单击 “Result” 绘制结果 导入后&#xff0c;用户可以选择它进行打印。请参阅下面的示例。要点&#xff1a;确保从 Solution 中选择它。...

Shell脚本-for循环应用案例

在Shell脚本编程中&#xff0c;for循环是一种强大的工具&#xff0c;用于处理重复性任务。无论是批量处理文件、遍历目录内容还是简单的计数任务&#xff0c;for循环都能提供简洁而有效的解决方案。本文将通过几个实际的应用案例来展示如何使用for循环解决具体的编程问题。 案…...

MATLAB基础应用精讲-【基础知识篇】发布和共享 MATLAB 代码

目录 MATLAB发布代码---生成文档pdf 分节符对发布文件的分节 实时脚本 Matlab workspace与m脚本数据共享 发布和共享 MATLAB 代码 在实时编辑器中创建和共享实时脚本 发布 MATLAB 代码文件 (.m) 添加帮助和创建文档 发布 MATLAB 代码文件 (.m) 可创建包括您的代码、注释…...

Shell脚本-while循环语法结构

在Shell脚本编程中&#xff0c;while循环是一种重要的流程控制语句&#xff0c;它允许我们重复执行一段代码&#xff0c;直到指定的条件不再满足为止。与for循环不同&#xff0c;while循环通常用于条件驱动的迭代&#xff0c;而不是基于列表或范围的迭代。本文将详细介绍Shell脚…...

Java基础第四章、面向对象

一、成员变量 示例&#xff1a; 二、JVM内存模型 类变量就是静态变量 三、构造方法 默认构造方法、定义的构造方法(不含参数、含参数) 构造方法重载&#xff1a; this关键字 this关键字应用&#xff1a;对构造方法进行复用&#xff0c;必须放在第一行 四、面向对象的三大特征 1…...

【基础IO上】复习C语言文件接口 | 学习系统文件接口 | 认识文件描述符 | Linux系统下,一切皆文件 | 重定向原理

1.关于文件的预备知识 1.1 文件的宏观理解 广义上理解&#xff0c;键盘、显示器等都是文件&#xff0c;因为我们说过“Linux下&#xff0c;一切皆文件”&#xff0c;当然我们现在对于这句话的理解是片面的&#xff1b;狭义上理解&#xff0c;文件在磁盘上&#xff0c;磁盘是一…...

linux离线部署open-metadata

OpenMetadata 环境及离线资源关闭防火墙禁止防火墙关闭 SELinux 创建用户安装JDK安装mysql安装Elasticsearch安装open-metadata 环境及离线资源 系统&#xff1a;CentOS Linux release 7.9.2009 (Core) JDK&#xff1a;17 Mysql&#xff1a; 8.0 OpenMetadata&#xff1a;1.6.…...

Exposure Adjusted Incidence Rate (EAIR) 暴露调整发病率:精准量化疾病风险

1. 核心概念 1.1 传统发病率的局限性 1.1.1 公式与定义 传统发病率公式为新发病例数除以总人口数乘以观察时间。例如在某社区观察1年,有10例新发病例,总人口1000人,发病率即为10/10001=0.01。 此公式假设所有个体暴露时间和风险相同,但实际中个体差异大,如部分人暴露时间…...

信令与流程分析

WebRTC是h5支持的重要特征之一&#xff0c;有了它&#xff0c;不再需要借助音视频相关的客户端&#xff0c;直接通过浏览器的Web页面就可以实现音视频聊天功能。 WebRTC项目是开源的&#xff0c;我们可以借助WebRTC&#xff0c;构建自己的音视频聊缇娜功能。无论是前端JS的Web…...

声音分离人声和配乐base,vocals,drums -从头设计数字生命第6课, demucs——仙盟创梦IDE

demucs -n htdemucs --two-stemsvocals 未来之窗.mp3 demucs -n htdemucs --shifts5 之.mp3demucs -n htdemucs --shifts5 -o wlzcoutspl 未来之窗.mp3 伴奏提取人声分离技术具有多方面的重大意义&#xff0c;主要体现在以下几个领域&#xff1a; 音乐创作与制作 创作便利…...

Chrmo手动同步数据

地址栏输入 chrome://sync-internals分别点击这2个按钮即可触发手动同步...

【Dify系列教程重置精品版】第1课 相关概念介绍

文章目录 一、Dify是什么二、Dify有什么用三、如何玩转Dify?从螺丝刀到机甲战士的进阶指南官方网站:https://dify.ai github地址:https://github.com/langgenius/dify 一、Dify是什么 Dify(D​​efine + ​​I​​mplement + ​​F​​or ​​Y​​ou)。这是一款开源的大…...

【HTTP通信:生活中的邮局之旅】

HTTP通信&#xff1a;生活中的邮局之旅 HTTP通信就像是现代社会的邮政系统&#xff0c;让信息能够在互联网的城市间穿梭。下面我将用邮局比喻和图表来解释这个过程&#xff0c;以及它在现代应用中的重要性。 HTTP通信的旅程图解 #mermaid-svg-gC3zCsPpsFcq3sy3 {font-family:…...

Operating System 实验二 内存管理实验

目录 实验目标: 实验设备: 实验内容: (1)验证FIFO和Stack LRU页面置换算法 【代码(注释率不低于30%)】 【实验过程(截图)】 【结论】 (2)分别用FIFO和Stack LRU页置换算法,自己设定一个页面引用序列,绘制页错误次数和可用页帧总数的曲线并对比(可用Excel绘…...

深入解析YOLO v1:实时目标检测的开山之作

目录 YOLO v1 算法详解​ ​1. 核心思想​ ​2. 算法优势​ ​3. 网络结构&#xff08;Unified Detection&#xff09;​​ ​4. 关键创新​ ​5. 结构示意图&#xff08;Fig1&#xff09;​ Confidence Score 的计算​ 类别概率与 Bounding Box 的关系​ 后处理&…...

windows作业job介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、作业job是什么&#xff1f;二、使用步骤1.代码示例 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; winapi网站&#xff1a; h…...

POLARIS土壤相关数据集

POLARIS相关数据集属于杜克大学&#xff08;Duke University&#xff09;土木与环境工程系&#xff08;CEE&#xff09;的水文学研究团队。该团队有三个总体主题&#xff1a;1&#xff09; 改善地球系统模型中地表异质性的表示&#xff0c;2&#xff09; 利用环境数据来描述在陆…...

【Harmony OS】组件

目录 组件概述 组件常用属性 系统内置组件 Text TextArea 多行文本输入框组件 TextInput 文本输入框 Button Image 图片组件&#xff0c;支持本地图片和网络图片 Radio 单选框 Checkbox 复选框 Blank 空白填充组件 Divider 分隔符 PatternLock 图案密码锁组件 Prog…...

找出字符串中第一个匹配项的下标

题目&#xff1a;28. 找出字符串中第一个匹配项的下标 给你两个字符串 haystack 和 needle&#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1。 …...

专家系统的知识获取、检测与组织管理——基于《人工智能原理与方法》的深度解析

前文我们已经了解了专家系统的基本概念和一般结构&#xff0c;系统中有专业的知识才是专家系统的关键&#xff0c;接下来对专家系统中的知识是如何获取、检测、组织和管理的进行探讨。 1.专家系统的基本概念&#xff1a;专家系统的基本概念解析——基于《人工智能原理与方法》…...

BUUCTF-[GWCTF 2019]re3

[GWCTF 2019]re3 查壳&#xff0c;64位无壳 然后进去发现主函数也比较简单&#xff0c;主要是一个长度校验&#xff0c;然后有一个mprotect函数&#xff0c;说明应该又是Smc&#xff0c;然后我们用脚本还原sub_402219函数处的代码 import idc addr0x00402219 size224 for …...

基准指数选股策略思路

一种基于Python和聚宽平台的量化交易策略&#xff0c;主要包含以下内容&#xff1a; 1. 导入必要的库 - 导入jqdata和jqfactor库用于数据获取和因子计算。 - 导入numpy和pandas库用于数据处理。 2. 初始化函数 - 设置基准指数为沪深300指数。 - 配置交易参数&#xff0c;如使用…...

【阿里云大模型高级工程师ACP习题集】2.5 优化RAG应用提升问答准确度(⭐️⭐️⭐️ 重点章节!!!)

习题集 【单选题】在RAG应用的文档解析与切片阶段,若遇到文档类型不统一,部分格式的文档不支持解析的问题,以下哪种解决方式不可行?( ) A. 开发对应格式的解析器 B. 转换文档格式 C. 直接忽略该类型文档 D. 改进现有解析器以支持更多格式 【多选题】在选择向量数据库时,…...

【torch\huggingface默认下载路径修改】.cache/torch/ 或 .cache/huggingface

问题 服务器的硬盘空间是有限的&#xff0c;系统上的固态硬盘空间又比较小&#xff0c;在跑深度学习模型的时候经常有默认下载权重的操作&#xff0c;不管是torch或者huggingface&#xff0c;如果不加管理&#xff0c;所有的权重都放在home/user/.cache 里面&#xff0c;迟早会…...

SpringBoot 常用注解大全

SpringBoot 常用注解大全 一、核心注解 1. 启动类注解 SpringBootApplication&#xff1a;组合注解&#xff0c;包含以下三个注解 Configuration&#xff1a;标记该类为配置类EnableAutoConfiguration&#xff1a;启用自动配置ComponentScan&#xff1a;组件扫描 2. 配置相…...

【器件专题1——IGBT第2讲】IGBT 基本工作原理:从结构到特性,一文解析 “电力电子心脏” 的核心机制

IGBT&#xff08;绝缘栅双极型晶体管&#xff0c;Insulated Gate Bipolar Transistor&#xff09;作为现代电力电子领域的核心器件&#xff0c;其工作原理融合了 MOSFET 的高效控制优势与 BJT 的大功率处理能力。本文从物理结构、导通 / 关断机制、核心特性等维度&#xff0c;深…...

再谈String

1、字符串常量池 1.1 创建对象的思考 下面是两种创建字符串对象的代码 public static void main1(String[] args) {String s1 "hello";String s2 "hello";System.out.println(s1 s2);//trueString s3 new String("hello");String s4 new …...

语音合成之五语音合成中的“一对多”问题主流模型解决方案分析

语音合成中的“一对多”问题主流模型解决方案分析 引言“一对多”指的是什么&#xff1f;优秀开源模型的方法CosyvoiceSparkTTSLlaSA TTSVITS 引言 TTS系统旨在模仿人类的自然语音&#xff0c;但其核心面临着一个固有的挑战&#xff0c;即“一对多”问题 。这意味着对于给定的…...

嵌入式:Linux系统应用程序(APP)启动参数及其规则详解

在 systemd 的服务单元文件中&#xff0c;[Service] 部分用于定义服务的启动、停止、重启等操作&#xff0c;以及服务的运行环境和参数。以下是 [Service] 部分常见参数及其规则的详细介绍&#xff1a; 服务类型相关参数 **Type** **作用**&#xff1a;指定服务的启动类型&…...

25%甘油(灭菌)保存菌液以及10%甘油(普通)保存蛋白的原理及操作-实验操作系列-010

01 甘油保菌实验原理 1. 渗透压调节 甘油作为渗透压调节剂&#xff0c;能显著降低水的结冰温度&#xff0c;防止低温环境中细菌细胞内冰晶的形成。冰晶会破坏细胞膜&#xff0c;从而损伤细胞的完整性。甘油能够减少冰晶的生成&#xff0c;维持细胞结构的稳定&#xff0c;保护…...

影楼精修-手部青筋祛除算法解析

注意&#xff1a;本文样例图片为了避免侵权&#xff0c;均使用AIGC生成&#xff1b; 手部青筋祛除科普 手部青筋祛除是影楼精修中一个非常精细的工作&#xff0c;需要较高的修图技巧&#xff0c;目前市面上很少有自动化的青筋祛除功能的&#xff0c;而像素蛋糕目测是第一个做到…...

【时时三省】Python 语言----函数

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,函数概念 为了实现某种功能而组织的语句集合 定义格式: def 函数名([参数])函数体def add_num(a,b):c = a + bprint(c)add_num(11, 22) def 是定义函数的关键字。定义函数时,需要注意以下问题: 1,不需要说…...

蜜罐管理和数据收集服务器:Modern Honey Network (MHN)

一、Modern Honey Network (MHN)介绍 Modern Honey Network (MHN) 是一个集中化的蜜罐管理和数据收集服务器。它旨在简化蜜罐的部署和管理&#xff0c;并提供一个简洁的 Web 界面来查看捕获的数据。 1、主要功能: 集中化管理: 通过一个中心服务器管理多个蜜罐传感器。快速部…...