[scode type="share"]环境:JDK 21 · 2GB内存 · 1-2核 · Spring Boot[/scode] ## 将本地jdk加入到sdkman管理工具 为了避免每次执行java都输入绝对路径,我决定将其加入到sdk版本管理中。 ```bash sdk install java 21-tem-local /projects/java/task_center/jdk-21.0.11+10 # 将该版本设置为默认版本,即当前使用版本 sdk default java 21-tem-local # 检查版本是否已经生效 java -version openjdk version "21.0.11" 2026-04-21 LTS OpenJDK Runtime Environment Temurin-21.0.11+10 (build 21.0.11+10-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.11+10 (build 21.0.11+10-LTS, mixed mode, sharing) ``` ## Q1:先摸底,看当前 Java 版本和运行状态 ```bash # 确认 JDK 版本 root@iZ2ze649h4amvjgmwjh43hZ:~# /home/frunoob/my_project/java/distrisched/task_center/jdk-21.0.11+10/bin/java -version openjdk version "21.0.11" 2026-04-21 LTS OpenJDK Runtime Environment Temurin-21.0.11+10 (build 21.0.11+10-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.11+10 (build 21.0.11+10-LTS, mixed mode, sharing) # 查看当前服务进程和 JVM 参数 root@iZ2ze649h4amvjgmwjh43hZ:~# ps aux | grep java USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 688 2.9 20.2 3197048 388852 ? Sl May25 1:00 /home/frunoob/my_project/java/distrisched/task_center/jdk-21.0.11+10/bin/java -jar /home/frunoob/my_project/java/distrisched/task_center/task_center-v0.0.1-exec.jar --spring.config.additional-location=/home/frunoob/my_project/java/distrisched/task_center/application.properties # 查看系统内存分布 root@iZ2ze649h4amvjgmwjh43hZ:~# free -h total used free shared buff/cache available Mem: 1.8Gi 823Mi 120Mi 1.0Mi 933Mi 874Mi Swap: 1.0Gi 940Mi 83Mi # 查看 CPU 信息 root@iZ2ze649h4amvjgmwjh43hZ:~# nproc && lscpu | grep "CPU(s)" 2 CPU(s): 2 On-line CPU(s) list: 0,1 NUMA node0 CPU(s): 0,1 ``` ## Q2:2GB 内存,Heap 该分多少? [scode type="share"]黄金比例:Heap ≤ 总内存 × 50%,剩余留给 OS、Metaspace、线程栈[/scode] ```bash # 你的机器推荐配置:Heap 700MB,Metaspace 128MB -Xms700m -Xmx700m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m # 为什么 Xms=Xmx?避免运行时动态扩容引发 Full GC 抖动 ``` ## Q3:JDK 21 用哪个垃圾回收器? ```bash # 1核~2核 + 小内存 → 首选 ZGC(JDK21 默认开启分代ZGC) -XX:+UseZGC -XX:+ZGenerational # 备选:G1GC(更成熟,兼容性好) -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1HeapRegionSize=4m ``` 对比验证哪个更适合你: ```bash # 加上 GC 日志再观察 -Xlog:gc*:file=/var/log/app/gc.log:time,uptime:filecount=5,filesize=20m ``` ## 完整启动脚本 ```bash #!/bin/bash # /opt/app/start.sh JVM_OPTS=" -Xms700m -Xmx700m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m # GC -XX:+UseZGC -XX:+ZGenerational # 性能 -XX:+UseStringDeduplication -XX:+OptimizeStringConcat -XX:+TieredCompilation # 1-2核机器限制GC线程数,防止GC抢占业务线程 -XX:ConcGCThreads=1 -XX:ParallelGCThreads=2 # OOM时自动dump -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/heapdump.hprof # GC日志 -Xlog:gc*:file=/var/log/app/gc.log:time,uptime:filecount=5,filesize=20m # JVM崩溃日志 -XX:ErrorFile=/var/log/app/hs_err_%p.log # 加速随机数(容器/虚拟机必加) -Djava.security.egd=file:/dev/./urandom # 时区 -Duser.timezone=Asia/Shanghai " java $JVM_OPTS -jar /opt/app/app.jar ``` ## spring boot配置 [tabs] [tab name="properties" active="true"] ```properties # Server Tomcat 配置 server.tomcat.threads.max=50 server.tomcat.threads.min-spare=10 server.tomcat.accept-count=100 server.connection-timeout=20000 # Spring HikariCP 连接池配置 spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.idle-timeout=600000 spring.datasource.hikari.max-lifetime=1800000 ``` [/tab] [tab name="yaml"] ```yaml # application.yml server: tomcat: threads: max: 50 # 2核小内存,别设太高(默认200会撑爆) min-spare: 10 accept-count: 100 connection-timeout: 20000 spring: datasource: hikari: maximum-pool-size: 10 # 连接池别贪大 minimum-idle: 5 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000 ``` [/tab] [/tabs] ## 监控JRM运行状态 ```bash # 找到 java 进程 PID PID=$(pgrep -f "task_center-v0.0.1-exec.jar") /home/frunoob/my_project/java/distrisched/task_center/jdk-21.0.11+10/bin/jstat -gcutil $PID 1000 S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT - 36.59 3.75 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 4.37 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 4.37 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 4.37 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 4.37 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 4.37 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 5.00 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 5.00 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 5.00 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 5.00 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 5.63 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 5.63 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 6.25 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 6.87 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 6.87 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 6.87 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 6.87 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 7.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 7.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 7.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 7.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 7.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.13 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.13 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.13 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.13 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.13 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.13 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.75 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.75 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.75 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 9.38 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 9.38 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 9.38 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 9.38 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 10.00 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 10.00 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 10.62 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 11.25 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 11.25 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 11.25 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 11.25 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 11.25 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 12.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 12.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 12.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 12.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 39.40 0.62 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 0.62 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 1.88 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 1.88 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 1.88 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 1.88 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 2.50 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 2.50 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 3.12 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 3.12 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 3.12 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 3.12 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 3.12 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 3.75 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 3.75 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 4.37 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 4.37 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 4.37 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 4.37 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 5.63 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 5.63 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 6.25 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 6.25 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 6.25 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 6.25 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 6.87 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 6.87 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 6.87 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 ``` | 标题 | 全称 | 含义 | | :------- | :--------------------- | :---------------------------------- | | **S0** | Survivor 0 | 年轻代 Survivor 0 区的使用率(%) | | **S1** | Survivor 1 | 年轻代 Survivor 1 区的使用率(%) | | **E** | Eden | 年轻代 Eden 区的使用率(%) | | **O** | Old | 老年代(Old Generation)的使用率(%) | | **M** | Metaspace | 元空间使用率(%),Java 8+ 替代永久代(PermGen) | | **CCS** | Compressed Class Space | 压缩类空间使用率(%),存储类元数据 | | **YGC** | Young GC Count | 年轻代 GC 次数 | | **YGCT** | Young GC Time | 年轻代 GC 总耗时(秒) | | **FGC** | Full GC Count | Full GC 次数 | | **FGCT** | Full GC Time | Full GC 总耗时(秒) | | **CGC** | Concurrent GC Count | 并发 GC 次数(如 G1/ZGC/Shenandoah 的并发周期) | | **CGCT** | Concurrent GC Time | 并发 GC 总耗时(秒) | | **GCT** | Total GC Time | 所有 GC 总耗时(秒) | ## 元空间使用率过高 ### 检查当前元空间配置 ```bash jcmd $PID VM.flags | grep Metaspace -XX:CICompilerCount=2 -XX:CompressedClassSpaceSize=218103808 -XX:ConcGCThreads=2 -XX:+ExitOnOutOfMemoryError -XX:G1ConcRefinementThreads=2 -XX:G1EagerReclaimRemSetThreshold=12 -XX:G1HeapRegionSize=1048576 -XX:G1PeriodicGCInterval=60000 -XX:G1RemSetArrayOfCardsEntries=12 -XX:G1RemSetHowlMaxNumBuckets=8 -XX:G1RemSetHowlNumBuckets=4 -XX:GCDrainStackTargetSize=64 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/projects/java/task_center/dump.hprof -XX:InitialHeapSize=268435456 -XX:MarkStackSize=4194304 -XX:MaxGCPauseMillis=100 -XX:MaxHeapFreeRatio=30 -XX:MaxHeapSize=536870912 -XX:MaxMetaspaceSize=268435456 -XX:MaxNewSize=321912832 -XX:MetaspaceSize=134217728 -XX:MinHeapDeltaBytes=1048576 -XX:MinHeapFreeRatio=10 -XX:MinHeapSize=268435456 -XX:NonNMethodCodeHeapSize=5826188 -XX:NonProfiledCodeHeapSize=122916026 -XX:ParallelGCThreads=2 -XX:ProfiledCodeHeapSize=122916026 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:SoftMaxHeapSize=536870912 -XX:-THPStackMitigation -XX:ThreadStackSize=512 -XX:+UseCompressedOops -XX:+UseG1GC -XX:+UseStringDeduplication ``` ### 元数据空间配置分析 | 参数 | 值 | 说明 | | ------------------------------ | ---------------------- | ------- | | `-XX:MetaspaceSize` | **134217728** (128MB) | 初始元空间大小 | | `-XX:MaxMetaspaceSize` | **268435456** (256MB) | 最大元空间上限 | | `-XX:CompressedClassSpaceSize` | **218103808** (~208MB) | 压缩类空间大小 | ### 查看类加载情况 ```bash # 查看类加载统计 jcmd $PID GC.class_stats Loaded Bytes Unloaded Bytes Time 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 ``` 并没有类泄露的异常,因为数值没有持续增长并且实际占用仅30多mb,不应该占用99%的元数据空间。 | 指标 | 数值 | 解读 | | ------------------ | -------------------------- | ------ | | **Loaded** | **20,268** | 已加载类数量 | | **Bytes** | **38,386.9 KB** (~37.5 MB) | 类元数据占用 | | **Unloaded** | 398 | 已卸载类数量 | | **Unloaded Bytes** | 456.7 KB | 卸载的类大小 | | **Time** | 31.20s | 类加载总耗时 | [scode type="red"]由此暗示存在大量不同的类加载器(每个加载器有独立的开销)或存在动态生成类(如 CGLIB、反射、Lambda 等)[/scode] ### 为什么CGC次数那么多 ``` [JVM启动] │ ▼ 初始提交容量 (MetaspaceSize=128MB 触发扩容阈值) │ 使用率接近100%触发 ConcurrentGC ▼ 扩容提交更多内存 ──→ 直到 MaxMetaspaceSize=256MB 传统堆布局 jdk8(ParallelGC) ├─────────── Young Gen ──────────┤─────── Old Gen ────────┤ │ Eden │ Survivor0 │Survivor1 │ │ │[██████]│ [████░░░] │ [░░░░░░] │ [███████████░░░░░░] │ └────────┴────────────┴──────────┴────────────────────────┘ ← 物理连续,大小启动时固定 → # GC触发流程 Eden 区满 │ ▼ 暂停所有线程(STW) │ ▼ 标记 Eden + 当前Survivor(From) 中的存活对象 │ ├─→ 存活 且 age < threshold 且 To区放得下 │ → 复制到 Survivor(To),age+1 │ ├─→ 存活 且 (age>=threshold 或 To区放不下) │ → 复制到 Old Gen(晋升) │ └─→ 死亡 → 直接回收 清空 Eden 和 From Survivor From 和 To 的角色互换(下次GC时To变From) # 新堆内存布局jdk9+(G1)碎片化 ┌─────────────────────────────────────────────┐ │ Eden Region │ Survivor │ Old Region │ │ [███░░░░░░] │ [██░░░] │ [████████░░░░] │ │ 新对象分配 │ 存活对象 │ 长期存活对象 │ └─────────────────────────────────────────────┘ G1 堆布局(每个格子 = 1个 Region,当前配置是 1MB/Region) ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ E │ E │ S │ O │ E │ O │ S │ E │ O │ O │ E │ H │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ │ O │ E │ O │ E │ S │ O │ E │ O │ H │ O │ E │ O │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ E = Eden Region ← 新对象分配在这里 S = Survivor Region ← YGC后存活对象移到这里 O = Old Region ← 长期存活对象 H = Humongous ← 超大对象(>Region的50%) # G1 YGC 决策流程 new 一个对象 │ ▼ 大于512KB? ├─ 是 → 直接进 Humongous/Old └─ 否 → 分配到 Eden │ Eden满,触发YGC │ 这次GC存活? ├─ 否 → 回收 └─ 是 → age+1 │ age >= 动态阈值? 或 Survivor放不下? ├─ 是 → 晋升 Old Region └─ 否 → 留在 Survivor,等下次YGC # YGC 触发条件:Eden Region 被填满 处理范围:Eden + Survivor → 存活对象晋升到 Survivor 或 Old 暂停时间:7.8ms/次(你的目标是 MaxGCPauseMillis=100ms,远优于目标) # FGC 触发条件(任意一个): ├─ Old 区占满,G1 并发标记来不及回收 ├─ Metaspace 超过 MaxMetaspaceSize ├─ 显式调用 System.gc() └─ G1 晋升失败(Evacuation Failure) # CGC 触发条件: ├─ Old 区占用超过 IHOP 阈值(InitiatingHeapOccupancyPercent,默认45%) └─ Metaspace 使用接近当前已提交容量 当前情况:O=46.24% 恰好在 IHOP 阈值附近,会持续触发 ``` ### 排查Old Region ```bash jstat -gcutil $PID 10000 12 S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT - 28.71 10.62 46.25 99.04 96.84 367 2.847 0 0.000 482 8.131 10.978 - 28.45 0.62 46.25 99.04 96.84 368 2.851 0 0.000 484 8.159 11.011 - 28.45 2.50 46.25 99.04 96.84 368 2.851 0 0.000 484 8.159 11.011 - 28.45 5.00 46.25 99.04 96.84 368 2.851 0 0.000 484 8.159 11.011 - 28.45 6.87 46.25 99.04 96.84 368 2.851 0 0.000 484 8.159 11.011 - 28.45 7.50 46.25 99.04 96.84 368 2.851 0 0.000 484 8.159 11.011 - 28.45 9.38 46.25 99.04 96.84 368 2.851 0 0.000 484 8.159 11.011 - 30.26 0.00 46.25 99.04 96.84 369 2.856 0 0.000 486 8.189 11.044 - 30.26 3.75 46.25 99.04 96.84 369 2.856 0 0.000 486 8.189 11.044 - 30.26 5.00 46.25 99.04 96.84 369 2.856 0 0.000 486 8.189 11.044 - 30.26 7.50 46.25 99.04 96.84 369 2.856 0 0.000 486 8.189 11.044 - 30.26 9.38 46.25 99.04 96.84 369 2.856 0 0.000 486 8.189 11.044 ``` Loading... <div class="tip inlineBlock share"> 环境:JDK 21 · 2GB内存 · 1-2核 · Spring Boot </div> ## 将本地jdk加入到sdkman管理工具 为了避免每次执行java都输入绝对路径,我决定将其加入到sdk版本管理中。 ```bash sdk install java 21-tem-local /projects/java/task_center/jdk-21.0.11+10 # 将该版本设置为默认版本,即当前使用版本 sdk default java 21-tem-local # 检查版本是否已经生效 java -version openjdk version "21.0.11" 2026-04-21 LTS OpenJDK Runtime Environment Temurin-21.0.11+10 (build 21.0.11+10-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.11+10 (build 21.0.11+10-LTS, mixed mode, sharing) ``` ## Q1:先摸底,看当前 Java 版本和运行状态 ```bash # 确认 JDK 版本 root@iZ2ze649h4amvjgmwjh43hZ:~# /home/frunoob/my_project/java/distrisched/task_center/jdk-21.0.11+10/bin/java -version openjdk version "21.0.11" 2026-04-21 LTS OpenJDK Runtime Environment Temurin-21.0.11+10 (build 21.0.11+10-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.11+10 (build 21.0.11+10-LTS, mixed mode, sharing) # 查看当前服务进程和 JVM 参数 root@iZ2ze649h4amvjgmwjh43hZ:~# ps aux | grep java USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 688 2.9 20.2 3197048 388852 ? Sl May25 1:00 /home/frunoob/my_project/java/distrisched/task_center/jdk-21.0.11+10/bin/java -jar /home/frunoob/my_project/java/distrisched/task_center/task_center-v0.0.1-exec.jar --spring.config.additional-location=/home/frunoob/my_project/java/distrisched/task_center/application.properties # 查看系统内存分布 root@iZ2ze649h4amvjgmwjh43hZ:~# free -h total used free shared buff/cache available Mem: 1.8Gi 823Mi 120Mi 1.0Mi 933Mi 874Mi Swap: 1.0Gi 940Mi 83Mi # 查看 CPU 信息 root@iZ2ze649h4amvjgmwjh43hZ:~# nproc && lscpu | grep "CPU(s)" 2 CPU(s): 2 On-line CPU(s) list: 0,1 NUMA node0 CPU(s): 0,1 ``` ## Q2:2GB 内存,Heap 该分多少? <div class="tip inlineBlock share"> 黄金比例:Heap ≤ 总内存 × 50%,剩余留给 OS、Metaspace、线程栈 </div> ```bash # 你的机器推荐配置:Heap 700MB,Metaspace 128MB -Xms700m -Xmx700m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m # 为什么 Xms=Xmx?避免运行时动态扩容引发 Full GC 抖动 ``` ## Q3:JDK 21 用哪个垃圾回收器? ```bash # 1核~2核 + 小内存 → 首选 ZGC(JDK21 默认开启分代ZGC) -XX:+UseZGC -XX:+ZGenerational # 备选:G1GC(更成熟,兼容性好) -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1HeapRegionSize=4m ``` 对比验证哪个更适合你: ```bash # 加上 GC 日志再观察 -Xlog:gc*:file=/var/log/app/gc.log:time,uptime:filecount=5,filesize=20m ``` ## 完整启动脚本 ```bash #!/bin/bash # /opt/app/start.sh JVM_OPTS=" -Xms700m -Xmx700m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m # GC -XX:+UseZGC -XX:+ZGenerational # 性能 -XX:+UseStringDeduplication -XX:+OptimizeStringConcat -XX:+TieredCompilation # 1-2核机器限制GC线程数,防止GC抢占业务线程 -XX:ConcGCThreads=1 -XX:ParallelGCThreads=2 # OOM时自动dump -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/heapdump.hprof # GC日志 -Xlog:gc*:file=/var/log/app/gc.log:time,uptime:filecount=5,filesize=20m # JVM崩溃日志 -XX:ErrorFile=/var/log/app/hs_err_%p.log # 加速随机数(容器/虚拟机必加) -Djava.security.egd=file:/dev/./urandom # 时区 -Duser.timezone=Asia/Shanghai " java $JVM_OPTS -jar /opt/app/app.jar ``` ## spring boot配置 <div class="tab-container post_tab box-shadow-wrap-lg"> <ul class="nav no-padder b-b scroll-hide" role="tablist"> <li class='nav-item active' role="presentation"><a class='nav-link active' style="" data-toggle="tab" aria-controls='tabs-fa2dc7e14127a160c62fda72f2023851690' role="tab" data-target='#tabs-fa2dc7e14127a160c62fda72f2023851690'>properties</a></li><li class='nav-item ' role="presentation"><a class='nav-link ' style="" data-toggle="tab" aria-controls='tabs-eb16c470179b55c52cf68a4215bc7e7d671' role="tab" data-target='#tabs-eb16c470179b55c52cf68a4215bc7e7d671'>yaml</a></li> </ul> <div class="tab-content no-border"> <div role="tabpanel" id='tabs-fa2dc7e14127a160c62fda72f2023851690' class="tab-pane fade active in"> ```properties # Server Tomcat 配置 server.tomcat.threads.max=50 server.tomcat.threads.min-spare=10 server.tomcat.accept-count=100 server.connection-timeout=20000 # Spring HikariCP 连接池配置 spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.idle-timeout=600000 spring.datasource.hikari.max-lifetime=1800000 ``` </div><div role="tabpanel" id='tabs-eb16c470179b55c52cf68a4215bc7e7d671' class="tab-pane fade "> ```yaml # application.yml server: tomcat: threads: max: 50 # 2核小内存,别设太高(默认200会撑爆) min-spare: 10 accept-count: 100 connection-timeout: 20000 spring: datasource: hikari: maximum-pool-size: 10 # 连接池别贪大 minimum-idle: 5 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000 ``` </div> </div> </div> ## 监控JRM运行状态 ```bash # 找到 java 进程 PID PID=$(pgrep -f "task_center-v0.0.1-exec.jar") /home/frunoob/my_project/java/distrisched/task_center/jdk-21.0.11+10/bin/jstat -gcutil $PID 1000 S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT - 36.59 3.75 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 4.37 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 4.37 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 4.37 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 4.37 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 4.37 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 5.00 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 5.00 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 5.00 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 5.00 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 5.63 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 5.63 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 6.25 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 6.87 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 6.87 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 6.87 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 6.87 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 7.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 7.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 7.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 7.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 7.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.13 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.13 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.13 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.13 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.13 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.13 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.75 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.75 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 8.75 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 9.38 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 9.38 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 9.38 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 9.38 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 10.00 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 10.00 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 10.62 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 11.25 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 11.25 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 11.25 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 11.25 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 11.25 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 12.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 12.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 12.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 36.59 12.50 45.86 99.02 96.84 313 2.535 0 0.000 378 6.248 8.784 - 39.40 0.62 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 0.62 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 1.88 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 1.88 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 1.88 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 1.88 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 2.50 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 2.50 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 3.12 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 3.12 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 3.12 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 3.12 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 3.12 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 3.75 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 3.75 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 4.37 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 4.37 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 4.37 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 4.37 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 5.63 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 5.63 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 6.25 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 6.25 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 6.25 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 6.25 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 6.87 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 6.87 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 - 39.40 6.87 45.86 99.02 96.84 314 2.540 0 0.000 380 6.278 8.817 ``` | 标题 | 全称 | 含义 | | :------- | :--------------------- | :---------------------------------- | | **S0** | Survivor 0 | 年轻代 Survivor 0 区的使用率(%) | | **S1** | Survivor 1 | 年轻代 Survivor 1 区的使用率(%) | | **E** | Eden | 年轻代 Eden 区的使用率(%) | | **O** | Old | 老年代(Old Generation)的使用率(%) | | **M** | Metaspace | 元空间使用率(%),Java 8+ 替代永久代(PermGen) | | **CCS** | Compressed Class Space | 压缩类空间使用率(%),存储类元数据 | | **YGC** | Young GC Count | 年轻代 GC 次数 | | **YGCT** | Young GC Time | 年轻代 GC 总耗时(秒) | | **FGC** | Full GC Count | Full GC 次数 | | **FGCT** | Full GC Time | Full GC 总耗时(秒) | | **CGC** | Concurrent GC Count | 并发 GC 次数(如 G1/ZGC/Shenandoah 的并发周期) | | **CGCT** | Concurrent GC Time | 并发 GC 总耗时(秒) | | **GCT** | Total GC Time | 所有 GC 总耗时(秒) | ## 元空间使用率过高 ### 检查当前元空间配置 ```bash jcmd $PID VM.flags | grep Metaspace -XX:CICompilerCount=2 -XX:CompressedClassSpaceSize=218103808 -XX:ConcGCThreads=2 -XX:+ExitOnOutOfMemoryError -XX:G1ConcRefinementThreads=2 -XX:G1EagerReclaimRemSetThreshold=12 -XX:G1HeapRegionSize=1048576 -XX:G1PeriodicGCInterval=60000 -XX:G1RemSetArrayOfCardsEntries=12 -XX:G1RemSetHowlMaxNumBuckets=8 -XX:G1RemSetHowlNumBuckets=4 -XX:GCDrainStackTargetSize=64 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/projects/java/task_center/dump.hprof -XX:InitialHeapSize=268435456 -XX:MarkStackSize=4194304 -XX:MaxGCPauseMillis=100 -XX:MaxHeapFreeRatio=30 -XX:MaxHeapSize=536870912 -XX:MaxMetaspaceSize=268435456 -XX:MaxNewSize=321912832 -XX:MetaspaceSize=134217728 -XX:MinHeapDeltaBytes=1048576 -XX:MinHeapFreeRatio=10 -XX:MinHeapSize=268435456 -XX:NonNMethodCodeHeapSize=5826188 -XX:NonProfiledCodeHeapSize=122916026 -XX:ParallelGCThreads=2 -XX:ProfiledCodeHeapSize=122916026 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:SoftMaxHeapSize=536870912 -XX:-THPStackMitigation -XX:ThreadStackSize=512 -XX:+UseCompressedOops -XX:+UseG1GC -XX:+UseStringDeduplication ``` ### 元数据空间配置分析 | 参数 | 值 | 说明 | | ------------------------------ | ---------------------- | ------- | | `-XX:MetaspaceSize` | **134217728** (128MB) | 初始元空间大小 | | `-XX:MaxMetaspaceSize` | **268435456** (256MB) | 最大元空间上限 | | `-XX:CompressedClassSpaceSize` | **218103808** (~208MB) | 压缩类空间大小 | ### 查看类加载情况 ```bash # 查看类加载统计 jcmd $PID GC.class_stats Loaded Bytes Unloaded Bytes Time 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 20268 38386.9 398 456.7 31.20 ``` 并没有类泄露的异常,因为数值没有持续增长并且实际占用仅30多mb,不应该占用99%的元数据空间。 | 指标 | 数值 | 解读 | | ------------------ | -------------------------- | ------ | | **Loaded** | **20,268** | 已加载类数量 | | **Bytes** | **38,386.9 KB** (~37.5 MB) | 类元数据占用 | | **Unloaded** | 398 | 已卸载类数量 | | **Unloaded Bytes** | 456.7 KB | 卸载的类大小 | | **Time** | 31.20s | 类加载总耗时 | <div class="tip inlineBlock error"> 由此暗示存在大量不同的类加载器(每个加载器有独立的开销)或存在动态生成类(如 CGLIB、反射、Lambda 等) </div> ### 为什么CGC次数那么多 ``` [JVM启动] │ ▼ 初始提交容量 (MetaspaceSize=128MB 触发扩容阈值) │ 使用率接近100%触发 ConcurrentGC ▼ 扩容提交更多内存 ──→ 直到 MaxMetaspaceSize=256MB 传统堆布局 jdk8(ParallelGC) ├─────────── Young Gen ──────────┤─────── Old Gen ────────┤ │ Eden │ Survivor0 │Survivor1 │ │ │[██████]│ [████░░░] │ [░░░░░░] │ [███████████░░░░░░] │ └────────┴────────────┴──────────┴────────────────────────┘ ← 物理连续,大小启动时固定 → # GC触发流程 Eden 区满 │ ▼ 暂停所有线程(STW) │ ▼ 标记 Eden + 当前Survivor(From) 中的存活对象 │ ├─→ 存活 且 age < threshold 且 To区放得下 │ → 复制到 Survivor(To),age+1 │ ├─→ 存活 且 (age>=threshold 或 To区放不下) │ → 复制到 Old Gen(晋升) │ └─→ 死亡 → 直接回收 清空 Eden 和 From Survivor From 和 To 的角色互换(下次GC时To变From) # 新堆内存布局jdk9+(G1)碎片化 ┌─────────────────────────────────────────────┐ │ Eden Region │ Survivor │ Old Region │ │ [███░░░░░░] │ [██░░░] │ [████████░░░░] │ │ 新对象分配 │ 存活对象 │ 长期存活对象 │ └─────────────────────────────────────────────┘ G1 堆布局(每个格子 = 1个 Region,当前配置是 1MB/Region) ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ E │ E │ S │ O │ E │ O │ S │ E │ O │ O │ E │ H │ ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ │ O │ E │ O │ E │ S │ O │ E │ O │ H │ O │ E │ O │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ E = Eden Region ← 新对象分配在这里 S = Survivor Region ← YGC后存活对象移到这里 O = Old Region ← 长期存活对象 H = Humongous ← 超大对象(>Region的50%) # G1 YGC 决策流程 new 一个对象 │ ▼ 大于512KB? ├─ 是 → 直接进 Humongous/Old └─ 否 → 分配到 Eden │ Eden满,触发YGC │ 这次GC存活? ├─ 否 → 回收 └─ 是 → age+1 │ age >= 动态阈值? 或 Survivor放不下? ├─ 是 → 晋升 Old Region └─ 否 → 留在 Survivor,等下次YGC # YGC 触发条件:Eden Region 被填满 处理范围:Eden + Survivor → 存活对象晋升到 Survivor 或 Old 暂停时间:7.8ms/次(你的目标是 MaxGCPauseMillis=100ms,远优于目标) # FGC 触发条件(任意一个): ├─ Old 区占满,G1 并发标记来不及回收 ├─ Metaspace 超过 MaxMetaspaceSize ├─ 显式调用 System.gc() └─ G1 晋升失败(Evacuation Failure) # CGC 触发条件: ├─ Old 区占用超过 IHOP 阈值(InitiatingHeapOccupancyPercent,默认45%) └─ Metaspace 使用接近当前已提交容量 当前情况:O=46.24% 恰好在 IHOP 阈值附近,会持续触发 ``` ### 排查Old Region ```bash jstat -gcutil $PID 10000 12 S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT - 28.71 10.62 46.25 99.04 96.84 367 2.847 0 0.000 482 8.131 10.978 - 28.45 0.62 46.25 99.04 96.84 368 2.851 0 0.000 484 8.159 11.011 - 28.45 2.50 46.25 99.04 96.84 368 2.851 0 0.000 484 8.159 11.011 - 28.45 5.00 46.25 99.04 96.84 368 2.851 0 0.000 484 8.159 11.011 - 28.45 6.87 46.25 99.04 96.84 368 2.851 0 0.000 484 8.159 11.011 - 28.45 7.50 46.25 99.04 96.84 368 2.851 0 0.000 484 8.159 11.011 - 28.45 9.38 46.25 99.04 96.84 368 2.851 0 0.000 484 8.159 11.011 - 30.26 0.00 46.25 99.04 96.84 369 2.856 0 0.000 486 8.189 11.044 - 30.26 3.75 46.25 99.04 96.84 369 2.856 0 0.000 486 8.189 11.044 - 30.26 5.00 46.25 99.04 96.84 369 2.856 0 0.000 486 8.189 11.044 - 30.26 7.50 46.25 99.04 96.84 369 2.856 0 0.000 486 8.189 11.044 - 30.26 9.38 46.25 99.04 96.84 369 2.856 0 0.000 486 8.189 11.044 ``` 最后修改:2026 年 05 月 28 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 你的点赞将成为我坚持的动力,之一