【JVM虚拟机】JVM调优:常用JVM参数、调优核心指标、OOM排查、GC日志分析、Arthas工具使用(附《思维导图》+《面试高频考点清单》)

文章目录

JVM调优 系统性知识体系

一、JVM调优基础概述

1.1 调优核心目标

  • 延迟优先:降低GC停顿时间(STW),提升系统响应速度(如互联网应用、实时系统)
  • 吞吐量优先:提高CPU有效利用率,减少GC总耗时(如大数据处理、批处理系统)
  • 内存占用优化:控制JVM堆内存大小,避免资源浪费(如容器化部署、微服务)
  • 稳定性保障:防止OOM、频繁Full GC、系统崩溃等问题

1.2 调优时机与原则

必须调优的场景

  • 系统出现OOM异常或频繁Full GC
  • GC停顿时间过长(超过业务容忍阈值,如>500ms)
  • 系统吞吐量明显下降
  • 容器环境中内存资源受限

核心原则

  • 先排查业务代码问题,再考虑JVM调优(80%的性能问题源于代码)
  • 调优是迭代过程,每次只修改一个参数
  • 必须在生产环境相同配置下进行压测验证
  • 避免过度调优,追求"够用即可"

二、常用JVM参数分类详解

2.1 内存配置参数(最基础)

参数 含义 推荐值 说明
-Xms 初始堆内存大小 与-Xmx相同 避免堆内存动态扩展带来的性能损耗
-Xmx 最大堆内存大小 物理内存的1/4~1/2 容器环境建议设置为容器内存限制的70%~80%
-Xmn 新生代大小 堆内存的1/3~1/2 G1收集器不建议显式设置
-XX:NewRatio 老年代与新生代比例 2(老年代:新生代=2:1) 响应快的应用可设为1,让新生代更大
-XX:SurvivorRatio Eden区与Survivor区比例 8(Eden:S0:S1=8:1:1)
-XX:MetaspaceSize 元空间初始大小 256M Java 8+替代永久代
-XX:MaxMetaspaceSize 元空间最大大小 512M 默认无限制,防止内存泄漏
-Xss 每个线程栈大小 1M 递归深度大的应用可适当增大

2.2 GC收集器选择参数

JDK 8默认 :Parallel GC(吞吐量优先)

JDK 9+默认:G1 GC(兼顾吞吐量与延迟)

收集器 启用参数 适用场景
Serial GC -XX:+UseSerialGC 单核CPU、客户端应用
Parallel GC -XX:+UseParallelGC 多核CPU、批处理、大数据
CMS GC -XX:+UseConcMarkSweepGC 低延迟要求的互联网应用(JDK 9已废弃)
G1 GC -XX:+UseG1GC 大堆内存(>4G)、低延迟要求
ZGC -XX:+UseZGC 超大堆内存(>16G)、亚毫秒级停顿(JDK 11+)
Shenandoah GC -XX:+UseShenandoahGC 低延迟、与应用线程并发执行(OpenJDK)

2.3 GC调优参数

通用GC参数

  • -XX:+PrintGCDetails:打印详细GC日志
  • -XX:+PrintGCDateStamps:打印GC发生的时间戳
  • -Xloggc:gc.log:将GC日志输出到文件
  • -XX:+UseGCLogFileRotation:启用GC日志滚动
  • -XX:NumberOfGCLogFiles=5:保留5个GC日志文件
  • -XX:GCLogFileSize=100M:每个GC日志文件大小100M

G1 GC专用参数

  • -XX:MaxGCPauseMillis=200:目标最大GC停顿时间(默认200ms)
  • -XX:G1HeapRegionSize=16M:每个Region大小(1M~32M,必须是2的幂)
  • -XX:InitiatingHeapOccupancyPercent=45:堆占用率达到45%时启动并发标记
  • -XX:G1NewSizePercent=5:新生代最小占比(默认5%)
  • -XX:G1MaxNewSizePercent=60:新生代最大占比(默认60%)

2.4 OOM与故障排查参数

  • -XX:+HeapDumpOnOutOfMemoryError:OOM时自动生成堆转储文件
  • -XX:HeapDumpPath=/tmp/heapdump.hprof:堆转储文件路径
  • -XX:+CrashOnOutOfMemoryError:OOM时直接崩溃JVM(便于快速重启)
  • -XX:ErrorFile=/tmp/hs_err_pid%p.log:JVM崩溃日志路径

三、JVM调优核心指标体系

3.1 内存指标

指标 含义 正常范围 异常表现
堆内存使用率 已用堆内存/最大堆内存 <70% 持续>80%且无法下降,可能存在内存泄漏
元空间使用率 已用元空间/最大元空间 <80% 持续增长可能是类加载泄漏
新生代晋升速率 每秒从新生代晋升到老年代的对象大小 视业务而定 过高会导致老年代快速填满,频繁Full GC
大对象数量 超过Region大小一半的对象 越少越好 大量大对象会直接进入老年代,触发Full GC

3.2 GC指标

指标 含义 正常范围(G1 GC) 异常表现
Young GC频率 每秒Young GC次数 <1次/秒 >5次/秒说明新生代过小或对象创建过快
Young GC平均停顿时间 每次Young GC的平均耗时 <50ms >100ms会影响用户体验
Full GC频率 每小时Full GC次数 <1次/小时 >1次/10分钟说明老年代不足或存在内存泄漏
Full GC平均停顿时间 每次Full GC的平均耗时 <1秒 >5秒会导致系统严重卡顿
GC总耗时占比 GC总时间/系统运行时间 <5% >10%说明GC开销过大,需要调优

3.3 系统指标

  • CPU使用率:正常<70%,GC时会短暂升高
  • 系统负载:与CPU核心数相当(如8核CPU负载<8)
  • 磁盘IO:GC日志和堆转储文件写入会产生IO
  • 网络IO:与业务相关,间接影响JVM性能

四、OOM问题排查方法论与实战

4.1 OOM常见类型与原因

OOM类型 错误信息 常见原因
堆内存溢出 java.lang.OutOfMemoryError: Java heap space 堆内存过小、内存泄漏、大对象过多
元空间溢出 java.lang.OutOfMemoryError: Metaspace 动态生成类过多、反射过度使用、类加载器泄漏
栈内存溢出 java.lang.StackOverflowError 递归深度过大、方法调用链过长
直接内存溢出 java.lang.OutOfMemoryError: Direct buffer memory NIO使用不当、Netty堆外内存泄漏
线程数过多 java.lang.OutOfMemoryError: unable to create native thread 创建线程过多、操作系统线程数限制

4.2 OOM排查标准流程

  1. 保留现场 :确保开启了-XX:+HeapDumpOnOutOfMemoryError参数
  2. 获取堆转储文件 :从HeapDumpPath指定路径获取.hprof文件
  3. 分析堆转储文件:使用MAT、JProfiler、VisualVM等工具
  4. 定位泄漏点:找出占用内存最多的对象及其引用链
  5. 修复代码问题:解决内存泄漏、优化对象创建逻辑
  6. 验证修复效果:进行压测,确认OOM不再发生

4.3 常用OOM排查工具

  • MAT(Memory Analyzer Tool):Eclipse出品,功能强大,支持大堆转储文件分析
  • JProfiler:商业工具,界面友好,支持实时监控和离线分析
  • VisualVM:JDK自带,免费,适合简单分析
  • jhat:JDK自带,命令行工具,已过时,不推荐使用

4.4 内存泄漏常见场景

  • 静态集合类引用大量对象(如static List
  • 监听器和回调未及时注销
  • 数据库连接、IO流未关闭
  • 缓存使用不当(如无限期缓存)
  • 内部类持有外部类引用
  • ThreadLocal使用不当导致内存泄漏

五、GC日志分析完整指南

5.1 GC日志格式解析(G1 GC)

Young GC日志示例

复制代码
2026-05-30T10:00:00.123+0800: 123.456: [GC pause (G1 Evacuation Pause) (young), 0.0234567 secs]
   [Parallel Time: 20.1 ms, GC Workers: 8]
      [GC Worker Start (ms): Min: 123456.1, Avg: 123456.2, Max: 123456.3, Diff: 0.2]
      [Ext Root Scanning (ms): Min: 1.2, Avg: 1.3, Max: 1.4, Diff: 0.2, Sum: 10.4]
      [Update RS (ms): Min: 0.5, Avg: 0.6, Max: 0.7, Diff: 0.2, Sum: 4.8]
      [Scan RS (ms): Min: 0.3, Avg: 0.4, Max: 0.5, Diff: 0.2, Sum: 3.2]
      [Code Root Scanning (ms): Min: 0.1, Avg: 0.1, Max: 0.2, Diff: 0.1, Sum: 0.8]
      [Object Copy (ms): Min: 17.0, Avg: 17.2, Max: 17.4, Diff: 0.4, Sum: 137.6]
      [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
      [GC Worker Other (ms): Min: 0.1, Avg: 0.1, Max: 0.1, Diff: 0.0, Sum: 0.8]
      [GC Worker Total (ms): Min: 19.9, Avg: 20.0, Max: 20.1, Diff: 0.2, Sum: 160.0]
      [GC Worker End (ms): Min: 123476.1, Avg: 123476.2, Max: 123476.3, Diff: 0.2]
   [Code Root Fixup: 0.1 ms]
   [Code Root Purge: 0.0 ms]
   [Clear CT: 0.1 ms]
   [Other: 3.1 ms]
      [Choose CSet: 0.0 ms]
      [Ref Proc: 2.8 ms]
      [Ref Enq: 0.1 ms]
      [Redirty Cards: 0.1 ms]
      [Humongous Register: 0.0 ms]
      [Humongous Reclaim: 0.0 ms]
      [Free CSet: 0.0 ms]
   [Eden: 1024.0M(1024.0M)->0.0B(1024.0M) Survivors: 128.0M->128.0M Heap: 1536.0M(2048.0M)->512.0M(2048.0M)]
 [Times: user=0.16 sys=0.01, real=0.02 secs]

关键信息解读

  • GC类型:G1 Evacuation Pause (young)(新生代回收)
  • GC耗时:0.0234567秒(23.4567毫秒)
  • 内存变化:Eden区从1024M变为0B,堆内存从1536M变为512M
  • 用户态时间:0.16秒,内核态时间:0.01秒,实际时间:0.02秒

5.2 Full GC日志示例(G1 GC)

复制代码
2026-05-30T10:05:00.123+0800: 423.456: [Full GC (Allocation Failure), 1.2345678 secs]
   [Eden: 0.0B(1024.0M)->0.0B(1024.0M) Survivors: 0.0B->0.0B Heap: 2048.0M(2048.0M)->512.0M(2048.0M)]
   [Metaspace: 256.0M->256.0M(1024.0M)]
 [Times: user=8.0 sys=0.1, real=1.23 secs]

关键信息解读

  • Full GC原因:Allocation Failure(分配失败)
  • Full GC耗时:1.2345678秒
  • 堆内存变化:从2048M变为512M
  • 元空间大小:256M,无变化

5.3 GC日志分析工具

  • GCEasy:在线GC日志分析工具,生成可视化报告(推荐)
  • GCViewer:开源桌面工具,支持多种GC日志格式
  • HPjmeter:惠普出品,功能强大,支持大日志文件分析
  • Arthas:支持在线查看GC情况和简单分析

5.4 GC日志常见异常模式

  • 频繁Young GC:新生代过小、对象创建过快
  • 频繁Full GC:老年代不足、内存泄漏、大对象过多
  • GC停顿时间过长:堆内存过大、GC线程数不足、大对象过多
  • GC耗时占比过高:GC参数配置不当、业务代码创建对象过多

六、Arthas工具核心功能与实战技巧

6.1 Arthas简介与安装

Arthas是Alibaba开源的Java诊断工具,无需重启JVM即可在线排查问题,支持JDK 6+,广泛应用于生产环境问题定位。

安装方式

bash 复制代码
# 下载Arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar

# 启动Arthas
java -jar arthas-boot.jar

# 选择要诊断的Java进程
[1]: 12345 com.example.Application

6.2 核心命令分类详解

基础命令

  • dashboard:查看JVM实时运行数据(线程、内存、GC)
  • thread:查看线程堆栈信息
  • jvm:查看JVM详细信息
  • sysprop:查看系统属性
  • sysenv:查看系统环境变量

内存与GC相关命令

  • heapdump:生成堆转储文件(同jmap -dump
  • gc:手动触发GC
  • memory:查看内存使用情况
  • classloader:查看类加载器信息

方法执行监控命令

  • watch:监控方法执行情况(入参、返回值、异常)
  • trace:跟踪方法内部调用路径和耗时
  • stack:查看方法的调用堆栈
  • tt:时间隧道,记录方法执行过程并可重放

类与字节码相关命令

  • sc:搜索已加载的类
  • sm:搜索类的方法
  • jad:反编译类的源代码
  • redefine:热替换类的字节码
  • dump:dump已加载类的字节码到文件

6.3 常用实战场景

场景1:查看最耗时的线程

bash 复制代码
# 查看所有线程,按CPU使用率排序
thread -n 5

# 查看指定线程的堆栈
thread 1234

场景2:监控方法执行耗时

bash 复制代码
# 监控com.example.service.UserService的getUserById方法
watch com.example.service.UserService getUserById "{params, returnObj, throwExp, cost}" -n 10

场景3:跟踪方法调用路径

bash 复制代码
# 跟踪com.example.service.UserService的getUserById方法的内部调用
trace com.example.service.UserService getUserById

场景4:排查方法调用异常

bash 复制代码
# 查看com.example.service.UserService的getUserById方法的异常堆栈
watch com.example.service.UserService getUserById "{throwExp}" -e

场景5:热修复线上代码

bash 复制代码
# 反编译类到文件
jad --source-only com.example.service.UserService > UserService.java

# 修改UserService.java文件

# 编译修改后的文件
mc UserService.java

# 热替换类
redefine -c 1234 com.example.service.UserService

6.4 Arthas高级技巧

  • 使用ognl表达式进行复杂的条件过滤和数据处理
  • 使用batch命令批量执行多个命令
  • 使用tee命令将命令输出保存到文件
  • 使用async命令异步执行耗时操作
  • 使用profiler命令生成火焰图(性能分析利器)

七、JVM调优最佳实践与常见误区

7.1 通用调优最佳实践

  1. 选择合适的GC收集器

    • 堆内存<4G:Parallel GC或G1 GC
    • 堆内存4G~16G:G1 GC
    • 堆内存>16G:ZGC或Shenandoah GC
  2. 合理设置堆内存大小

    • 初始堆内存与最大堆内存设置为相同值
    • 老年代大小至少为新生代的1.5倍
    • 容器环境预留20%~30%的内存给操作系统和其他进程
  3. 优化对象创建与销毁

    • 避免频繁创建短生命周期的大对象
    • 使用对象池复用重量级对象
    • 及时释放不再使用的对象引用
    • 避免使用finalize方法
  4. GC日志与监控

    • 生产环境必须开启GC日志
    • 建立完善的JVM监控体系(Prometheus+Grafana)
    • 设置合理的告警阈值

7.2 常见调优误区

  1. 盲目增大堆内存:堆内存过大会导致GC停顿时间过长
  2. 过度调优新生代:新生代过大会导致老年代过小,频繁Full GC
  3. 忽略元空间配置:元空间默认无限制,可能导致内存泄漏
  4. 只关注Full GC:频繁Young GC同样会影响系统性能
  5. 不进行压测验证:调优参数必须在压测环境验证后才能上线
  6. 迷信"万能参数":没有适用于所有场景的JVM参数,必须根据业务特点调优

7.3 不同业务场景调优策略

业务场景 调优目标 推荐参数配置
互联网应用(低延迟) 降低GC停顿时间 G1 GC,-XX:MaxGCPauseMillis=200,新生代占比40%
大数据处理(高吞吐量) 提高CPU利用率 Parallel GC,新生代占比50%,增大GC线程数
微服务(资源受限) 控制内存占用 G1 GC,堆内存1G~2G,元空间256M
实时系统(超低延迟) 亚毫秒级停顿 ZGC,-XX:+UseZGC,堆内存>16G

JVM调优面试核心考点问答卡片

模块一:JVM调优基础概述

卡片1

问题 :JVM调优的四大核心目标是什么?

答案

  • 延迟优先:降低GC停顿时间(STW),提升系统响应速度
  • 吞吐量优先:提高CPU有效利用率,减少GC总耗时
  • 内存占用优化:控制JVM堆内存大小,避免资源浪费
  • 稳定性保障:防止OOM、频繁Full GC、系统崩溃等问题

卡片2

问题 :哪些场景下必须进行JVM调优?

答案

  • 系统出现OOM异常
  • 频繁发生Full GC
  • GC停顿时间超过业务容忍阈值(如>500ms)
  • 系统吞吐量明显下降
  • 容器环境中内存资源受限

卡片3

问题 :JVM调优的三大核心原则是什么?

答案

  • 先排查业务代码问题,再考虑JVM调优(80%的性能问题源于代码)
  • 调优是迭代过程,每次只修改一个参数
  • 必须在生产环境相同配置下进行压测验证
  • 避免过度调优,追求"够用即可"

模块二:常用JVM参数

卡片4

问题 :最基础的内存配置参数有哪些?分别是什么含义?

答案

  • -Xms:初始堆内存大小(推荐与-Xmx相同)
  • -Xmx:最大堆内存大小(推荐为物理内存的1/4~1/2)
  • -Xmn:新生代大小(G1收集器不建议显式设置)
  • -XX:MetaspaceSize:元空间初始大小(Java 8+替代永久代)
  • -XX:MaxMetaspaceSize:元空间最大大小(默认无限制)
  • -Xss:每个线程栈大小(默认1M)

卡片5

问题 :不同GC收集器的启用参数和适用场景是什么?

答案

收集器 启用参数 适用场景
Serial GC -XX:+UseSerialGC 单核CPU、客户端应用
Parallel GC -XX:+UseParallelGC 多核CPU、批处理、大数据
G1 GC -XX:+UseG1GC 大堆内存(>4G)、低延迟要求
ZGC -XX:+UseZGC 超大堆内存(>16G)、亚毫秒级停顿(JDK 11+)

卡片6

问题 :G1 GC最重要的专用参数有哪些?

答案

  • -XX:MaxGCPauseMillis=200:目标最大GC停顿时间(默认200ms)
  • -XX:G1HeapRegionSize=16M:每个Region大小(1M~32M,必须是2的幂)
  • -XX:InitiatingHeapOccupancyPercent=45:堆占用率达到45%时启动并发标记
  • -XX:G1NewSizePercent=5:新生代最小占比(默认5%)
  • -XX:G1MaxNewSizePercent=60:新生代最大占比(默认60%)

卡片7

问题 :OOM故障排查必备的JVM参数有哪些?

答案

  • -XX:+HeapDumpOnOutOfMemoryError:OOM时自动生成堆转储文件
  • -XX:HeapDumpPath=/tmp/heapdump.hprof:堆转储文件路径
  • -XX:+CrashOnOutOfMemoryError:OOM时直接崩溃JVM(便于快速重启)
  • -XX:ErrorFile=/tmp/hs_err_pid%p.log:JVM崩溃日志路径

模块三:JVM调优核心指标

卡片8

问题 :JVM内存调优的核心指标有哪些?正常范围是多少?

答案

  • 堆内存使用率:<70%(持续>80%可能存在内存泄漏)
  • 元空间使用率:<80%(持续增长可能是类加载泄漏)
  • 新生代晋升速率:视业务而定(过高会导致老年代快速填满)
  • 大对象数量:越少越好(大量大对象直接进入老年代)

卡片9

问题 :GC调优的核心指标有哪些?G1 GC的正常范围是多少?

答案

  • Young GC频率:<1次/秒(>5次/秒说明新生代过小)
  • Young GC平均停顿时间:<50ms(>100ms影响用户体验)
  • Full GC频率:<1次/小时(>1次/10分钟说明老年代不足)
  • Full GC平均停顿时间:<1秒(>5秒导致系统严重卡顿)
  • GC总耗时占比:<5%(>10%说明GC开销过大)

模块四:OOM问题排查

卡片10

问题 :常见的OOM类型有哪些?对应的错误信息是什么?

答案

  • 堆内存溢出:java.lang.OutOfMemoryError: Java heap space
  • 元空间溢出:java.lang.OutOfMemoryError: Metaspace
  • 栈内存溢出:java.lang.StackOverflowError
  • 直接内存溢出:java.lang.OutOfMemoryError: Direct buffer memory
  • 线程数过多:java.lang.OutOfMemoryError: unable to create native thread

卡片11

问题 :OOM排查的标准流程是什么?

答案

  1. 保留现场:确保开启了-XX:+HeapDumpOnOutOfMemoryError参数
  2. 获取堆转储文件:从指定路径获取.hprof文件
  3. 分析堆转储文件:使用MAT、JProfiler等工具
  4. 定位泄漏点:找出占用内存最多的对象及其引用链
  5. 修复代码问题:解决内存泄漏、优化对象创建逻辑
  6. 验证修复效果:进行压测,确认OOM不再发生

卡片12

问题 :Java中常见的内存泄漏场景有哪些?

答案

  • 静态集合类引用大量对象(如static List
  • 监听器和回调未及时注销
  • 数据库连接、IO流未关闭
  • 缓存使用不当(如无限期缓存)
  • 内部类持有外部类引用
  • ThreadLocal使用不当导致内存泄漏

模块五:GC日志分析

卡片13

问题 :G1 GC的Young GC日志中,关键信息有哪些?

答案

  • GC类型:G1 Evacuation Pause (young)
  • GC总耗时:如0.0234567 secs
  • 内存变化:Eden区、Survivor区、堆内存的前后大小
  • 时间统计:user(用户态)、sys(内核态)、real(实际)时间

卡片14

问题 :GC日志中常见的异常模式有哪些?分别说明原因?

答案

  • 频繁Young GC:新生代过小、对象创建过快
  • 频繁Full GC:老年代不足、内存泄漏、大对象过多
  • GC停顿时间过长:堆内存过大、GC线程数不足、大对象过多
  • GC耗时占比过高:GC参数配置不当、业务代码创建对象过多

卡片15

问题 :常用的GC日志分析工具有哪些?

答案

  • GCEasy:在线工具,生成可视化报告(推荐)
  • GCViewer:开源桌面工具,支持多种GC日志格式
  • HPjmeter:惠普出品,支持大日志文件分析
  • Arthas:支持在线查看GC情况和简单分析

模块六:Arthas工具使用

卡片16

问题 :Arthas是什么?有什么优势?

答案

Arthas是Alibaba开源的Java诊断工具,无需重启JVM即可在线排查问题,支持JDK 6+,广泛应用于生产环境问题定位。

卡片17

问题 :Arthas查看JVM实时运行数据和线程信息的命令是什么?

答案

  • dashboard:查看JVM实时运行数据(线程、内存、GC)
  • thread -n 5:查看CPU使用率最高的5个线程
  • thread 1234:查看指定线程的堆栈信息
  • jvm:查看JVM详细信息

卡片18

问题 :Arthas监控和跟踪方法执行的核心命令有哪些?

答案

  • watch:监控方法执行情况(入参、返回值、异常、耗时)
  • trace:跟踪方法内部调用路径和耗时
  • stack:查看方法的调用堆栈
  • tt:时间隧道,记录方法执行过程并可重放

卡片19

问题 :如何使用Arthas进行线上代码热修复?

答案

  1. 反编译类:jad --source-only com.example.UserService > UserService.java
  2. 修改源代码文件
  3. 编译修改后的文件:mc UserService.java
  4. 热替换类:redefine -c 类加载器hash com.example.UserService

模块七:调优最佳实践与误区

卡片20

问题 :不同堆内存大小推荐使用什么GC收集器?

答案

  • 堆内存<4G:Parallel GC或G1 GC
  • 堆内存4G~16G:G1 GC
  • 堆内存>16G:ZGC或Shenandoah GC

卡片21

问题 :JVM调优的常见误区有哪些?

答案

  • 盲目增大堆内存(堆过大会导致GC停顿时间过长)
  • 过度调优新生代(新生代过大会导致老年代过小)
  • 忽略元空间配置(元空间默认无限制,可能导致内存泄漏)
  • 只关注Full GC(频繁Young GC同样影响性能)
  • 不进行压测验证(调优参数必须压测后上线)
  • 迷信"万能参数"(没有适用于所有场景的参数)

卡片22

问题 :如何进行一次完整的JVM调优?

答案

  1. 明确调优目标(延迟、吞吐量、内存占用)
  2. 收集系统运行数据(GC日志、监控指标、压测数据)
  3. 分析问题根源(内存泄漏、GC参数不当、代码问题)
  4. 制定调优方案(调整内存参数、选择GC收集器、优化代码)
  5. 实施调优并进行压测验证
  6. 监控调优效果,迭代优化
相关推荐
大数据魔法师1 小时前
Streamlit(十三)- API 参考文档(六)- 媒体展示组件
python·web
爱写代码的倒霉蛋1 小时前
Hello-Agents的第一个练习-5分钟实现一个智能体(实现详解)
python
程序员cxuan1 小时前
我花了两天时间,终于把 Codex 额度掉太快的问题整明白了!!
人工智能·后端·程序员
IT_陈寒1 小时前
Vue这个动态响应坑把我整不会了
前端·人工智能·后端
金銀銅鐵1 小时前
[Java] 用图形化界面演示 iadd, isub, iconst_<i> 指令的效果
java·后端·python
AskHarries2 小时前
做国内还是出海
后端
J2虾虾2 小时前
Spring AI Alibaba文档
java·人工智能·spring
YikNjy2 小时前
break和continue
java·开发语言·算法
春日见2 小时前
五分钟入门 强化学习---DQN(Deep Q Net)算法与实现
人工智能·python·深度学习·算法·microsoft·机器学习