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)中提供的项目初始化模…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...