JVM调优,参数在哪里设置的?
JVM调优,参数在哪里设置的?
在Java应用程序中,JVM(Java Virtual Machine)的调优通常通过设置JVM启动参数来实现。这些参数可以控制JVM的内存分配、垃圾回收策略、线程管理、性能优化等方面。
1. JVM参数的位置
JVM参数通常在启动Java应用时通过命令行传递。设置JVM参数的常见方式有以下几种:
-
命令行启动:使用
java
命令启动 Java 程序时,JVM参数通过-X
或-XX
前缀传递。例如:
bash
java -Xmx2g -Xms1g -XX:+UseG1GC -jar myapp.jar
上述命令设置了:
- 最大堆内存为2GB:
-Xmx2g
- 初始堆内存为1GB:
-Xms1g
- 使用G1垃圾回收器:
-XX:+UseG1GC
- 最大堆内存为2GB:
-
配置文件:对于生产环境,通常会在启动脚本(如
.sh
或.bat
文件)中配置这些JVM参数。例如:
bash
export JAVA_OPTS="-Xmx2g -Xms1g -XX:+UseG1GC" java $JAVA_OPTS -jar myapp.jar
-
容器化环境(如 Docker):在 Dockerfile 或 Docker Compose 中设置
JAVA_OPTS
环境变量,或直接通过CMD
或ENTRYPOINT
传递参数。例如:
ENV JAVA_OPTS="-Xmx2g -Xms1g -XX:+UseG1GC" CMD java $JAVA_OPTS -jar /app/myapp.jar
2. 常见JVM调优参数
内存设置相关参数
-
-Xms
:设置JVM初始堆内存大小。bash
-Xms1g # 初始堆内存为1GB
-
-Xmx
:设置JVM最大堆内存大小。bash
-Xmx2g # 最大堆内存为2GB
-
-Xmn
:设置年轻代(Young Generation)内存大小,通常年轻代内存占堆内存的一部分。bash
-Xmn512m # 年轻代内存大小为512MB
-
-XX:NewSize
和-XX:MaxNewSize
:分别设置年轻代的初始大小和最大大小。bash
-XX:NewSize=512m # 初始年轻代大小为512MB -XX:MaxNewSize=1g # 最大年轻代大小为1GB
垃圾回收相关参数
-
-XX:+UseG1GC
:启用G1垃圾回收器,G1是目前推荐的垃圾回收器,特别适用于大内存应用。bash
-XX:+UseG1GC
-
-XX:+UseParallelGC
:启用并行垃圾回收器,适合多核CPU环境。bash
-XX:+UseParallelGC
-
-XX:+UseConcMarkSweepGC
:启用CMS垃圾回收器(适用于低延迟需求)。bash
-XX:+UseConcMarkSweepGC
-
-XX:MaxGCPauseMillis
:设置垃圾回收的目标最大暂停时间(单位:毫秒)。bash
-XX:MaxGCPauseMillis=200 # 设置垃圾回收的目标最大暂停时间为200ms
性能调优相关参数
-
-XX:+PrintGCDetails
:打印GC日志,详细输出每次GC的过程。bash
-XX:+PrintGCDetails
-
-XX:+PrintGCDateStamps
:在GC日志中加入时间戳。bash
-XX:+PrintGCDateStamps
-
-XX:+HeapDumpOnOutOfMemoryError
:在内存溢出时生成堆转储文件(heap dump)。bash
-XX:+HeapDumpOnOutOfMemoryError
-
-XX:HeapDumpPath
:指定堆转储文件的存放路径。bash
-XX:HeapDumpPath=/path/to/heapdump.hprof
线程管理相关参数
-
-XX:ThreadStackSize
:设置每个线程的堆栈大小。bash
-XX:ThreadStackSize=256k # 设置线程栈大小为256KB
-
-XX:CICompilerCount
:设置JIT(Just-In-Time)编译器的线程数量。bash
-XX:CICompilerCount=4 # 使用4个JIT编译器线程
调试和日志相关参数
-
-Xlog:gc*
:输出垃圾回收日志。bash
-Xlog:gc* # 输出GC的相关日志
-
-XX:+PrintCompilation
:打印JIT编译的详细信息。bash
-XX:+PrintCompilation
3. JVM调优的常见工具
除了直接设置JVM参数外,以下工具也可以帮助你进行JVM性能调优和监控:
- JConsole:一个基于JMX的监控工具,可以监控JVM的堆内存、线程、类加载、GC等信息。
- VisualVM:一个图形化工具,可以用来监控JVM性能、堆转储分析、线程分析等。
- JProfiler:一个商业化的Java性能分析工具,提供详细的堆内存分析、CPU分析等功能。
总结
JVM调优主要通过启动时的参数配置来实现,常见的调优方向包括内存管理(如堆大小、年轻代大小等)、垃圾回收策略、性能优化和日志记录。JVM启动参数的设置通常通过命令行、启动脚本或容器配置来实现,并且这些参数可以根据实际的应用需求和运行环境进行调整。
JVM调优,只设置了最大堆内存和初始堆大小,在哪里具体分配年轻代老年代大小
在 Java 中,JVM 的堆内存分为 年轻代(Young Generation)和 老年代(Old Generation)。它们的大小通常由以下两个方面控制:
-
-Xms
和-Xmx
:设置堆内存的初始大小(-Xms
)和最大大小(-Xmx
),但是这两个参数并没有直接控制年轻代和老年代的具体大小,而是控制整个堆的大小。 -
-XX:NewRatio
:用于控制年轻代和老年代的比例。默认情况下,JVM 会根据堆的大小分配一定比例的内存给年轻代和老年代。如果没有指定-XX:NewRatio
,JVM 会根据默认值来决定。 -
-XX:NewSize
和-XX:MaxNewSize
:这些参数可以显式地控制年轻代的大小。-XX:NewSize
用于设置年轻代的初始大小,-XX:MaxNewSize
用于设置年轻代的最大大小。 -
-XX:SurvivorRatio
:用于控制年轻代中 Eden 区 和 两个 Survivor 区 之间的内存比例。默认值通常是 8:1,即 Eden 区的大小是每个 Survivor 区的 8 倍。 -
-XX:InitialTenuringThreshold
:控制对象在年轻代中经历多少次 GC 后会被晋升到老年代。
JVM 内存分配的细节:
-
-Xms
和-Xmx
:这些参数定义了堆的总内存大小,但并没有指定年轻代和老年代的具体分配。堆内存分为三个区域:- 年轻代(Young Generation)包括 Eden 区和两个 Survivor 区。
- 老年代(Old Generation)用于存储经过多次垃圾回收后仍然存活的对象。
- 元空间(Metaspace)用于存储类元数据(对于 JDK 8 及以上版本)。
-
年轻代和老年代的默认比例:
- 默认情况下,JVM 会将堆内存的 1/3 分配给年轻代,其余的分配给老年代。这种比例可以通过
-XX:NewRatio
参数进行调整。
- 默认情况下,JVM 会将堆内存的 1/3 分配给年轻代,其余的分配给老年代。这种比例可以通过
控制年轻代和老年代大小的参数:
1. -XX:NewRatio
这个参数控制年轻代和老年代的比例。默认值通常是 2,意味着年轻代的内存大小是老年代的 1/2。例如,若堆内存大小为 6 GB,则默认情况下年轻代占 2 GB,老年代占 4 GB。
bash
-XX:NewRatio=2
2. -XX:NewSize
和 -XX:MaxNewSize
这两个参数用于控制年轻代的初始大小和最大大小。-XX:NewSize
设置年轻代的初始大小,-XX:MaxNewSize
设置年轻代的最大大小。如果你想显式地控制年轻代的大小,可以使用这两个参数。
bash
-XX:NewSize=1G -XX:MaxNewSize=2G
3. -XX:SurvivorRatio
这个参数控制年轻代中的 Eden 区和 Survivor 区的内存比例。默认值是 8,即 Eden 区的内存大小是每个 Survivor 区的 8 倍。
bash
-XX:SurvivorRatio=8
4. -XX:InitialTenuringThreshold
这个参数控制一个对象在年轻代中存活多少次 GC 后才会晋升到老年代。默认值通常是 7,表示对象在经历 7 次 GC 后会被晋升到老年代。
bash
-XX:InitialTenuringThreshold=7
总结:
- 最大堆内存和初始堆内存(
-Xms
和-Xmx
)控制整个堆的大小。 - 年轻代和老年代的比例:通过
-XX:NewRatio
控制。 - 年轻代的大小:可以通过
-XX:NewSize
和-XX:MaxNewSize
明确指定。 - 年轻代内部区域的比例:通过
-XX:SurvivorRatio
控制 Eden 区和 Survivor 区的大小比例。
通过这些参数,您可以根据应用程序的需求调整内存分配,以便更好地满足性能和垃圾回收的需求。
-XX:NewRatio:用于控制年轻代和老年代的比例 ,这个比例在哪里配置的
目前我无法直接提供截图,但我可以通过文字说明帮助你理解在哪里配置 -XX:NewRatio
参数。
配置方法
-
JVM 启动命令行中配置:
-XX:NewRatio
是通过在 JVM 启动命令中设置的。如果你正在运行 Java 程序,可以在启动时通过命令行指定此参数。
-
示例: 假设你通过命令行启动 Java 应用程序,可以在启动命令中添加
-XX:NewRatio
来控制年轻代和老年代的比例。以下是一个常见的例子:bash
java -XX:NewRatio=2 -jar your-application.jar
这条命令中,
-XX:NewRatio=2
将设置年轻代和老年代的内存比例为 1:2。
在常见的环境中的配置方式
-
Eclipse:如果你在 Eclipse 中运行应用程序,可以通过以下步骤配置:
- 右键点击你的 Java 项目。
- 选择 Run As → Run Configurations。
- 选择你要运行的配置。
- 在 Arguments 标签下,在 VM arguments 中添加
-XX:NewRatio=2
。
-
IntelliJ IDEA:如果你在 IntelliJ IDEA 中运行 Java 应用程序,可以通过以下步骤配置:
- 打开你的项目。
- 点击 Run → Edit Configurations。
- 在 VM options 中添加
-XX:NewRatio=2
。
-
Tomcat 或其他应用服务器:如果你使用的是 Tomcat 或其他应用服务器,可以在服务器启动配置文件中(如
catalina.sh
或setenv.sh
)添加此参数。
总结
-XX:NewRatio
参数通过 JVM 启动时的命令行配置来控制年轻代和老年代的内存比例。- 配置示例:
java -XX:NewRatio=2 -jar your-application.jar
。 - 你可以在 IDE 或应用服务器的启动配置中设置这个参数。
以Dokcer为例 -XX:NewRatio:用于控制年轻代和老年代的比例 ,这个比例在哪里配置的,请给出截图
虽然我无法直接提供截图,但我可以详细解释如何在 Docker 容器中配置 JVM 参数(如 -XX:NewRatio
)来控制年轻代和老年代的比例。
1. 通过 Dockerfile 配置
在 Dockerfile 中,你可以通过设置 CMD
或 ENTRYPOINT
来指定 JVM 参数。在 Docker 镜像构建过程中,可以将 -XX:NewRatio
参数添加到 Java 启动命令中。
示例 Dockerfile 配置:
# 使用 Java 官方镜像 FROM openjdk:17-jdk # 将应用程序 JAR 文件添加到容器中 COPY your-application.jar /app/your-application.jar # 配置 JVM 参数来控制年轻代和老年代的比例 CMD ["java", "-XX:NewRatio=2", "-jar", "/app/your-application.jar"]
2. 通过 docker run
命令配置
如果你已经有一个 Docker 镜像,并且想要在运行时动态添加 JVM 参数(例如 -XX:NewRatio
),可以在使用 docker run
命令时指定这些参数。
示例 docker run
命令:
bash
docker run -d -e JAVA_OPTS="-XX:NewRatio=2" your-docker-image
然后,确保在容器内部的启动命令中使用了 JAVA_OPTS
环境变量,例如:
CMD ["sh", "-c", "java $JAVA_OPTS -jar /app/your-application.jar"]
这样,JAVA_OPTS
环境变量中的 -XX:NewRatio=2
就会被传递给 JVM。
3. 使用 Docker Compose 配置
如果你使用 Docker Compose 来管理容器,可以在 docker-compose.yml
文件中配置 JVM 参数。
示例 docker-compose.yml
配置:
version: '3.8' services: java-app: image: openjdk:17-jdk build: context: . environment: - JAVA_OPTS=-XX:NewRatio=2 command: ["sh", "-c", "java $JAVA_OPTS -jar /app/your-application.jar"] volumes: - ./your-application.jar:/app/your-application.jar
总结
- 在 Docker 中,你可以通过 Dockerfile、docker run 命令或 Docker Compose 来配置
-XX:NewRatio
参数,控制年轻代和老年代的比例。 - 通过
CMD
或ENTRYPOINT
指定 JVM 启动参数,将其传递给 Java 应用程序。
虽然我无法直接给出截图,但以上步骤应能帮助你在 Docker 容器中配置 Java 参数。如果你需要更详细的操作说明或遇到其他问题,欢迎随时提问!
项目中如何配置的?
DokckerFile
FROM x.com/saicmotorcv/java:8
MAINTAINER wanghuapeng <wanghuapeng@saicmotor.com>ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneCOPY /x-service/target/yl-tasks-jghc-service-0.0.1.jar /app/app.jar
COPY /x-service/start.sh /app
COPY /x-service/start2.sh /app
COPY /x-service/skywalking-agent /app/agent
EXPOSE 9600
ENTRYPOINT ["/bin/bash","/app/start.sh"]
start.sh
#!/bin/bashSERVICEIP=` ip a|grep /32| awk '{print $2}'|cut -d / -f1`if [ "$ZH_APP_MEM" == "" ]; thenvmMemory=" -Xms2G -Xmx2G "
elsevmMemory=" -Xms$ZH_APP_MEM -Xmx$ZH_APP_MEM "
fiflag=0
inst_name=${LOGFORMAT##*/}
ret=`curl -s http://ip.sxc.sh/service/${inst_name}/text`
ip_str=${ret%%]*}
wan_ip=${ip_str#*[}
port_str=${ret##*[}
wan_port=${port_str%%:*}if [ -n "$(echo $wan_port| sed -n "/^[0-9]\+$/p")" ];thenflag=1
fi
check=`echo $wan_ip|grep "^[0-9]\{1,3\}\.\([0-9]\{1,3\}\.\)\{2\}[0-9]\{1,3\}$"`
if [[ ${#check} -eq ${#wan_ip} && $flag -eq 1 ]]; thenflag=2
fiif [ $flag -ne 2 ]; thenwan_ip=""wan_port=""
fi
echo $wan_ip
echo $wan_portif [ -n "$shost" ] ;thenecho "wan ip and port is define $shost:$sport"SERVICE_HOST=$shostSERVICE_PORT=$sport
elif [ -n "$wan_port" ] ;thenecho "wan ip and port is define $wan_ip:$wan_port"SERVICE_HOST=$wan_ipSERVICE_PORT=$wan_port
fijavaagent="-javaagent:/app/agent/skywalking-agent.jar=agent.service_name=$SKYWALKING_NAME,collector.backend_service=${SKYWALKING_SERVICE}"echo "serviceip:$SERVICEIP"
echo "SKYWALKING_NAME:$SKYWALKING_NAME"
echo "SKYWALKING_SERVICE:$SKYWALKING_SERVICE"
java $javaagent \-server -jar $vmMemory \-Duser.timezone=GMT+08 \-XX:+UseConcMarkSweepGC \/app/app.jar \--spring.cloud.consul.discovery.hostname=$SERVICE_HOST \--spring.cloud.consul.discovery.port=$SERVICE_PORT \--spring.cloud.consul.discovery.healthCheckUrl=http://$SERVICE_HOST:$SERVICE_PORT/base/health \--spring.profiles.active=\${env} \--xxl.job.executor.register.port=\${xxl-job-port} \--xxl.job.executor.register.ip=$SERVICE_HOST
相关文章:
JVM调优,参数在哪里设置的?
JVM调优,参数在哪里设置的? 在Java应用程序中,JVM(Java Virtual Machine)的调优通常通过设置JVM启动参数来实现。这些参数可以控制JVM的内存分配、垃圾回收策略、线程管理、性能优化等方面。 1. JVM参数的位置 JVM参…...

2024年最新Stable Diffusion 新手入门教程,安装使用及模型下载
一、安装要求: ① 操作系统:Windows10以后的系统 ② CPU:不做强制性要求 ③ 内存:推荐8G以上 ④ 显卡:必须是Nvidia的独立显卡,显存最低4G,推荐20系以后;A卡、核显只能用CPU跑 …...

Ubuntu 20.04安装gcc
一、安装GCC 1.更新包列表 user596785154:~$ sudo apt update2.安装gcc user596785154:~$ sudo apt install gcc3.验证安装 user596785154:~$ gcc --version二 编译C文件 1.新建workspace文件夹 user596785154:~$ mkdir workspace2.进入workspace文件夹 user596785154:~…...

IT运维的365天--024 闲置路由器关闭了dhcp,如何知道它的IP是啥
有时候各种原因,我们关闭了路由器的Dhcp,比如需要获取的无线IP和有线同一个网段的情况。时间久了,如果没做标记,大部分时候就会忘了路由器原来设置的是什么IP,没有路由器的对应IP,自然也无法进路由器后台去…...

kaggle竞赛:纽约出租车行程时间NYC Taxi Trip Duration
1.引言 作为一名(坦白说有点懒的)图像处理方向的研究生,说实话最近新开一个坑,可能是因为要寒假了比较无聊,这次带来的系列是kaggle数据处理竞赛的经典例题:纽约出租车行程时间问题。希望大家多多支持&…...
Freemarker模板进行判空
文章目录 freemarker判断对象是否为null使用 ?? 操作符使用 ?has_content 内建函数直接使用 ! 操作符取反 freemarker判断列表是否为空 freemarker判断对象是否为null 在 FreeMarker 模板引擎中,你可以使用内建的指令和条件判断来检测一个对象是否为 null。Free…...
C++ const关键字(八股总结)
作用 const修饰符用来定义常量,具有不可变性。 修饰变量,说明该变量不可以被改变;修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer&…...
Linux 清楚历史命令
在 Linux 中,执行完命令后,如果你想清除终端屏幕上的内容,可以使用以下几种方法: 1. 使用 clear 命令 clear 是 Linux 中最常用的清除屏幕命令。它会将终端屏幕清空,并将光标移动到屏幕左上角。 bash clear 2. 使用快…...

服务器双网卡NCCL通过交换机通信
1、NCCL变量设置 export CUDA_DEVICE_MAX_CONNECTIONS1 export NCCL_SOCKET_IFNAMEeno2 export NCCL_IB_DISABLE0 #export NCCL_NETIB export NCCL_IB_HCAmlx5_0,mlx5_1 export NCCL_IB_GID_INDEX3 export NCCL_DEBUGINFOGPUS_PER_NODE4MASTER_ADDR192.168.1.2 MASTER_PORT600…...

Redis哨兵(sentinel)
是什么 吹哨人巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转换为新主库,继续对外服务 哨兵的作用 1、监控redis运行状态,包括master和slave 2、当master down机,能自动将slave切换成新master 能干嘛…...

小白学Pytorch
小白学Pytorch 发现一个比较好的教程,对于自己来说比较合适,适合从零开始的教程。 1、搭建一个简单的网络 https://www.cnblogs.com/PythonLearner/p/13587092.html 搭建网络这步说的比较清楚: 我们使用nn包中的Sequential搭建网络&#…...

ros2笔记-2.5.3 多线程与回调函数
本节体验下多线程。 python示例 在src/demo_python_pkg/demo_python_pkg/下新建文件,learn_thread.py import threading import requestsclass Download:def download(self,url,callback):print(f线程:{threading.get_ident()} 开始下载:{…...
第5章:Go语言错误处理和异常
第5章:Go语言错误处理和异常 5.1 错误类型基础 5.1.1 error接口 // error接口定义 type error interface {Error() string }// 自定义错误 type CustomError struct {Message stringCode int }func (e *CustomError) Error() string {return fmt.Sprintf(&quo…...
题库刷题知识点总结
算法与机器学习相关 支持向量机:是一种有监督的机器学习算法,用于分类和回归任务。它通过寻找一个最优超平面来将不同类别的数据点分开,最大化两类数据点到超平面的间隔,具有良好的泛化能力和抗噪声能力。机器学习:是…...
GraphRAG:LLM之Graphrag接入milvus
前言 微软目前的graphrag更像个demo,数据量大的时候不是很友好的啊,所以将milvus接入了graphrag,看完这篇文章,其他数据库接入应该也没问题 注:这篇文章只是在search的时候接入进来,index过程或者说整个流…...

adb使用及常用命令
目录 介绍 组成 启用adb调试 常用命令 连接设备 版本信息 安装应用 卸载应用 文件操作 日志查看 屏幕截图和录制 设备重启 端口转发 调试相关 设置属性 设备信息查询 获取帮助 模拟输入 介绍 adb全称为 Android Debug Bridge(Android调试桥),是 A…...

omnipeek分析beacon帧
omnipeek查询设备发送beacon时同一信道两个beacon发送间隔 目录 用例要求分析抓包数据 1.用例要求 Beacon帧发送频率符合规范要求。参数-【同一个信道两个beacon发送间隔不能超过100ms】 2.分析抓包数据 打开becon.pkt文件(用omnipeek工具提前抓取包)…...
Java数组问题
题目2: 定义一个数组,存储1,2,3,4,5,6,7,8,9,10 遍历数组得到的每一个元素,统计数组里面一共多少个能被3整除的数字 package com.s…...
salesforce 可以为同一个简档的同一个 recordtype 的对象设置多种页面布局吗
在 Salesforce 中,对于同一个 Record Type(记录类型),默认情况下,每个 Profile(用户简档) 只能分配一个 Page Layout(页面布局)。也就是说,页面布局的分配规则…...
使用vue项目中,使用webpack模板和直接用vue.config来配置相关插件 区别是什么,具体有哪些提现呢
在 Vue 项目中,使用 Webpack 模板 和 vue.config.js 来配置相关插件的主要区别在于配置的复杂度、灵活性和易用性。以下是两者的详细对比: 1. Webpack 模板 Webpack 模板是 Vue CLI 早期版本(如 Vue CLI 2.x)中提供的项目初始化模…...
iOS 抖音导航栏首页一键分两列功能的实现
要实现 iOS 抖音首页导航栏的“一键分两列”功能(通常指将单列内容切换为双列瀑布流布局),需结合自定义导航栏控件与布局动态切换逻辑。以下是关键实现步骤和技术要点,基于 iOS 原生开发框架(Swift/Objective-C&#x…...
附加模块--Qt OpenGL模块功能及架构
一、模块功能: 主要变化 Qt OpenGL 模块的分离: 在 Qt 6 中,原来的 Qt OpenGL 功能被拆分为多个模块 传统的 Qt OpenGL 模块 (QGL*) 已被标记为废弃 新的图形架构: Qt 6 引入了基于 QRhi (Qt Rendering Hardware Interface) 的…...

GAN优化与改进:从条件生成到训练稳定性
摘要 本文聚焦生成对抗网络(GAN)的核心优化技术与改进模型。系统解析 条件生成对抗网络(CGAN) 的可控生成机制、深度卷积GAN(DCGAN) 的架构创新,揭示GAN训练崩溃的本质原因,并介绍W…...
【生活】程序员防猝si指南
note 一、定期体检二、均衡饮食,多食用对心脏有保护作用的食物三、每周运动四、减压五、保证睡眠六、戒烟限酒7、控制血压8、警惕流感攻击心脏9、关注牙齿健康10、不要抵触吃药 文章目录 note一、定期体检二、均衡饮食,多食用对心脏有保护作用的食物三、…...

机器学习监督学习实战四:九种回归算法对波士顿房价数据进行回归预测和评估方法可视化
本项目代码在个人github链接:https://github.com/KLWU07/Machine-learning-Project-practice/tree/main 处理流程 1.导入波士顿房价数据集并进行预处理。2.使用 GradientBoostingRegressor 模型进行回归分析。3.通过交叉验证评估模型的性能,计算 MAE、…...
勒让德多项式
勒让德多项式 (Legendre) 当区间为 [ − 1 , 1 ] [-1,1] [−1,1],权函数 ρ ( x ) 1 ρ(x)1 ρ(x)1时,由 1 , x , . . . , x n , . . . {1,x,...,x^n,...} 1,x,...,xn,...正交化得到的多项式称为勒让德多项式,并用 P 0 ( x ) , P 1 ( x ) ,…...

SIFT算法详细原理与应用
SIFT算法详细原理与应用 1 SIFT算法由来 1.1 什么是 SIFT? SIFT,全称为 Scale-Invariant Feature Transform(尺度不变特征变换),是一种用于图像特征检测和描述的经典算法。它通过提取图像中的局部关键点,…...

深入解析CI/CD开发流程
引言:主播最近实习的时候发现部门里面使用的是CI/CD这样的集成开发部署,但是自己不是太了解什么意思,所以就自己查了一下ci/cd相关的资料,整理分享了一下 一、CI/CD CI/CD是持续集成和持续交付部署的缩写,旨在简化并…...
深入理解汇编语言中的顺序与分支结构
本文将结合Visual Studio环境配置、顺序结构编程和分支结构实现,全面解析汇编语言中的核心编程概念。通过实际案例演示无符号/有符号数处理、分段函数实现和逻辑表达式短路计算等关键技术。 一、汇编环境配置回顾(Win32MASM) 在Visual Studi…...
[Java 基础]Java 中的关键字
在 Java 编程语言中,关键字 (Keywords) 是预定义的、具有特殊含义的标识符 (identifiers)。它们是 Java 语言语法的一部分,被 Java 编译器赋予了特定的功能和用途。因此,你不能将关键字用作变量名、类名、方法名或其他用户自定义的标识符。 …...