Java 面试相关问题(下)——JVM相关问题GC相关问题

在这里插入图片描述

  • 1. 类加载
    • 1.1 类的生命周期说一下?
    • 1.2 介绍下生命周期中的加载?
    • 1.3 介绍下生命周期中的验证?
    • 1.4 介绍下生命周期中的准备?
    • 1.5 介绍下生命周期中的解析?
    • 1.6 介绍下生命周期中的初始化?
    • 1.7 介绍下生命周期中的卸载?
    • 1.8 介绍下类加载器?
    • 1.9 JVM中都有哪些类加载器?
    • 1.10 怎么实现自定义类加载器?
    • 1.11 介绍下双亲委派模型?
    • 1.12 怎么屏蔽双亲委派模型?
  • 2. JVM内存管理——重点
    • 2.1 介绍一下Java运行时内存模型?【JVM内存是怎么划分的?】
    • 2.2 Java运行内存模型中,哪些是线程共享的,哪些是私有的?
    • 2.3 介绍一下方法区?
    • 2.4 介绍一下堆内存?
    • 2.5 介绍一下虚拟机栈?
    • 2.6 介绍一下本地方法栈?
    • 2.7 介绍一下程序计数器?
    • 2.8 Java内存是怎么给对象分配内存的?
    • 2.9 新生代和老年代介绍下?
    • 2.10 新生代内部模型介绍下?
    • 2.11 为什么要设计两个幸存区?
  • 3. JVM垃圾回收——重点
    • 3.1 都有哪些垃圾回收器?
    • 3.2 CMS和G1有什么区别?
    • 3.3 GC垃圾回收介绍下?
    • 3.4 垃圾搜索算法介绍下?【怎么判断对象是否可以被回收?】
    • 3.5 引用计数法的缺点是什么?
    • 3.6 Root根搜索遍历法的缺点是什么?
    • 3.7 垃圾回收算法介绍下?每种算法的优缺点是什么?
    • 3.8 GC日志有看过吗?都有哪些信息
  • 4. JVM参数
    • 4.1 JVM常用参数有哪些?
    • 4.2 JVM堆内存相关参数有哪些?
    • 4.3 如何设置堆内存新生代大小?
    • 4.4 如何设置堆内存老年代大小?
    • 4.5 如何设置元空间/方法区大小?
    • 4.6 JVM堆内存一般怎么设置大小?
    • 4.7 如何设置垃圾回收算法?
    • 4.8 如何设置伊甸区和幸存区的比例?
  • 5. JVM性能与调优
    • 5.1 JVM常用命令有哪些?
    • 5.2 怎么利用JVM命令分析死锁?
    • 5.3 怎么导出堆内存信息?
    • 5.4 怎么查看JVM线程信息?
    • 5.5 JVM提供的可视化工具有哪些?

1. 类加载

1.1 类的生命周期说一下?

加载、验证、准备、解析、初始化、使用、卸载

1.2 介绍下生命周期中的加载?

通过类的全限定名获取类文件的二进制信息,然后将方法区二进制流信息加载到方法区,并且生成一个class入口

1.3 介绍下生命周期中的验证?

验证主要是验证class文件是否符合《JVM规范》,主要由四个阶段组成:

  • 阶段一:文件格式验证,验证class文件格式
  • 阶段二:元数据验证,检查class文件的语义
  • 阶段三:字节码验证,检查程序语义
  • 阶段四:符号验证,检查程序的引用符号是否正确

1.4 介绍下生命周期中的准备?

主要是给类的变量设置初始化数据,这个数据不等于程序中的初始化值,而是JVM的默认值

1.5 介绍下生命周期中的解析?

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。 解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符 7 类符号引用进行。

1.6 介绍下生命周期中的初始化?

类的初始化是一个重要的阶段,它涉及到类实例(对象)在内存中分配空间后,立即进行的一系列设置和准备工作,以确保对象能够正确地按照类的定义进行后续的操作。
类初始化相关工作包括:内存对象分配,执行构造方法,静态变量赋值等

1.7 介绍下生命周期中的卸载?

类卸载就是将方法区里的Class对象进行GC回收

1.8 介绍下类加载器?

类加载器(Class Loader)是Java虚拟机(JVM)的一个重要组成部分,它负责将Java类的二进制代码加载到内存中,并转换为可执行的Java字节码。类加载器的作用如下:

  1. 加载类:将类加载到JVM中
  2. 转换为字节码:将.Class文件转化为字节码
  3. 管理类命名空间:保证类的全限定类名唯一,保证每个类的隔离性

1.9 JVM中都有哪些类加载器?

除了自定义类加载器外,JVM有三种默认的类加载器:

  • 启动类加载器:主要是加载Java类的核心库,是jdk环境下的Lib包内容,例如:Java.lang.*
  • 扩展类加载器:主要是加载Java类的扩展库,是JDK环境下的ext包内容
  • 应用程序类加载器:是扩展类加载器的子类,主要是加载用户路径下的类

1.10 怎么实现自定义类加载器?

继承ClassLoader抽象类,实现里面的loadClass()方法和findClass()即可

1.11 介绍下双亲委派模型?

类加载器在加载类的时候,首先是调用类的父类,尝试用父类加载,如果父类加载失败,再调用类加载器加载。

1.12 怎么屏蔽双亲委派模型?

自定义类里面,只需要重写loadClass(),将尝试父类加载的代码部分屏蔽即可。

2. JVM内存管理——重点

先明白JVM内存是怎么分布的:
image.png

2.1 介绍一下Java运行时内存模型?【JVM内存是怎么划分的?】

先说内存模块,再简单说每个模块的功能就OK了

Java内存模型可以分为五个部分,线程共有的包括堆内存 方法区,或者也可以叫元空间;线程私有的包括 虚拟机栈本地方法栈程序计数器。其中每个部分功能如下:

  • 堆内存:主要存储Java对象实例信息
  • 方法区:主要是存储静态信息和Class类实例信息
  • 本地方法栈:主要是存储本地方法调用指针
  • 虚拟机栈:主要是存储基础数据信息和对象引用指针
  • 程序计数器:主要是记录线程内部程序的执行位置

2.2 Java运行内存模型中,哪些是线程共享的,哪些是私有的?

  • 共享的:方法区和堆内存
  • 私有的:程序计数器、虚拟机栈、本地方法栈

2.3 介绍一下方法区?

方法区在jdk8后也叫元空间,方法区是线程共享的,主要存储的是静态信息和类信息,主要包括常量、静态变量和Class类实例信息。Class实例信息就是Java文件中声明的Java类。
方法区在不同版本,使用的内存区域也不同,在jdk8之前,用的JVM内部分配的空间;jdk8及以后,用的都是直接内存。
方法区一般分配的内存比较小,大概50M之内就可以满足运行需求,而且方法区的空间一般不会被GC回收。

2.4 介绍一下堆内存?

堆内存是线程共享的,也是GC和对象实例内存分配的主要区域,堆内存包括两个部分,分别是新生代和老年代,新生代和老年代的大小可以通过JVM参数配置。新生代中划分三个区域,分别是两个幸存区和一个伊甸区,新创建的对象首先是分配在伊甸区的。

2.5 介绍一下虚拟机栈?

虚拟机栈是线程私有的,主要是保存对象的引用指针和基础数据值,比如int,long这些基础数据类型值就是保存在虚拟机栈中的。引用指针里面存储的是堆内存中对象地址,可以通过引用指针直接访问堆内存对象数据。

2.6 介绍一下本地方法栈?

本地方法栈是线程私有的,主要是存储本地方法的调度指针、调度参数和环境变量等信息

2.7 介绍一下程序计数器?

程序计数器是线程私有的,主要是记录程序的执行节奏,跟踪程序执行过程,会将程序的执行指令地址存储到程序计数器中。

2.8 Java内存是怎么给对象分配内存的?

一个对象通过构造方法创建后,首先判断对象的大小,如果超过16K,则将对象直接放入到老年代。否则,先将对象放入到伊甸区。在经过Minor GC后,如果对象没有被回收,则将对象放入到幸存区。如果经过多次回收后,确定该对象为长期存活对象,则将该对象放入到老年代中。

默认 Minor GC 回收15次之后,对象进入老年代。
不过回收次数可以配置,通过-XX:MaxTenuringThreshold可以设置回收多少次后,进入老年代。

2.9 新生代和老年代介绍下?

新生代和老年代都是Java内存的一种管理方式,在Java内存模型中,堆内存里面被划分为两个区域,即新生代区和老年代区。

  • 新生代区主要是保存一些程序新建对象,这些对象的特点是朝生夕死,也就是说这些对象一般会频繁地创建和销毁。而且,JVM GC的90%都是在新生代发生。
  • 老年代区主要是保存一些常驻对象,这些对象的特点是生命存活时间比较长,或者对象比较大。

2.10 新生代内部模型介绍下?

新生代里面有一个伊甸区和两个幸存区,默认比例是8:1:1

2.11 为什么要设计两个幸存区?

设计两个幸存区主要是基于内存管理和GC效率两方面考虑的,因为对于新生代垃圾回收算法现在主流采用的是标记-复制算法,通过两个幸存区可以提高GC回收效率,减少内存碎片。

3. JVM垃圾回收——重点

3.1 都有哪些垃圾回收器?

image.png

垃圾回收器主要分为三类,分别是:

  • 串行回收器:serialserial old
  • 并行回收器:ParallelParNew
  • 并发回收器:CMSG1

3.2 CMS和G1有什么区别?

CMS和G1都是Jvm的垃圾回收器,两者的区别主要有以下几个方面:

  • 收集范围:CMS只会回收老年代,G1则是混合回收器,老年代和新生代都会回收
  • 收集算法:CMS用的是标记-清除算法, G1则是标记-整理算法
  • 停顿时间:CMS尽量使停顿时间最短来满足用户需求,G1则是根据回收价值大小,在停顿时间范围内尽量回收价值大的内存区域
  • 并发与吞吐量:CMS在并发阶段,CMS会与应用程序线程并发执行,以减少对应用程序性能的影响。但是,CMS对CPU资源非常敏感,在并发阶段会占用CPU资源而导致应用程序变慢,总吞吐量下降。G1充分利用多核处理器和大内存容量的优势,使用多个CPU来缩短停顿时间并提高吞吐量。G1的并发能力更强,能够更好地适应高负载的应用场景。
  • 浮动垃圾处理:CMS本次产生的浮动垃圾需要下次GC才会清理,G1则是尽可能在本次GC就处理

3.3 GC垃圾回收介绍下?

GC是JVM提供的垃圾管理工具,主要用于自动管理程序中不再使用的内存,避免程序员手动释放内存,自动检测回收垃圾,避免内存泄漏风险。

3.4 垃圾搜索算法介绍下?【怎么判断对象是否可以被回收?】

垃圾回收算法包括两种,即:

  • root根搜索遍历法:随机挑选几个对象,然后找该对象的关联的对象,然后广度搜索再找关联对象的关联对象,并且会将这个对象所有直接或者间接关联的对象组成一个图,对于图内的对象不会回收。对于不在图内的对象,逐个进行图关联,如果存在单节点图,则这些节点会被回收。
  • 引用计数法:相当于给对象增加一个计数器,每有一个指针引用该对象,则给计数器加一。每次回收前,直接判断计数器是否等于0,如果等于则直接回收。

3.5 引用计数法的缺点是什么?

缺点主要是根据算法特性来决定,主要的缺点包括如下三个方面:

  1. 额外的存储开销和性能开销:因为要维护一个计数器,并且要频繁地更新计数器,所以会有存储和性能开销。
  2. 无法解决循环引用问题:比如A引用B,B引用C,C引用A,那么对于ABC三个对象来说,计数器一直都是1,无法满足回收条件。
  3. 边界兼容性问题不好:对象是类的具体实例,但是对于类来说,存在继承、实现等多种兼容情况,这些情况在不同语言,或者环境下,都有边界问题。

3.6 Root根搜索遍历法的缺点是什么?

缺点也是相对于引用计数法来说的,并没有明确的缺点。可能会有如下缺点:

  • 性能开销较高,因为组装树结构和广度遍历
  • 结构复杂,难实现
  • 有一定的停顿时间,影响GC效率

3.7 垃圾回收算法介绍下?每种算法的优缺点是什么?

目前主流的垃圾回收算法有三种,分别是:

  • 标记-清除:两阶段,在垃圾搜索阶段,搜索到垃圾后,先对其进行标记。在垃圾回收阶段,会根据标记,进行垃圾清理。
    • 优点:效率高,速率快,简单易实现,比较灵活
    • 缺点:会产生内存碎片,导致内存利用率下降
  • 复制:内存会划分为两块区域,每次分配对象只会在一块区域中分配。回收时,会将正在使用的对象复制到另一块内存区域,当前内存区域则会全部清理。例如:内存划分为两块,分别为A和B。每次分配对象内存时,只能给A和B中的一块分配,假如先给A分配,在垃圾回收阶段,会将A中正在使用的对象复制到B中,然后将A清理掉。下次回收时,反过来就行。
  • 标记-整理:是标记-清楚复制算法混合体,分为两阶段。第一阶段,将正在使用的对象进行标记。第二阶段,将标记的对象复制到内存的一端,剩下的部分被清除。

3.8 GC日志有看过吗?都有哪些信息

都包含如下关键信息:

  • 触发时间戳
  • 回收类型,例如 minor GCfull GC
  • 使用的垃圾回收器,例如 CMSG1
  • 内存使用情况
  • GC 耗时
  • 堆信息

4. JVM参数

4.1 JVM常用参数有哪些?

常用参数包括启动参数和运行时参数两种,启动参数例如-classpath等;运行时参数包括内存参数、GC相关参数等

4.2 JVM堆内存相关参数有哪些?

  • 堆内存相关参数:
    • -Xms:设置Java堆内存的初始大小。JVM启动时,会向操作系统请求此大小的内存。默认值取决于平台(通常是物理内存的1/64,但小于1GB)。
    • -Xmx:设置Java堆内存的最大值。JVM可以扩展其堆内存,但不会超过此限制。默认值也取决于平台(通常是物理内存的1/4,但小于1GB)。
  • 新生代设置:
    • -Xmn:设置新生代(Young Generation)的内存大小。新生代是堆内存的一部分,用于存放新生成的对象。如果不设置此参数,新生代的大小将由JVM根据-Xms和-Xmx参数自动计算得出。
    • -XX:NewSize:设置新生代的初始大小(在JDK 1.3/1.4中可用)。这个参数在较新版本的JDK中可能不再被直接使用,因为-Xmn已经包含了初始大小和最大大小的设置。
    • -XX:MaxNewSize:设置新生代可以扩展到的最大大小(在JDK 1.3/1.4中可用)。同样,这个参数在较新版本的JDK中可能不再被推荐使用。
  • 新生代分区比例设置:
    • -XX:SurvivorRatio:设置Eden区与Survivor区的比例。Eden区是新生代中用于存放新生成对象的区域,而Survivor区则用于存放经过一次GC后仍然存活的对象。默认值为8,表示Eden区与单个Survivor区的比例为8:1。
    • -XX:NewRatio:设置新生代与老年代(Old Generation)的比例。例如,如果设置为3,则表示新生代与老年代的比例为1:3。但请注意,当使用-Xmn或同时设置-Xms和-Xmx时,此参数可能不会被直接使用。
  • -Xss:设置每个线程的栈内存大小。栈内存用于存放局部变量和方法调用的上下文信息。

4.3 如何设置堆内存新生代大小?

JVM -Xmn 可以设置新生代内存大小,也可以通过 -XX:NewRatio 设置新生代和老年代分区比例设置新生代大小。

4.4 如何设置堆内存老年代大小?

JVM并没有提供直接设置堆内存老年大大小的参数,但是可以通过别的方法解决,比如:

  1. 先设置堆内存整体大小,可以利用xmxxms设置堆内存最大值和最小值
  2. 然后设置新生代大小,两种方法:
    1. 一种是设置比例,利用 newRatio 设置新生代和老年代比例,这样可以通过新生代比例直接确定老年代大小
    2. 另一种直接设置新生代大小,利用 newSizemaxNewSize参数设置新生代大小最小最大值,然后通过总内存减去新生代大小,就可以得到老年代大小。

4.5 如何设置元空间/方法区大小?

通过 JVM 的 MetaspaceSizeMaxMetaspaceSize可以直接设置元空间的初始化大小和最大大小。

4.6 JVM堆内存一般怎么设置大小?

  • -xmx: 设置堆内存的最大大小
  • -xms: 设置堆内存的最小值

4.7 如何设置垃圾回收算法?

垃圾回收算法直接和垃圾回收器是绑定的,JVM虽然没有直接设置回收算法的参数,但是可以设置垃圾会回收器来确定使用那种回收算法。

  • -XX:+UseSerialGC:启用串行垃圾收集器(Serial GC)。这是一种单线程的收集器,适用于单核处理器或小型应用。
  • -XX:+UseParallelGC:启用并行垃圾收集器(Parallel GC)。这是一种多线程的收集器,适用于多核处理器。
  • -XX:+UseConcMarkSweepGC:启用CMS(Concurrent Mark Sweep)垃圾收集器。这是一种以尽可能减少停顿时间为目标的并发收集器。
  • -XX:+UseG1GC:启用G1(Garbage-First)垃圾收集器。G1收集器是一个面向服务器的垃圾收集器,旨在满足垃圾收集停顿时间要求的同时,还具备高吞吐量性能特征。

4.8 如何设置伊甸区和幸存区的比例?

通过JVM -**XX:SurvivorRatio**来设置伊甸区和幸存区比例。

5. JVM性能与调优

5.1 JVM常用命令有哪些?

  • **jps** (JVM Process Status): 类似 UNIX 的 ps 命令。用于查看所有 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息;
  • **jstat**(JVM Statistics Monitoring Tool): 用于收集 HotSpot 虚拟机各方面的运行数据;
  • **jinfo** (Configuration Info for Java) : Configuration Info for Java,显示虚拟机配置信息;
  • **jmap** (Memory Map for Java) : 生成堆转储快照,此外可以用 jmap -dump xx导出内存快照。
  • **jhat** (JVM Heap Dump Browser) : 用于分析 heapdump 文件,它会建立一个 HTTP/HTML 服务器,让用户可以在浏览器上查看分析结果。JDK9 移除了 jhat;
  • **jstack** (Stack Trace for Java) : 生成虚拟机当前时刻的线程快照,线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。

5.2 怎么利用JVM命令分析死锁?

利用jstack可以查询当前JVM线程快照,在线程快照中查询死锁信息。一般如果有死锁的话,线程后面会提示Found one Java-level deadlock提示信息。

5.3 怎么导出堆内存信息?

可以利用 jmap -dump导出堆内存快照信息

5.4 怎么查看JVM线程信息?

利用jstack查询线程信息

5.5 JVM提供的可视化工具有哪些?

  • Jconsole:是一款基于JMX(Java Management Extensions)的可视化监视、管理工具。它随JDK一起发布,用于查看Java应用程序的运行概况、监控堆信息、永久区(元空间)使用情况、类加载情况等。
  • VisualVM:VisualVM(All-in-One Java Troubleshooting Tool)是Oracle提供的一个功能强大的多合一故障诊断和性能监控的可视化工具。它集成了多个JVM调优的监控工具、故障排查工具、可视化工具等。

其他还有MAT (Memory Analyzer Tool)、JProfiler、Arthas、Btrace等

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科研绘图系列:R语言组合堆积图(stacked barplot with multiple groups)

介绍 通常堆积图的X轴表示样本,样本可能会存在较多的分组信息,通过组合堆积图和样本标签分组信息,我们可以得到一张能展示更多信息的可发表图形。 加载R包 knitr::opts_chunk$set(warning = F, message = F) library(tidyverse) library(cowplot) library(patchwork)导入…

富芮坤FR800X系列之按键检测模块设计

FR800X系列按键检测模块 读者对象: 本文档主要适用以下工程师: 嵌入式系统工程师 单片机软件工程师 IOT固件工程师 BLE固件工程师 文章目录 1.概要2.用户如何设计按键检测模块2.1 GPIO初始化2.2按键模块初始化2.3设计中断函数:2.4循环…

Spring循环依赖详解

一、什么是循环依赖 在Spring框架中,循环依赖是指两个或更多的Bean相互间直接或间接地依赖对方的情况。这种依赖关系可能导致Bean的实例化过程中出现问题,但Spring通过其内部的处理机制能够解决某些类型的循环依赖。 简单的说就是A依赖B,B依赖…

数据库安全综合治理方案(可编辑54页PPT)

引言:数据库安全综合治理方案是一个系统性的工作,需要从多个方面入手,综合运用各种技术和管理手段,确保数据库系统的安全稳定运行。 方案介绍: 数据库安全综合治理方案是一个综合性的策略,旨在确保数据库系…

photoshop学习笔记——选区3 选区的变化

选区制作完成之后可以对选区进行变化 主要有: 反选:shift ctrl I 变换 修改: 边界 设置选区的边界大小 类似 CSS中的borderSize平滑 对选区的角进行平滑扩展 向外扩展选区收缩 向内收缩选区羽化 让边界变得过渡透明度 设置…

MySQL作业四

1. 创建数据库mydb15_indexstu 2. 创建表student,course,sc 2.1 创建表student 2.2 创建表course 2.3 创建表sc 3. 处理表 3.1 修改表student中年龄(sage)字段属性,数据类型由int改变为smallint 3.2 为表course中cno…

【数据结构】栈(基于数组、链表实现 + GIF图解 + 原码)

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:数据结构 📚本系列文章为个人学…

Golang | Leetcode Golang题解之第268题丢失的数字

题目: 题解: func missingNumber(nums []int) int {n : len(nums)total : n * (n 1) / 2arrSum : 0for _, num : range nums {arrSum num}return total - arrSum }

scrapy爬取城市天气数据

scrapy爬取城市天气数据 一、创建scrapy项目二、修改settings,设置UA,开启管道三、编写爬虫文件四、编写items.py五、在weather.py中导入WeatherSpiderItem类六、管道中存入数据,保存至csv文件七、完整代码一、创建scrapy项目 先来看一下爬取的字段情况: 本次爬取城市天…

【中项】系统集成项目管理工程师-第5章 软件工程-5.3软件设计

前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…

一文解决 | Linux(Ubuntn)系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置

原文链接:一文解决 | Linux(Ubuntn)系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置 本期教程 获得本期教程文本文档,在后台回复:20240724。请大家看清楚回复关键词,每天都有很多人回复错误关键词&#xf…

Blackbox AI-跨时代AI产物,你的私人编程助手

1. 引言 随着人工智能技术的飞速发展,我们的生活方式正在经历前所未有的变革。从智能家居到自动驾驶,AI已经渗透到我们生活的方方面面。而在这场科技革命中,Blackbox 网站凭借其先进的技术和全面的功能,成为了众多AI产品中的佼佼者…

不同行情下算法的具体使用!

上一篇我们说到了不同公司算法交易的区分,有朋友提出了不同的行情下的算法交易应该怎么使用,小编今天就带大家了解下!当然具体实际状况百出,这种可以实际为准(韭菜修养全拼实际探讨交流)! 我们在…

Redis的使用场景、持久化方式和集群模式

1. Redis的使用场景 热点数据的缓存 热点数据:频繁读取的数据 限时任务的操作。比如短信验证码 完成session共享的问题。因为前后端分离 完成分布式锁 商品的销售量 2. Redis的持久化方式 2.1 什么是持久化 把内存中的数据存储到磁盘的过程。同时也可以把磁盘中…

AI绘画入门实践|Midjourney:使用 --no 去除不想要的物体

在 Midjourney 中,--no 作为反向提示词,告诉 MJ 在生成图像时,不要包含什么。 使用格式:--no 对应物体提示词(多个物体之间使用","间隔) 使用演示 a web banner, summer holiday --v 6.0 a web b…

【Git多人协作开发】同一分支下的多人协作开发模式

目录 0.前言场景 1.开发者1☞完成准备工作&协作开发 1.1创建dev分支开发 1.2拉取远程dev分支至本地 1.3查看分支情况和分支联系情况 1.4创建本地dev分支且与远程dev分支建立联系 1.5在本地dev分支上开发file.txt 1.6推送push至远程仓库 2.开发者2☞完成准备工作&…

C++第十弹 ---- vector的介绍及使用

目录 前言vector的介绍及使用1. vector的使用1.1 vector的定义1.2 iterator的使用1.3 vector空间增长问题1.4 vector增删查改 2. vector迭代器失效问题(重点) 总结 前言 本文介绍了C中的vector数据结构及其使用方法。 更多好文, 持续关注 ~ 酷酷学!!! 正文开始 vector的介绍…

GPT-4O 的实时语音对话功能在处理多语言客户时有哪些优势?

最强AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量 我瞄了一眼OpenAI春季发布会,这个发布会只有26分钟,你可以说它是一部科幻短片,也可以说它过于“夸夸其谈”!关于…

Anconda 快速常用命令简洁版

目的:简单清楚的使用基本的conda 命令 可能需求 查看项目中的虚拟环境及依赖是否满足需求操作新环境来满足项目或者论文的实现 Anconda 常用命令 conda 查看基础命令1. 进入Anaconda 环境2. 查看版本3.查看有哪些虚拟环境4.激活虚拟环境5. 进入虚拟环境查看6. 退出…

如何在网站嵌入可填写的PDF表单:2024巴黎奥运会赛程

如何将可填写的 PDF 表单嵌入您的网页?访问者无需下载或注册即可查看并填写。 简单!本文以2024巴黎奥运会赛程表单为例,演示如何将其嵌入网页中。您可以在 ONLYOFFICE 表单库免费获取该模板,有白色和紫色两种背景设计。 如何在网站…