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

【JVM】运行时数据区域

文章目录

  • 说明
  • 程序计数器
  • 虚拟机栈
  • 本地方法栈
  • Java堆
  • 方法区
  • 运行时常量池
  • 直接内存

说明

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。如下图,这篇文章简单介绍下各个区域的作用

image-20230823011318817

程序计数器

程序计数器(Program Counter,简称PC)是Java虚拟机(JVM)中的一块内存区域,它是一种较小的、无法被线程切换所影响的内存空间。每个线程都有自己独立的程序计数器,用于存储当前线程执行的字节码指令的地址。

程序计数器在JVM中有以下几个主要作用:

  1. 线程控制:程序计数器指示了每个线程将要执行的指令地址。在线程切换时,JVM能够恢复到正确的执行点。
  2. 字节码解释器:在Java中,代码被编译成字节码(bytecode)。程序计数器用于跟踪当前执行的字节码指令,以便字节码解释器能够逐条执行指令。
  3. 异常处理:当Java程序抛出异常时,JVM会根据异常处理表来确定异常处理代码的位置。程序计数器在这里发挥了关键作用,帮助JVM准确位处理代码的位置。
  4. 线程私有:每个线程都有自己独立的程序计数器。这使得线程能够独立执行,不受其他线程影响。

简单来说程序计数器就是下一条指令要执行的地址,每个线程都会具有,线程私有。

虚拟机栈

虚拟机栈(Virtual Machine Stack)是Java虚拟机(JVM)为每个线程私有创建的一块内存区域,用于存储方法执行过程中的局部变量、操作数栈、动态链接和方法出口等信息。每个方法在执行时都会创建一个栈帧(Stack Frame)并入栈,方法执行完毕后栈帧出栈。栈帧包含了方法的局部变量、操作数栈、返回地址等信息。

虚拟机栈具有以下几个主要特点:

  1. 线程私有:每个线程都有自己独立的虚拟机栈,这保证了多线程环境下方法的执行状态不会相互干扰。
  2. 方法调用:虚拟机栈用于保存方法调用的状态。每次方法调用时,会在虚拟机栈上创建一个栈帧,栈帧包含了方法的局部变量、操作数栈等信息。
  3. 局部变量和操作数栈:栈帧内部包含局部变量表和操作数栈。局部变量表用于存储方法中的局部变量,而操作数栈用于执行操作码(字节码指令)时的临时存储。
  4. 异常处理:虚拟机栈也参与异常处理机制。当方法内部发生异常而未被捕获时,虚拟机会查找虚拟机栈来定位异常发生的位置,以便于异常处理。

需要注意的是,虚拟机栈的大小是可以配置的,并且栈空间有可能会发生栈溢出(Stack Overflow)异常。栈溢出通常是由于递归调用深度过大或者局部变量表和操作数栈占用的空间过大导致的。

简单来说每个方法就对应一个栈帧,方法调用和执行就代表了栈帧的出栈和入栈操作,栈帧里面就存放了方法的一些必要信息。

本地方法栈

本地方法栈(Native Method Stack)与虚拟机栈类似,是Java虚拟机为执行本地方法(Native Method)而准备的一块内存区域。本地方法指的是用非Java语言(通常是C、C++等)编写的方法,这些方法可以通过Java的本地接口(JNI,Java Native Interface)在Java程序中调用。

本地方法栈是为了支持Java程序与非Java本地方法之间的交互而存在的内存区域,类似于虚拟机栈,但用于本地方法的调用和执行。

Java堆

当我们在编写Java程序时,所有的对象实例(比如类的实例、数组等)都需要在内存中存储。Java堆就是用来存储这些对象的地方。它是一个非常大的内存区域,被所有线程共享。

关键点如下:

  1. 对象存储:每次使用 new 关键字创建一个对象时,这个对象都会被分配到Java堆中。无论是我们自己定义的类,还是Java内置的类,都会在堆上分配内存。

  2. 垃圾回收:Java堆是被垃圾回收器管理的。当一个对象不再被程序引用,也就是没有变量指向它时,垃圾回收器会回收这个对象所占用的内存,以便为将来的对象分配空间。

  3. 分代结构:Java堆通常被划分为不同的“代”,比如新生代和老年代。新创建的对象会被分配到新生代,而存活时间较长的对象会被移到老年代。这种分代结构有助于提高垃圾回收的效率。

  4. 内存设置:我们可以通过命令行参数来设置Java堆的初始大小和最大大小。这可以帮助我们优化程序的内存使用。

  5. 内存溢出:如果我们的程序创建了过多的对象,超过了堆的可用空间,就会引发内存溢出错误,导致程序崩溃。

总之,Java堆是用来存储Java程序中的对象的内存区域,垃圾回收器会在这里管理对象的分配和释放,从而保持程序的正常运行。

方法区

方法区(Method Area)是Java虚拟机中的一块内存区域,用于存储类的元数据信息、静态变量、常量池、方法代码等。它是所有线程共享的,与堆一样,也是Java虚拟机的一部分。

以下是关于方法区的一些要点:

  1. 元数据信息:方法区主要用于存储类的元数据信息,包括类的名称、访问修饰符、字段信息、方法信息等。这些信息在运行时被Java虚拟机使用,例如在类加载、字节码解析和方法调用等时候。

  2. 静态变量:静态变量,也叫类变量,被存储在方法区中。这些变量在类加载的过程中被创建并分配内存,它们在整个类的生命周期内保持不变。

  3. 常量池:常量池是一种存储在方法区中的数据结构,用于存放编译时生成的各种字面量和符号引用。它包括字符串常量、类和接口的全限定名、字段和方法的名称和描述符等信息。

  4. 方法代码:方法区也存储类的方法代码。这些代码在类被调用时被执行。方法区中存储的方法字节码被解释器或者即时编译器(如HotSpot的C2编译器)执行。

  5. 运行时常量池:在Java 7 及之前的版本,常量池也包括一部分运行时生成的常量。但从Java 8 开始,运行时常量池已经被移到堆中的一部分,称为运行时常量池。

  6. 内存溢出:方法区内存溢出错误通常被称为“永久代溢出”,这是因为在Java 7 及之前的版本中,方法区被实现为持久代。随着类加载和卸载的不断进行,方法区的空间也会被耗尽,导致程序崩溃。

需要注意的是,从Java 8 开始,方法区被元空间(Metaspace)所取代。元空间使用的是本地内存而非虚拟机内存,因此它更加灵活,避免了持久代溢出等问题。

总之,方法区是存储类的元数据、静态变量、常量池和方法代码等信息的内存区域,是Java虚拟机重要的组成部分之一。

运行时常量池

当Java类文件被加载到内存中时,会创建一个运行时常量池(Runtime Constant Pool),它是类中常量的一种运行时表示。运行时常量池包含了从类文件的编译时常量池中提取出来的一部分内容,以及在运行时生成的常量。

编译时常量池是位于类文件中的,它包含了类中的各种常量,如字符串、数字、类名、方法名等。而运行时常量池是在类加载时被构建的,用于在程序运行期间支持常量的引用和操作。

运行时常量池不仅包含编译时常量池中的内容,还可能包括一些在运行时生成的常量。例如,字符串拼接的结果、动态方法调用等都可以在运行时常量池中得到体现。

需要注意的是,从Java 8 开始,常量池被移到元空间(Metaspace)中,取代了之前的永久代。元空间具有更大的灵活性,不再受到固定大小的限制。在这种情况下,运行时常量池仍然存在,但它与常量池的管理方式有所不同。

总之,运行时常量池是在类加载后构建的一种数据结构,包含了编译时常量池中的部分内容以及在运行时生成的常量,它为Java程序提供了常量引用和操作的支持。

直接内存

当我们在Java程序中使用内存时,通常会涉及到Java堆内存、栈内存等。而直接内存是一种与传统内存管理方式不同的内存分配方式,主要用于提高I/O操作的性能和效率。直接内存是一种用于提高I/O操作性能的内存分配方式,在Java NIO库中得到广泛应用。虽然它可以提供一些性能优势,但需要开发者自行管理分配和释放,以避免潜在的风险。

传统的Java内存管理方式中,Java堆内存的分配和释放都由JVM的垃圾回收机制进行管理。但是在一些特定场景下,特别是涉及到I/O操作的时候,传统的内存管理方式可能会导致性能问题。这时,直接内存可以作为一个媒介,充当了Java程序和操作系统之间的桥梁,以提高性能和效率。

传统的Java堆内存分配方式涉及以下步骤:

  1. 应用程序到Java堆内存的拷贝:当数据从应用程序传递到Java堆内存时,需要进行数据拷贝。
  2. Java堆内存到操作系统的拷贝:当执行I/O操作时,数据需要从Java堆内存复制到操作系统的内核缓冲区。
  3. 操作系统到Java堆内存的拷贝:I/O操作完成后,数据又需要从操作系统的内核缓冲区复制回Java堆内存。

而使用直接内存的情况下:

  1. 应用程序到直接内存的拷贝:当数据从应用程序传递到直接内存时,不需要进行数据拷贝,数据直接存储在直接内存中。
  2. 直接内存到操作系统的拷贝:当执行I/O操作时,数据可以直接从直接内存传递给操作系统的内核缓冲区,避免了数据复制。
  3. 操作系统到直接内存的拷贝:I/O操作完成后,数据可以直接从操作系统的内核缓冲区传递回直接内存,同样避免了数据复制。

当执行I/O操作时,数据可以直接从直接内存传递给操作系统的内核缓冲区,避免了数据复制。
3. 操作系统到直接内存的拷贝:I/O操作完成后,数据可以直接从操作系统的内核缓冲区传递回直接内存,同样避免了数据复制。

总之,使用直接内存可以减少数据在内存之间的复制,从而提高I/O操作的性能。这种方式特别适用于需要频繁进行大量I/O操作的场景,例如文件读写、网络传输等。然而,需要注意的是,直接内存的管理需要开发者自行负责,如果管理不当,可能会导致内存泄漏和其他问题。

相关文章:

【JVM】运行时数据区域

文章目录 说明程序计数器虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存 说明 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直…...

uniapp踩坑合集

1、onPullDownRefresh下拉刷新不生效 pages.json对应的style中enablePullDownRefresh设置为true,开启下拉刷新 {"path" : "pages/list/list","style" :{"navigationBarTitleText": "页面标题名称","enable…...

再JAVA中如何使用qsort对类进行排序?

目录 结论&#xff1a; 解析&#xff1a; 结论&#xff1a; import java.util.Arrays;class Person implements Comparable<Person>{public String name;public int age;public Person(String name, int age) {this.name name;this.age age;}Overridepublic Stri…...

docker安装clickhouse

安装 docker安装 创建clickhouse目录 mkdir -P /data/clickhouse/datamkdir -P /data/clickhouse/confmkdir -P /data/clickhouse/log 拉取镜像 这里直接拉取最新镜像, 如果需要某个特定版本, 则再拉取的时候指定版本号即可. docker pull clickhouse/clickhouse-server 启动临…...

解决`idea`中`database`工具查询起别名乱码问题

文章目录 解决idea中database工具查询起别名乱码问题场景复现如何解决方式一 设置编码方式二&#xff1a;修改字体 原因说明 解决idea中database工具查询起别名乱码问题 场景复现 使用Idea做查询的并且起别名出现了中文乱码 如何解决 方式一 设置编码 settings->输入框输…...

UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.5->2.3

目录 之前的文章&#xff1a; 1.5 Blend Attributes by Value 发射器更新 粒子生成 粒子更新 2.1 Static Beams ​编辑 发射器更新&#xff1a; 粒子生成 粒子更新 2.2 Dynamic Beams 没有开始模拟前的效果是&#xff1a; 开始模拟后的效果是&#xff1a; 发射器更新 …...

Docker 容器数据卷

Docker挂载主机目录访问如果出现cannot open directory .: Permission denied 解决办法&#xff1a;在挂载目录后多加一个--privilegedtrue参数即可 如果是CentOS7安全模块会比之前系统版本加强&#xff0c;不安全的会先禁止&#xff0c;所以目录挂载的情况被默认为不安全的行…...

STM32--MPU6050与I2C外设

文章目录 前言MPU6050参数电路MPU6050框图 IIC外设框图 IIC的基本结构软件IIC实现MPU6050硬件IIC实现MPU6050 前言 在51单片机专栏中&#xff0c;用过I2C通信来进行实现AT24C02的数据存储&#xff1b; 里面介绍的是利用程序的编程来实现I2C的时序&#xff0c;进而实现AT24C02与…...

项目管理实战笔记1:项目管理常识

序 看了下极客时间的《项目管理实战》&#xff0c;觉得跟之前学习PMP的标准资料还是有所侧重。重新整理下&#xff0c;相比书上繁杂的知识&#xff0c;这个更通俗易懂。 1 角色转换&#xff1a;三大误区 误区1&#xff1a;事必躬亲 自己做事情是可控的&#xff0c;做项目依赖…...

时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化

时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SVMD分解算法&#xff0c;分解结果可视化&#xff0c;MATLAB程序&#xff…...

阿里云访问端口被限制解决方法记录

阿里云服务器&#xff0c;80端口可以访问&#xff0c;但是加入了安全组端口8080 通过公网访问改端口策略&#xff0c;发现不能被访问 问题出在防火墙&#xff0c;需要重置一下 解决方法&#xff1a; 在运行的服务器上执行如下命令&#xff1a; # iptables -A INPUT -j ACCEP…...

antd5源码调试环境启动(MacOS)

将源码下载至本地 这里antd5 版本是5.8.3 $ git clone gitgithub.com:ant-design/ant-design.git $ cd ant-design $ npm install $ npm start前提&#xff1a;安装python3、node版本18.14.0(这是本人当前下载的版本&#xff09; python3安装教程可参考&#xff1a;https://…...

单片机使用基于时间片轮询系统的-状态机-[1]

目的&#xff1a;【1】用C实现一个超轻量化任务管理系统 【2】具有任务suspend, resume, runonce ,auto loop ,task_delay功能 【3】易于移植&#xff0c;不涉及硬件底层。 示例例码&#xff1a; 利用switch case结构实现了单一层的 task_delay功能。弊端就是switch..case不…...

前端开发怎么解决性能优化的问题? - 易智编译EaseEditing

前端性能优化是确保网站或应用在加载速度、响应性和用户体验等方面达到最佳状态的关键任务。以下是一些解决前端性能优化问题的方法&#xff1a; 压缩和合并代码&#xff1a; 压缩和合并CSS、JavaScript和HTML文件可以减少文件大小&#xff0c;加快加载速度。使用压缩工具&am…...

共享球拍小程序:打破拥有束缚,尽享运动乐趣

市场前景&#xff1a; 随着健身和运动的流行趋势&#xff0c;越来越多的人加入了各种体育项目。然而&#xff0c;拥有球拍作为体育装备的成本较高&#xff0c;对于想要尝试不同运动的人来说&#xff0c;这可能是个阻碍。共享球拍小程序迎合了这一需求&#xff0c;提供了一个经济…...

uniapp 微信小程序 绘制海报,长按图片分享,保存海报

uView UI 2.0 dcloud 插件市场地址 弹窗海报源码 <template><!-- 推荐商品弹窗 --><u-popup :show"haibaoShow" mode"center" round26rpx z-index10076 bgColortransparent safeAreaInsetTop close"goodsclose"><image …...

爬虫异常捕获与处理方法详解

Hey&#xff01;作为一名专业的爬虫代理供应商&#xff0c;我今天要和大家分享一些关于爬虫异常捕获与处理的方法。在进行爬虫操作时&#xff0c;我们经常会遇到各种异常情况&#xff0c;例如网络连接错误、请求超时、数据解析错误等等。这些异常情况可能会导致程序崩溃或数据丢…...

制作网络课堂学习平台(标签嵌套,后代选择器)

网络课堂学习平台 课程 1 这是课程 1 的描述。 模块 1 这是模块 1 的描述。 查看详情 模块 2 这是模块 2 的描述。 查看详情 课程 2 这是课程 2 的描述。 模块 1 这是块 2 的描述。 查看详情...

基于医疗领域数据微调LLaMA——ChatDoctor模型

文章目录 ChatDoctor简介微调实战下载仓库并进入目录创建conda环境并配置环境&#xff08;安装相关依赖&#xff09;下载模型文件微调数据微调过程全量微调基于LoRA的微调基于微调后的模型推理 ChatDoctor简介 CHatDoctor论文&#xff1a; ChatDoctor: A Medical Chat Model F…...

UDP TCP 报文内容

1.UDP 2.TCP 源/目的端口号:表示数据是从哪个进程来,到哪个进程去; 32位序号/32位确认号:后面详细讲;4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是15*460 6位标志位: o URG:紧急指针是否有效 ——urgent 紧急的 o ACK:确认号是否有…...

Boost开发指南-4.8operators

operators C提供了强大且自由的操作符重载能力&#xff0c;可以把大多数操作符重新定义为函数&#xff0c;使操作更加简单直观。这方面很好的例子就是标准库中的string和 complex&#xff0c;可以像操作内置类型int、double那样对它们进行算术运算和比较运算&#xff0c;非常方…...

c# 泛型约束

在C#中&#xff0c;泛型约束用于指定泛型类型参数的限制条件&#xff0c;以确保类型参数满足特定的条件。以下是C#中常见的泛型约束&#xff1a; where T : struct&#xff1a; 这个约束要求类型参数必须是一个值类型&#xff08;如int、float等&#xff09;。 where T : cla…...

android frida

Frida 是一个用于动态分析、调试和修改 Android 应用程序的强大工具。它的主要作用包括&#xff1a; 代码注入和Hooking&#xff1a; Frida 允许您在运行时修改和监视应用程序的行为。您可以通过Frida注入JavaScript代码到目标应用程序中&#xff0c;然后使用该代码来Hook&…...

Linux下的Shell编程——正则表达式入门(四)

前言&#xff1a; 正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里&#xff0c;正则表达式通常被用来检索、替换那些符合某个模式的文本。 在Linux 中&#xff0c;grep&#xff0c;sed&#xff0c;awk 等文本处理工具都支持…...

使用VisualStudio制作上位机(一)

文章目录 使用VisualStudio制作上位机(一)写在前面第一部分:创建应用程序第二部分:GUI主界面设计使用VisualStudio制作上位机(一) Author:YAL 写在前面 1.达到什么目的呢 本文主要讲怎么通过Visual Studio 制作上位机,全文会以制作过程来介绍怎么做,不会去讲解具体…...

【前端从0开始】JavaSript——自定义函数

函数 函数是一个可重用的代码块&#xff0c;用来完成某个特定功能。每当需要反复执行一段代码时&#xff0c;可以利用函数来避免重复书写相同代码。函数包含着的代码只能在函数被调用时才会执行&#xff0c;就可以避免页面载入时执行该脚本在JavaScript中&#xff0c;可以使用…...

如何在Windows、Mac和Linux操作系统上安装Protocol Buffers(protobuf)编译器

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

简单介绍 CPU 的工作原理

内部架构 CPU 的根本任务就是执行指令&#xff0c;对计算机来说最终都是一串由 0 和 1 组成的序列。CPU 从逻辑上可以划分成 3 个模块&#xff0c;分别是控制单元、运算单元和存储单元 。其内部架构如下&#xff1a; 【1】控制单元 控制单元是整个CPU的指挥控制中心&#xff…...

UE4/5数字人MetaHuman的控制绑定资产使用

目录 开始操作 找到控制绑定资产 放入控制绑定资产 ​编辑 生成动画资产 开始操作 首先我们创建一个关卡序列&#xff1a; 打开后将我们的数字人放进去【右键&#xff0c;第一个添加进去】&#xff1a; 我们会自动进入动画模式&#xff0c;没有的话&#xff0c;就自己…...

二、11.系统交互

fork 函数原型是 pid_t fork(void&#xff09;&#xff0c;返回值是数字&#xff0c;该数字有可能是子进程的 pid &#xff0c;有可能是 0&#xff0c;也有可能是-1 。 1个函数有 3 种返回值&#xff0c;这是为什么呢&#xff1f;可能的原因是 Linux 中没有获取子进程 pid 的方…...

敏捷管理工具/国内软件敏捷开发工具

​Scrum中非常强调公开、透明、直接有效的沟通&#xff0c;这也是“可视化的管理工具”在敏捷开发中如此重要的原因之一。通过“可视化的管理工具”让所有人直观的看到需求&#xff0c;故事&#xff0c;任务之间的流转状态&#xff0c;可以使团队成员更加快速适应敏捷开发流程。…...

Selenium环境+元素定位大法

selenium 与 webdriver Selenium 是一个用于 Web 测试的工具&#xff0c;测试运行在浏览器中&#xff0c;就像真正的用户在手工操作一样。支持所有主流浏览器 WebDriver 就是对浏览器提供的原生API进行封装&#xff0c;使其成为一套更加面向对象的Selenium WebDriver API。 使…...

Vue3 用父子组件通信实现页面页签功能

一、大概流程 二、用到的Vue3知识 1、组件通信 &#xff08;1&#xff09;父给子 在vue3中父组件给子组件传值用到绑定和props 因为页签的数组要放在父页面中&#xff0c; data(){return {tabs: []}}, 所以顶部栏需要向父页面获取页签数组 先在页签页面中定义props用来接…...

HCIP STP协议

STP协议 STP协议概念生成树为什么要用STP STP名词解释根网桥根端口指定端口非指定端口 STP的版本802.1DPVSTPVST 快速生成树 STP协议概念 IEEE 802.1d STP&#xff08;生成树协议&#xff0c;Spanning-Tree Protocol&#xff09;协议&#xff1a; ①使冗余端口置于“阻塞状态”…...

链表的顶级理解

目录 1.链表的概念及结构 2.链表的分类 单向或者双向 带头或者不带头 循环或者非循环 3.无头单向非循环链表的实现 3.1创建单链表 3.2遍历链表 3.3得到单链表的长度 3.4查找是否包含关键字 3.5头插法 3.6尾插法 3.7任意位置插入 3.8删除第一次出现关键字为key的节点 …...

探索贪心算法:理解与实现JAVA语言

探索贪心算法&#xff1a;理解与实现 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种基于每一步的最优选择来达到整体最优的算法思想。尽管贪心算法并不适用于所有问题&#xff0c;但它在很多情况下都能够提供高效、近似的解决方案。本文将深入探讨贪心算法的基本概…...

数字孪生技术对旅游行业能起到什么作用?

随着疫情对我们生活影响的淡化&#xff0c;旅游行业迎来了新的春天&#xff0c;暑期更是旅游行业的小高潮&#xff0c;那么作为一个钻研数字孪生行业的小白&#xff0c;本文就着旅游的话题以及对旅游的渴望带大家一起探讨一下数字孪生对智慧旅游发展的作用~ 数字孪生作为一种虚…...

攻防世界-Web_php_include

原题 解题思路 php://被替换了&#xff0c;但是只做了一次比对&#xff0c;改大小写就可以绕过。 用burp抓包&#xff0c;看看有哪些文件 flag明显在第一个PHP文件里&#xff0c;直接看...

Python Opencv实践 - 直方图显示

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#图像直方图计算 #cv.calcHist(images, channels, mask, histSize, ranges, hist, accumulate) #images&…...

2分钟搭建自己的GPT网站

如果觉得官方免费的gpt&#xff08;3.5&#xff09;体验比较差&#xff0c;总是断开&#xff0c;或者不会fanqiang&#xff0c;那你可以自己搭建一个。但前提是你得有gpt apikey。年初注册的还有18美金的额度&#xff0c;4.1号后注册的就没有额度了。不过也可以自己充值。 有了…...

deepdiff比较两个json文件数据差异性

deepdiff比较两个json文件数据差异性 Python代码片&#xff1a; import json import sysfrom deepdiff import DeepDiff from deepdiff import grep, DeepSearch from deepdiff import DeepHash# print(DeepDiff("abc", "abcd", ignore_orderTrue))class …...

文件内容搜索工具 - Python实现

在本篇文章中&#xff0c;我们将介绍如何使用 wxPython 库创建一个简单的文件搜索工具。这个工具允许用户选择一个文件夹&#xff0c;并在该文件夹中的所有 .py 文件中查找指定的文字&#xff0c;并显示匹配的位置。 C:\pythoncode\blog\searchwordinpyfile.py 代码实现 我们首…...

vue静态html加载外部组件

当我们在开发vue应用时, 使用的是html页面开发, 需要引用外部vue组件, 怎么办呢, 首先我们引用http-vue-loader.js文件, 像下面这样: <script src"/assets/javascript/vue.min.js"></script> <script src"/assets/javascript/http-vue-loader.j…...

WebSocket 中的心跳是什么,有什么作用?

在网络应用开发中&#xff0c;WebSocket 是一种重要的通信协议&#xff0c;它允许客户端和服务器之间建立持久性的双向通信连接。然而&#xff0c;为了保持连接的稳定性&#xff0c;WebSocket 中的心跳是一个不可或缺的概念。本文将详细介绍 WebSocket 中的心跳是什么&#xff…...

Android类加载机制

要说Android的类加载机制 &#xff0c;就离不开 类加载器ClassLoader&#xff0c;它是一个抽象接口 下面这个图还是比较好表达了类加载流程&#xff0c;但如果不看我红色画的线&#xff0c;就会感觉有点乱&#xff0c;需要注意是采用的是双亲委派模式&#xff0c;class加载要先…...

微信小程序列表加载更多

概述 基于小程序开发的列表加载更多例子。 详细 一、前言 基于小程序开发的列表加载更多例子。 二、运行效果 运行效果&#xff08;演示的小视频&#xff0c;点击播放即可&#xff09; 三、实现过程 总体思路如何&#xff1a; 1、通过scroll-view组件提供的bindscroll方法…...

数据库知识

怎么做 常见的数据库 Oracle Mysql SOLSever Navicat &#xff08;新版可以链接mysql oracle&#xff09; http://sqlfiddle.com/ 数据库操作在线练习 mysql自带四个数据库 数据库语言的使用 显示数据库&#xff1a;show databases&#xff1b; 创建数据库&#xff1a;…...

VUE 目录介绍

更新升级&#xff08;npm - i&#xff09;之后最终目录如下&#xff1a; total 1672 drwxr-xr-x 18 testrose staff 576 8 22 02:53 . drwxr-xr-x 24 testrose staff 768 8 22 02:50 .. -rw-r--r-- 1 testrose staff 402 8 22 02:52 .babelrc -rw…...

Selenium的基本使用

文章目录 引入一.选择元素的基本方法1.根据id 选择元素2.根据 class属性选择元素当元素有 多个class类型 时 3.根据 tag名 选择元素4.通过WebElement对象选择元素5.find_element 和 find_elements 的区别 二.等待界面元素出现1.隐式等待2.显示等待 三.操控元素的基本方法1.点击…...

数据结构-----树的易错点

1.树的度和m叉树 •度为m的树&#xff08;度表示该结点有多少个孩子&#xff08;分支&#xff09;&#xff09; 任意结点的度<m(最多m个孩子) 至少又一个结点度m(有m个孩子) 一定是非空树&#xff0c;至少有m1个结点 •m叉树 任意结点的度<m(最多有m个孩子) 允许所…...