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

【JVM】学习笔记

1. JVM概述

  • JVM是一个抽象的计算机,用于运行Java程序。它将Java字节码转化为特定平台的机器代码,确保Java程序具有跨平台性。

2. JVM架构

在这里插入图片描述

JVM的架构通常包括以下几个主要部分:
在这里插入图片描述

  • 类加载子系统(ClassLoader):负责加载.class文件。它通过类加载器将字节码加载到JVM内存中。
    • 启动类加载器(Bootstrap ClassLoader)
    • 扩展类加载器(Extension ClassLoader)
    • 系统类加载器(System ClassLoader)
  • 运行时数据区(Runtime Data Areas):JVM为运行中的Java程序分配的内存区域,包括:
    • 方法区(Method Area):存放类的结构信息(如类名、字段、方法等)。
    • 堆(Heap):存放所有的对象实例和数组。
    • Java栈(Java Stack):每个线程都有一个栈,存放局部变量和方法调用信息。
    • 程序计数器(PC Register):每个线程都有一个程序计数器,用于指示当前线程正在执行的字节码指令地址。
    • 本地方法栈(Native Method Stack):用于支持JVM执行本地方法(通常是通过JNI调用的C或C++代码)。

3. JVM的垃圾回收机制(GC)

JVM有自动的垃圾回收机制,负责回收不再使用的对象。垃圾回收的过程包括:

  • 堆的分代结构:堆内存分为新生代(Young Generation)和老年代(Old Generation)。
  • 垃圾回收算法
    • 标记-清除(Mark-and-Sweep)
    • 复制算法(Copying)
    • 标记-整理(Mark-and-Compact)
    • 分代收集(Generational Collection)
  • GC的触发:GC可以通过内存不足、系统调用等触发。

4. JVM的执行过程

  • 编译过程:Java源代码(.java)先被编译为字节码(.class),然后通过JVM的类加载器加载到内存。
  • 字节码执行
    • 解释执行(Interpreter):直接逐行解释执行字节码。
    • 即时编译(JIT Compiler):JVM将热点代码编译成机器代码,提高执行效率。
解释执行(Interpretation)

定义:解释执行是指逐行读取源代码,将其翻译成机器语言并执行的过程。每读取一行代码,就立即翻译并执行,而不是提前将整个程序翻译成机器语言。

类比:想象你正在读一本外语书(比如法语书),但你不懂法语。这时,你旁边有一个翻译官,他每翻一页,就读一句法语,然后翻译成你能理解的中文,你再根据中文来理解这句话的意思。这个过程就是解释执行——逐句翻译并执行。

Java示例

在早期的Java虚拟机(JVM)中,Java代码是逐行解释执行的。JVM读取Java字节码(一种中间代码),然后逐行翻译成机器语言并执行。这种方式的好处是简单直接,但缺点是执行效率相对较低,因为每次执行都需要翻译。

即时编译(Just-In-Time Compilation, JIT)

定义:即时编译是指将源代码或中间代码(如Java字节码)在运行时动态地翻译成机器语言,并存储在内存中以便后续快速执行的过程。与解释执行不同,JIT编译会提前编译部分或全部代码,以提高执行效率。

类比:继续上面的外语书类比。现在,你不再需要逐句翻译了,而是请了一个翻译团队,他们先把整本书翻译成中文,然后装订成册给你。这样,你就可以直接阅读中文版的书了,效率大大提高。这个过程就是即时编译——提前翻译并存储,以便后续快速执行。

Java示例

现代的JVM采用了JIT编译技术。当JVM运行Java程序时,它会分析代码的执行情况,识别出热点代码(即频繁执行的代码),然后将这些热点代码编译成机器语言并存储在内存中。这样,当这些代码再次被执行时,就可以直接执行机器语言了,大大提高了执行效率。

深入理解
  1. 解释执行与JIT编译的区别

    • 解释执行是逐行翻译并执行,适合简单直接但效率较低的场景。
    • JIT编译是提前翻译并存储,适合需要高效执行的场景。
  2. JIT编译的优势

    • 提高执行效率:通过提前编译并存储机器语言,减少了翻译的开销。
    • 优化性能:JIT编译器可以根据运行时的情况进行优化,如内联函数、循环展开等。
    • 动态适应性:JIT编译器可以监控代码的执行情况,并根据需要动态调整编译策略。
  3. JIT编译的挑战

    • 编译开销:虽然JIT编译可以提高执行效率,但编译本身也需要一定的时间和资源开销。
    • 编译策略:如何选择合适的代码进行编译、何时进行编译等都是JIT编译器需要解决的问题。

5. JVM性能调优

  • 堆内存调优:通过调整-Xms(初始堆大小)和-Xmx(最大堆大小)来优化内存使用。
  • 垃圾回收调优:选择不同的垃圾回收器(如Serial GC、Parallel GC、G1 GC等),通过-XX:+UseG1GC等参数来调节。
  • JVM参数调优:使用-Xss调整每个线程的栈大小,使用-XX:+PrintGCDetails查看GC日志。

6. JVM中的多线程和内存模型

  • 内存模型(Java Memory Model, JMM):定义了在多线程环境下,如何确保不同线程之间对共享变量的可见性和有序性。
  • 同步机制:通过synchronized关键字和volatile变量来保证线程安全。

7. JVM常见问题

  • 内存泄漏:即程序不断申请内存但未及时释放,导致内存占用不断增加。
  • OOM(OutOfMemoryError):内存溢出,通常发生在堆内存不足时。
  • 性能瓶颈:如GC频繁、JVM启动慢、JIT编译性能差等。

8. JVM与其他虚拟机的区别

  • Java与其他虚拟机(如Python的CPython、.NET的CLR等)相比,JVM的最大特点是字节码中立性,能够跨平台运行。

9. JVM的版本和工具

  • JVM版本:不同的JVM实现可能会有所不同,常见的有HotSpot(Oracle)、OpenJ9、GraalVM等。
  • 工具
    • jps:查看JVM进程。
    • jstack:查看线程堆栈。
    • jstat:查看JVM的运行状态。
    • jmap:查看堆的内存使用情况。

一、什么是直接内存?

直接内存(Direct Memory)并不是JVM运行时数据区的一部分,也不属于《Java虚拟机规范》中定义的内存区域。但它是Java程序在运行时经常使用的一块内存,也有可能引发OutOfMemoryError异常。

你可以把JVM管理的内存想象成一个大家庭,堆、方法区、虚拟机栈、本地方法栈和程序计数器都是这个家庭的成员,它们共同协作,支持Java程序的运行。而直接内存呢,就像是这个家庭旁边的一个邻居,虽然不属于这个家庭,但和这个家庭有着密切的联系,经常被这个家庭借用东西(内存)。

二、为什么使用直接内存?

  1. 高性能需求:直接内存的读写性能高于传统的JVM堆内存。这是因为,使用直接内存可以减少内存复制的次数。在进行大量数据的读写操作时,使用直接内存可以显著提高性能。
  2. NIO操作:Java NIO(New Input/Output)库通过使用直接内存来提升IO操作的吞吐量。直接内存允许Java程序直接访问操作系统的内存,从而减少了数据在系统缓冲区和Java堆缓冲区之间复制的开销。
  3. 资源共享:直接内存是操作系统内存的一部分,可以被操作系统和Java程序共享访问。这使得数据处理更加高效,因为数据不需要在不同的内存区域之间来回复制。
  4. 避免垃圾回收:直接内存不受JVM的垃圾回收机制影响。这意味着,使用直接内存可以减少由于垃圾回收导致的性能波动,对一些高性能应用场景尤为重要。

三、直接内存与JVM内存的关系

虽然直接内存不属于JVM管理的内存区域,但它在Java程序中扮演着重要的角色。你可以把JVM管理的内存看作是Java程序的一个私有空间,而直接内存则是Java程序和操作系统共享的一个公共空间。

当Java程序需要执行一些高性能的IO操作时,它会向操作系统申请一块直接内存。这块内存可以被Java程序和操作系统同时访问,从而提高了数据处理的效率。

四、直接内存的使用与释放

在Java中,你可以使用ByteBuffer.allocateDirect()方法来分配一块直接内存。这个方法会返回一个DirectByteBuffer对象,它作为这块直接内存的引用。

然而,需要注意的是,直接内存的释放并不是由JVM自动完成的。当你不再需要使用这块直接内存时,你需要显式地释放它。这通常是通过调用System.gc()方法来触发垃圾回收,然后依赖Unsafe类(这是一个底层类,通常不建议直接使用)的freeMemory方法来释放直接内存。但在实际应用中,更常见的是依赖Java NIO库的内部机制来管理和释放直接内存。

五、注意事项

  1. 内存限制:直接内存的分配不会受到JVM堆大小的限制,但它仍然会受到本机总内存(包括物理内存、SWAP分区或分页文件)大小以及处理器寻址空间的限制。因此,在分配直接内存时,你需要考虑到这些限制,以避免出现内存溢出的问题。
  2. 性能调优:虽然直接内存可以提高性能,但过度使用也可能导致性能下降。因此,你需要根据实际应用场景来合理分配和使用直接内存。

六、类比理解

为了更好地理解直接内存,我们可以把它比作一个快递中转站。当你需要寄送一个包裹时,你可以选择把包裹送到快递公司的中转站(直接内存),然后中转站会负责把包裹送到目的地(操作系统或Java程序)。这样,你就不需要亲自把包裹送到目的地了,从而节省了时间和精力。同样地,在Java程序中,使用直接内存可以节省数据复制的时间和内存开销,提高程序的性能。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

说一下类装载的执行过程?

类加载的执行过程

在Java中,类加载指的是将类的字节码从磁盘加载到内存中的过程。理解这个过程,可以帮助我们更好地掌握Java程序的执行机制,尤其是在开发中遇到与类加载相关的问题时,可以更有效地排查和解决问题。

类加载过程的类比

想象一下,类加载就像你去图书馆借书的过程:

  1. 书馆员(类加载器):图书馆中的书馆员就像是Java中的类加载器(ClassLoader)。当你需要某本书时,你告诉书馆员书名(类名),书馆员会负责从图书馆的书架上把那本书拿给你。

  2. 书架(JAR包、类路径):图书馆中的书架就像是存放类文件的地方。在Java中,这些地方就是类路径(Classpath)或者是JAR包。当你请求一本书(类)时,书馆员会根据书名(类名)去书架上找到对应的书。

  3. 借书的过程(类的加载、链接、初始化):在你借书的过程中,书馆员不仅会拿到书,还会帮你做好一些准备工作,比如检查书籍是否损坏(验证类的有效性),是否需要进行排队(初始化类)。这相当于Java类加载过程中的加载、链接、初始化步骤。

Java类加载的三个步骤

Java中的类加载过程可以分为 加载(Loading)链接(Linking)初始化(Initialization) 三个阶段。我们详细地解释这三个步骤:

1. 加载(Loading)

加载是指类加载器找到类的字节码并将其加载到内存中的过程。就像书馆员找到了指定书名的书并准备好借给你。

  • 过程: 类加载器根据类的全限定名(例如:com.example.MyClass)在类路径中查找对应的字节码文件(.class文件),并将其加载到JVM的内存中。
  • 关键点: 类加载器会返回一个Class对象,表示这个类的结构和定义。
2. 链接(Linking)

链接的目的是将类的字节码与JVM运行时的数据结构绑定在一起。这个过程可以分为三个步骤:

  • 验证(Verification):检查字节码文件是否符合JVM规范,确保字节码没有被篡改,不会导致JVM崩溃或出现异常行为。就像书馆员确认书籍是否破损。

  • 准备(Preparation):为类的静态变量分配内存,并赋予默认值。例如,静态变量int x;会在准备阶段分配内存并赋值为0。

  • 解析(Resolution):将类中引用的符号(例如方法调用、字段引用等)解析为内存中的地址或实际对象。例如,将类中的方法调用指向实际的方法实现。

3. 初始化(Initialization)

初始化是类加载过程中的最后一步,指的是在类加载完成后执行静态代码块和静态变量的初始化。

  • 过程: 在类加载并通过验证和解析后,JVM会执行类中的静态代码块,初始化静态变量。每个类只会被初始化一次。

  • 关键点: 如果一个类有静态代码块(如static {}),它将在类加载完成后执行。比如:

    class MyClass {static {System.out.println("类初始化");}
    }
    

类加载器的工作

在Java中,类加载器(ClassLoader)是负责加载类的对象。Java有几个重要的类加载器,它们在加载类时的职责不同:

  1. Bootstrap ClassLoader(引导类加载器):负责加载Java核心类库(如java.lang.*包中的类),它是由JVM自带的,属于C++实现的。

  2. Extension ClassLoader(扩展类加载器):负责加载Java扩展库中的类(jre/lib/ext目录下的类)。

  3. System ClassLoader(系统类加载器):负责加载类路径(Classpath)下的类。通常我们使用的类都会由系统类加载器加载。

类加载的过程图示

  1. 请求类:例如,程序中调用new MyClass()
  2. 查找类:系统类加载器首先会查找MyClass类,找不到就交给上一级加载器(比如扩展类加载器)。
  3. 加载类:如果类存在于类路径中,加载器会将它加载到JVM中。
  4. 链接:加载完成后,进行验证、准备和解析。
  5. 初始化:最后执行静态初始化代码,类准备就绪,可以使用。

类加载的特殊情况

  1. 懒加载(Lazy Loading):Java中的类是按需加载的,意味着类只有在第一次使用时才会被加载,而不是在程序启动时就加载所有类。例如,只有在调用MyClass的构造函数时,MyClass类才会被加载到JVM内存中。

  2. 类加载器的父子关系:Java采用委派模型(Parent Delegation Model)来加载类,意味着子加载器在加载类时,会先委托给父加载器,如果父加载器找不到,才由子加载器负责加载。

总结

类加载过程可以类比为图书馆借书的过程,书馆员负责找到书、检查书籍并借给你。在Java中,类加载涉及三个步骤:加载、链接和初始化。每个步骤都有其独特的作用和过程。在实际开发中,我们通常需要了解如何通过类加载器来管理和加载不同的类,尤其是在复杂的企业应用中。

什么时候可以被垃圾回收?

在这里插入图片描述

哪些对象可以做为GC root?

在Java中,GC(垃圾收集)根对象是垃圾收集器在确定哪些对象可以被回收时开始搜索的起点。为了通俗易懂地解释这个问题,我们可以用一种类比的方法。
想象一下,你有一个非常大的仓库,里面堆满了各种箱子(对象)。这些箱子之间有一些绳子(引用)连接着。如果你要清理仓库,你肯定不想随意扔掉箱子,因为有些箱子可能还很重要。所以,你需要找到那些特别重要的箱子,也就是没有人拉的箱子,这些就可以被认为是垃圾,可以清理掉。
在Java中,GC根对象就像是那些被固定在墙上的箱子,或者是那些被外界直接持有的箱子。它们包括:

  1. 局部变量:就像你手中拿着的箱子,只要你的手(局部变量)还拿着它,这个箱子(对象)就不能被清理。
  2. 活跃线程:就像仓库中的工人,只要工人(线程)还在工作,他手中和需要的工具(对象)就不能被清理。
  3. 静态变量:就像仓库中的货架,只要货架(类)还在,放在上面的箱子(静态变量)也不能被清理。
  4. JNI(Java Native Interface)引用:就像仓库中的一些特殊箱子,被外部系统(如本地代码)直接使用,只要外部系统还需要,这些箱子也不能被清理。
  5. 系统类加载器加载的类:就像仓库的基础设施,如灯光、货架等,这些都是由仓库主人(系统类加载器)提供的,只要仓库还在运营,这些基础设施(类)就不能被清理。
    垃圾收集器会从这些GC根对象开始,检查所有连接的箱子(对象),找出那些没有被任何绳子(引用)连接的箱子,这些箱子就是垃圾,可以被清理。这个过程就是Java中的垃圾收集。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

【JVM】学习笔记

1. JVM概述 JVM是一个抽象的计算机,用于运行Java程序。它将Java字节码转化为特定平台的机器代码,确保Java程序具有跨平台性。 2. JVM架构 JVM的架构通常包括以下几个主要部分: 类加载子系统(ClassLoader)&#xff…...

物流项目第五期(运费计算实现、责任链设计模式运用)

前四期: 物流项目第一期(登录业务)-CSDN博客 物流项目第二期(用户端登录与双token三验证)-CSDN博客 物流项目第三期(统一网关、工厂模式运用)-CSDN博客 物流项目第四期(运费模板列…...

PrintStream PrintWriter Java 打印流

使用场景​: 代替 System.out 输出日志(比如 System.setOut(printStream))需要输出各种类型(如 println(123)、println("hello")) 常用方法​: print(), println() → 支持所有基本类型和对象pr…...

前端excel表格解析为json,并模仿excel显示

前端环境&#xff1a;elementUI vue2 <style lang"scss" scoped> 页面效果 jsondata为mock数据&#xff0c;为方便调试其内容可清空&#xff0c;首行&#xff08;字母坐标&#xff09;随数据内容自动变化&#xff0c;首列也是一样&#xff0c;模拟excel …...

NumPy 2.x 完全指南【十六】分割数组

文章目录 1. 数组分割1.1 split1.2 array_split1.3 vsplit1.4 hsplit1.5 dsplit1.6 unstack 1. 数组分割 数组分割是指将一个数组拆分为多个子数组的操作&#xff0c;常用于数据处理、并行计算、分块处理等场景。NumPy 提供了多种分割函数&#xff0c;允许用户沿不同方向&…...

vue3 + vite 使用tailwindcss

第一步&#xff1a;安装依赖 vite版本较低&#xff08;“vite”: “^4.0.0”&#xff09;所以就使用低版本的tailwindcss npm install -D tailwindcss3.4.1 postcss autoprefixer第二步&#xff1a;配置文件生成 npx tailwindcss init -p会自动生成两个文件postcss.config.js和…...

K个一组链表翻转

目录 1. 题意 2. 解题思路 3. 代码 1. 题意 给一个链表&#xff0c;按 k 进行翻转&#xff0c;也就是 k 2 &#xff0c;两两进行翻转&#xff0c;如果不够2则不动。 2. 解题思路 首先思考怎么翻转一个链表&#xff0c;反转链表&#xff1a;https://leetcode.cn/problems…...

逆向音乐APP:Python爬虫获取音乐榜单 (1)

1. 引言 在数字音乐时代&#xff0c;许多平台如音乐有榜单&#xff0c;限制非付费用户访问高音质或独家内容。然而&#xff0c;从技术研究的角度来看&#xff0c;我们可以通过逆向工程和Python爬虫技术解音乐的API接口&#xff0c;获取付费音乐的播放链接。 2. 技术准备 在当…...

STM32之串口通信WIFI上云

一、W模块的原理与应用 基本概念 如果打算让硬件设备可以通过云服务器进行通信&#xff08;数据上报/指令下发&#xff09;&#xff0c;像主流的云服务器有阿里云、腾讯云、华为云&#xff0c;以及其他物联网云平台&#xff1a;巴法云.......&#xff0c;硬件设备需要通过TCP…...

Python爬虫实战:获取天气网最近一周北京的天气数据,为日常出行做参考

1. 引言 随着互联网技术的发展,气象数据的获取与分析已成为智慧城市建设的重要组成部分。天气网作为权威的气象信息发布平台,其数据具有较高的准确性和实时性。然而,人工获取和分析天气数据效率低下,无法满足用户对精细化、个性化气象服务的需求。本文设计并实现了一套完整…...

【Java学习笔记】main方法

main 方法 一、深入理解 main 方法 特变注意&#xff01;&#xff01; 1. 在main()方法中&#xff0c;我们可以直接调用 mian 方法所在类的静态方法或静态属性 2. 不能访问该类中的非静态成员&#xff0c;必须创建该类的一个实例对象后&#xff0c;才能通过这个对象去访问类中…...

振动分析 - 献个宝

1.一个自制的振动能量分析工具 这个分析工具似乎真的定位到了故障的具体位置。 1.1对一组实验室虚拟信号的分析结果: 1.2 对现场真实数据的分析结果 依照边频带的调制,和边频的缝隙宽度,基本定位到问题。 追加几份待看的文档: 齿轮结构的频谱特征 - 知乎使用 FFT 获得…...

数学实验(Matlab绘图基础)

一、二维曲线的绘制 Matlab绘图原理 MATLAB绘图的核心原理基于数据点或函数离散化&#xff0c;通过描点连线生成图形。以下是具体解析&#xff1a; 1.数据离散化 二维数据通过&#xff08;x, y&#xff09;坐标点表示&#xff0c;连续函数需离散化处理&#xff08;如t0:0.01…...

【android bluetooth 协议分析 02】【bluetooth hal 层详解 3】【高通蓝牙hal主要流程介绍-上】

1. 背景 本节主要讨论 高通 蓝牙 hal 中&#xff0c;的一些流程。 看看你是否都清楚如下问题&#xff1a; 高通芯片电如何控制&#xff1f;串口是在哪里控制的&#xff1f;固件如何下载&#xff1f;初始化流程是怎么样的&#xff1f; 如果你已经对上述讨论的问题&#xff0c…...

Linux | tmux | 无法复制粘贴

问题&#xff1a;在Linux中使用tmux时&#xff0c;总是没法使用复制粘贴功能&#xff1b; 解决: 如果希望直接用鼠标选择并复制&#xff08;类似普通终端&#xff09;&#xff0c;可以&#xff1a; 在 ~/.tmux.conf 中添加&#xff1a;sh set -g mouse on;重新加载 tmux 配置…...

如何通过小贝加速实现精准网络故障排查

在日常使用电脑的过程中&#xff0c;我们常常需要监控系统运行状态、优化性能或排查网络问题。最近发现一款名为小贝加速的桌面工具&#xff0c;在此分享关于小贝加速如何实现网络监控。 系统优化 该工具提供了简洁明了的系统优化功能。通过扫描可以清理系统冗余文件、释放内存…...

Nginx 网站服务

目录 一&#xff1a;基于授权的访问控制 1&#xff1a;基于授权的访问控制简介 2&#xff1a;基于授权的访问控制步骤 二&#xff1a;基于客户端的访问控制 1&#xff1a;基于客户端的访问控制简介 2&#xff1a;基于客户端的访问控制步骤 三&#xff1a;Nginx 虚拟主机…...

Python 字典的用法和技巧

字典的创建与初始化 Python 字典是一种可变容器模型&#xff0c;可存储任意类型对象。字典的每个键值对用冒号分隔&#xff0c;键值对之间用逗号分隔&#xff0c;整个字典包括在花括号中。 # 创建一个空字典 empty_dict {}# 创建一个包含键值对的字典 my_dict {name: Alice…...

电力设备制造企业数字化转型路径研究:从生产优化到生态重构

电力设备制造业作为支撑能源革命的核心领域&#xff0c;其数字化转型不仅关乎企业降本增效&#xff0c;更是实现“双碳”目标与新型电力系统建设的关键抓手。本文基于行业标杆案例与实践经验&#xff0c;系统梳理电力设备企业数字化转型的五大核心路径。 一、生产流程智能化&a…...

初识GPU加速:如何利用GPU提升AI训练效率

随着人工智能(AI)和深度学习技术的快速发展,训练深度神经网络(DNN)已经变得越来越复杂和计算密集。传统的CPU已经无法满足大量计算任务的需求,因此,GPU(图形处理单元)成为了训练深度学习模型时的必备工具。本篇文章将介绍如何利用GPU加速AI训练效率,以及在使用GPU时应…...

深入解析异步编程:Java NIO、Python `async/await` 与 C# `async/await` 的对比

在现代编程中&#xff0c;异步编程已成为处理 I/O 密集型任务&#xff08;如网络请求、文件操作等&#xff09;的高效方式。不同的编程语言提供了各自的异步编程模型&#xff0c;以提高程序的性能和资源利用率。本文将深入解析 Java 的 NIO、Python 的 async/await 和 C# 的 as…...

阿里云数据盘级别

数据盘PL0、PL1、PL2和PL3的区别体现在性能、容量范围以及应用场景等方面。具体分析如下&#xff1a; 性能 PL0&#xff1a;单盘最大IOPS为10,000&#xff0c;最大吞吐量为180MB/s。适用于中小型MySQL和SQLServer等数据库场景&#xff0c;中小规模ELK日志集群&#xff0c;SAP和…...

使用 Spring AI Alibaba 集成阿里云百炼大模型应用

随着人工智能技术的飞速发展&#xff0c;大模型在各个领域的应用越来越广泛。阿里云百炼大模型提供了强大的语言理解和生成能力&#xff0c;但如何将其高效地集成到实际应用中&#xff0c;一直是开发者关注的焦点。本文将详细介绍如何使用 Spring AI Alibaba 集成阿里云百炼大模…...

阿里云合集(不定期更新)

一、阿里云申请免费域名证书流程&#xff1a;https://blog.csdn.net/humors221/article/details/143266059 二、阿里云发送国内短信怎样编程&#xff1a;https://blog.csdn.net/humors221/article/details/139544193 三、阿里云ECS服务器磁盘空间不足的几个文件&#xff1a;h…...

零基础设计模式——创建型模式 - 抽象工厂模式

第二部分&#xff1a;创建型模式 - 抽象工厂模式 (Abstract Factory Pattern) 我们已经学习了单例模式&#xff08;保证唯一实例&#xff09;和工厂方法模式&#xff08;延迟创建到子类&#xff09;。现在&#xff0c;我们来探讨创建型模式中更为复杂和强大的一个——抽象工厂…...

ConcurrentHashMap导致的死锁事故

事故现象 某线上服务共100台容器&#xff0c;第二天上午流量高峰期部分容器&#xff08;约10%&#xff09;cpu飙升&#xff0c;升至100%。 部分堆栈信息 堆栈信息如下如所示&#xff1a; 当前线程堆栈显示在JsonContext.get方法中调用computeIfAbsent&#xff0c;其Lambda表…...

Python高效网络爬虫开发指南

Python 网络爬虫入门与实战 一、引言 随着互联网数据的爆炸性增长&#xff0c;获取和分析这些数据变得越来越重要。网络爬虫作为数据采集的重要工具&#xff0c;在这其中扮演了不可或缺的角色。 二、环境搭建 首先我们需要安装Python环境以及一些必要的库&#xff1a; req…...

关于C++使用位运算交换变量值的分析

1、使用临时变量交换 交换变量的值&#xff0c;最常见的方法就是用临时变量。 void swap1(int& a, int& b){int c a;a b;b c; }清晰明了。 2、位运算版 对于整数类型&#xff0c;相信很多人都见过下面方法&#xff0c;可以使用位运算&#xff0c;从而不借用临时…...

06 接口自动化-框架封装思想建立之httprunner框架(下)

文章目录 一、httprunner如何实现数据驱动第一种&#xff1a;直接在脚本里面指定参数列表&#xff0c;最简单。适合于参数比较少的情况。第二种&#xff1a;使用CSV文件&#xff0c;适合于参数比较大的情况。第三种方式&#xff1a;使用函数生成数据&#xff0c;适用于数据变化…...

Dirsearch 深度使用教程:从基础扫描到携带 Cookie 探索网站

在网络安全测试和网站信息收集过程中&#xff0c;Dirsearch 是一款强大的开源工具&#xff0c;能够快速扫描网站&#xff0c;找出潜在的目录和文件。而当面对需要登录才能访问的网站资源时&#xff0c;通过携带 Cookie 扫描&#xff0c;Dirsearch 可以模拟已登录状态&#xff0…...

垃圾回收(GC)基础原理全面解析

掌握 GC 原理,是高效 Java 开发的第一步! 前言 垃圾回收(Garbage Collection,简称 GC)是 Java 的核心优势之一,它让开发者无需手动管理内存,极大降低了内存泄露和悬挂指针的风险。但当应用进入高并发、大数据量的场景时,GC 机制本身反而会成为性能瓶颈。 理解 GC 的原…...

海康NVR录像回放SDK原始流转FLV视频流:基于Java的流媒体转码(无需安装第三方插件ffmpeg)

wlinker-video-monitor 代码地址&#xff1a;https://gitee.com/wlinker/wlinker-video-monitor 背景与需求 在安防监控、智能楼宇等场景中&#xff0c;海康威视设备作为行业主流硬件&#xff0c;常需要将录像回放功能集成到Web系统中。然而&#xff0c;海康设备的原始视频流…...

【项目】SpringBoot +MybatisPlus集成多数据源

引言 应项目需求&#xff0c;需要引入另外的Mysql数据库&#xff0c;但是项目已经引入一个Mysql&#xff0c;这时有几种方案 通过Dynamic-DataSource 框架&#xff0c;无缝集成 但是是动态切换数据源的&#xff0c;跟项目需求不符合&#xff0c;于是采取第二种通过自定义数据…...

Suricata 3规则介绍、以及使用

列出更新源列表&#xff08;有好多个规则源&#xff0c;后面有介绍的&#xff09; suricata-update list-sourcesName: sslbl/ja3-fingerprintsVendor: Abuse.chSummary: Abuse.ch Suricata JA3 Fingerprint RulesetLicense: CC0-1.0 Name: malsilo/win-malwareVendor: malsil…...

基于OpenCV的物体跟踪:CSRT算法

文章目录 引言一、系统概述二、CSRT算法简介三、核心代码解析1. 初始化跟踪器和摄像头2. 主循环结构3. 目标选择与跟踪初始化4. 目标跟踪与结果显示5. 资源释放 四、系统使用说明五、完整代码六、总结 引言 目标跟踪是计算机视觉领域的重要应用之一&#xff0c;广泛应用于视频…...

面向未来,遨游推出5G-A智能防爆对讲机等系列终端

从5G扬帆到5G-A启航&#xff0c;遨游通讯始终立于技术潮头。在通信技术加速向5G-A演进的关键节点&#xff0c;遨游通讯旗舰产品AORO M6 Pro智能防爆对讲机&#xff0c;不仅实现了芯片到系统架构的全面自主可控&#xff0c;更通过5G-A技术的高速率、低时延、广连接与通感一体能力…...

qt浏览文件支持惯性

#include <QApplication> #include <QListWidget> #include <QScroller> #include <QScrollerProperties>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建列表控件并添加示例项QListWidget listWidget;for (int i 0; i <…...

算子窗口操作

抠图 (提取图像感兴趣的区域) * 使用halcon 抠图* 窗体属性设设置: 设置窗体绘制图案的模式 magrin边框模式(只有一个边框) * fill填充模式(边框内部会有一个遮罩层) dev_set_draw (fill)* 设置颜色 dev_set_color (green) * 设置线宽dev_set_line_width (5)read_image (Im…...

如何提灯验车

✅ 重点  车标倾斜特别严重  导航定位不准  发动机顿挫异响  自动门把手关闭时异响  底盘有划痕和主驾位与扶手箱位置间隙过小磨损  蓝牙钥匙解锁异常&#xff0c;开关解锁不灵敏  空调无法制冷  灯罩有划痕  开启大灯就有嗡嗡嗡的异响 ✅ 一、文件与证件检…...

人工智能在生物医学研究中的创新应用

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其在生物医学领域的应用逐渐成为研究热点。AI不仅为生物医学研究提供了强大的工具&#xff0c;还在疾病诊断、药物研发、基因编辑等方面展现出巨大的潜力。本文将探讨人工智能在生物医学研究中的创新应用&…...

迁移学习实战:用预训练模型解决小样本图像分类

🚀 迁移学习实战:用预训练模型解决小样本图像分类(PyTorch实现) 当我们没有成千上万的训练样本时,如何训练一个表现良好的图像分类模型?答案是——迁移学习。本篇将带你用 PyTorch 快速上手迁移学习,用预训练模型(如 ResNet18)解决小样本分类问题。 🧠 一、什么是迁…...

html,js获取扫码设备的输入内容

<script type"text/javascript"><!-- window.onload function () {// 获取扫描的二维码内容 var code ""; var lastTime, nextTime; var lastCode, nextCode; document.onkeypress function (e) { nextCode e.which; ne…...

项目执行中缺乏风险管理,如何预防潜在问题?

要预防潜在问题&#xff0c;必须在项目执行中融入建立全面的风险识别机制、制定应对策略、实施动态监控、强化团队风险意识、定期评估与复盘。其中&#xff0c;建立全面的风险识别机制至关重要。项目初期若未进行系统性的风险识别&#xff0c;就很难在项目过程中及时应对变化&a…...

树形展示三级分类数据

vue3 实现多级分类_产品设计 平台端添加多个二级三级分类的页面-CSDN博客...

大模型如何助力数学可视化?

大家好&#xff0c;我是 i 学习的老章 在数学学习和教学中&#xff0c;将抽象概念可视化对于理解至关重要。Manim 是一个强大的数学动画引擎&#xff0c;由著名数学科普视频作者 3Blue1Brown 开发并广为人知。 老章较早之前就介绍过 manim&#xff1a;B 站上爆红的数学视频&a…...

什么是endpoints?

在 Kubernetes 中&#xff0c;Endpoints 是一个资源对象&#xff0c;它表示服务&#xff08;Service&#xff09;到 Pod 的网络连接。 Endpoints 的主要作用是将服务的虚拟 IP 地址映射到实际的 Pod IP 地址&#xff0c;从而实现服务发现和负载均衡。 1.Endpoints 的作用 服务…...

基于 Redis 实现短信验证码登录功能的完整方案

&#x1f9f1; 一、技术栈与依赖配置 使用 Spring Boot Redis 实现短信验证码登录&#xff0c;以下是推荐的 Maven 依赖&#xff1a; <dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><ar…...

监控易一体化运维:拥有全部核心技术,助力国产化信创运维

在数字化转型浪潮与信创产业蓬勃发展的当下&#xff0c;企业对运维系统的要求愈发严苛。随着数字化领域的巨大变迁&#xff0c;一款强大且适配信创环境的运维系统对企业的重要性不言而喻。今天&#xff0c;让我们一同深度剖析监控易系统在信创领域展现出的卓越优势。 信创产业&…...

微 PE , USM 魔术师两款 PE 对比

微 PE 和 USM 魔术师两款 PE 各有特点&#xff1a; 纯净度 微 PE&#xff1a;没有植入强制性、商业性软件和链接&#xff0c;也没有病毒和木马&#xff0c;非常纯净。USM 魔术师&#xff1a;同样无广告、无流氓、无捆绑、无后门&#xff0c;从官方途径下载能保证纯净度。 功能…...

测试模版1

本篇技术博文摘要 &#x1f31f; 引言 &#x1f4d8; 在这个变幻莫测、快速发展的技术时代&#xff0c;与时俱进是每个IT工程师的必修课。我是盛透侧视攻城狮&#xff0c;一名什么都会一丢丢的网络安全工程师&#xff0c;也是众多技术社区的活跃成员以及多家大厂官方认可人员&a…...