面试官最爱问的FullGC排查实战:从日志分析到堆转储的完整避坑指南

性能优化实战:当向量库超过 10 万行,如何把检索延迟压到 50ms 以内? 本文系统优化 pgvector 向量检索性能,针对 10 万行数据下查询延迟高达数百毫秒的问题,通过四步优化:选用 HNSW 索引、调优 ef_search、用内积替代余弦距离、结合过滤索引,将延迟从 280ms 降至 3ms 以内。实测表明,合理选型与参数配置可实现毫秒级响应,满足实时场景需求,并附避坑指南,强调索引适用阈值与维护策略。 阅读详情

面试官最爱问的FullGC排查实战:从日志分析到堆转储的完整避坑指南

最近和几位准备面试的朋友聊天,发现一个挺有意思的现象:大家刷了不少JVM八股文,对垃圾回收算法、内存区域划分倒背如流,可一旦被问到“线上系统频繁FullGC,你怎么排查?”这种实战问题,回答往往就变得支支吾吾,逻辑混乱。面试官想听的,不是教科书上的理论复述,而是一套清晰、可落地、能体现你工程化思维的排查路径。这就像医生看病,光知道人体解剖结构没用,关键得会看化验单、会分析CT影像,最后能开出对症的药方。

频繁FullGC本质上是一个系统性问题的外在症状,它可能源于一行有问题的代码,也可能指向整个架构设计的缺陷。一个成熟的开发者,应该具备从监控告警的“现象感知”,到日志分析的“线索追踪”,再到堆转储深度剖析的“根因定位”,最后给出“根治方案”的完整能力闭环。这篇文章,我就结合自己踩过的坑和带团队处理线上问题的经验,为你梳理一套面试中能清晰表达、工作中能直接上手的FullGC排查实战指南。我们会从最外部的监控指标看起,一步步深入到GC日志的蛛丝马迹,最后用MAT等工具给内存做个“解剖”,让你不仅知道怎么做,更明白为什么这么做。

1. 建立观测:从系统指标到JVM内部视角

排查任何问题,第一步永远是“看见”。在FullGC问题上,盲目登录服务器敲命令是低效且危险的。一个成熟的工程师,应该首先依赖完善的监控体系来定位问题的大致范围和严重程度。这不仅能快速缩小排查范围,也能在面试中体现你具备“可观测性”的现代运维思维。

1.1 系统层与业务层监控:建立问题关联

FullGC不会孤立发生,它一定会体现在系统指标和业务指标上。面试时,你可以这样描述你的第一反应:“我会先看整体监控大盘,确认FullGC是否已经对业务造成了实质性影响,并初步判断问题的紧急程度。”

核心监控看板与指标:

  1. 系统资源监控:

    • CPU使用率与负载:频繁的FullGC会导致GC线程长时间占用CPU,表现为系统CPU使用率,特别是%sys或%iowait(如果GC涉及大量对象移动)异常升高,而%user(应用线程)占比下降。使用top命令查看整体情况,再用top -Hp <pid>查看具体Java进程的线程情况,如果看到多个GC task thread线程CPU消耗持续高位,这就是一个强烈信号。
    • 内存使用趋势:通过free -m或监控平台观察系统剩余内存。虽然JVM管理堆内内存,但频繁FullGC可能导致堆外内存(如Direct Buffer、Metaspace)或物理内存的异常波动,这也是一个辅助判断点。
  2. 业务应用监控:

    • 应用吞吐量与延迟:这是最直接的业务影响体现。查看QPS是否出现断崖式下跌,接口平均响应时间(Avg)、95分位(P95)、99分位(P99)响应时间是否出现周期性尖刺。如果这些尖刺与后续发现的GC时间点吻合,就建立了FullGC导致业务受损的直接证据链。
    • 错误与超时率:观察是否有大量超时错误、熔断器开启或线程池满载拒绝。这些往往是FullGC导致STW时间过长,请求堆积后的连锁反应。

提示:在面试中,强调你会关联时间点。例如:“我发现每天下午2点左右,订单服务的P99延迟就会从50ms飙升至2秒,同时监控到该实例的CPU使用率出现周期性峰值。我怀疑这个时间点有定时任务或流量高峰触发了密集的垃圾回收。”

1.2 JVM内部指标:定位问题核心

在系统层指标发出警报后,我们需要深入JVM内部,获取更精确的数据。这里主要依靠JMX暴露的指标。

关键JVM监控指标(通过Prometheus + Grafana或类似平台):

指标类别具体指标正常阈值参考异常信号解读
堆内存jvm_memory_used_bytes{area="heap"}老年代使用率应呈锯齿状,有升有降老年代使用率持续走高,FullGC后释放很少(<20%),可能内存泄漏
jvm_memory_used_bytes{area="nonheap"} (Metaspace)相对稳定,缓慢增长后平台期持续快速增长,可能类加载泄漏
垃圾回收jvm_gc_pause_seconds_count{gc="G1 Old Generation"} (Full GC次数)越低越好,理想情况天级别甚至更久次数频繁增加(如>1次/分钟)
jvm_gc_pause_seconds_sum{gc="G1 Old Generation"} (Full GC总耗时)-耗时持续增长,或单次耗时过长(>1秒)
jvm_gc_memory_promoted_bytes_total (晋升到老年代的数据量)结合业务流量看趋势在流量平稳时,晋升速率异常高,可能有大对象或过早晋升
线程与类加载jvm_threads_live (活动线程数)与线程池配置相关,保持稳定线程数持续增长不释放,可能与ThreadLocal泄漏有关
jvm_classes_loaded (已加载类数)启动后增长至稳定持续快速增长,警惕动态类生成(如Groovy, CGLib)

实操命令:快速获取现场信息 如果监控平台尚未覆盖,或需要即时验证,可以通过命令行快速抓取信息。登录服务器后,找到Java进程PID,然后:

# 1. 查看整体JVM内存和GC概况(每2秒刷新一次)
jstat -gcutil <pid> 2000

# 重点关注列:
#  S0/S1: Survivor区使用率
#  E: Eden区使用率
#  O: 老年代使用率
#  M: 元空间使用率
#  CCS: 压缩类空间使用率
#  YGC/YGCT: Young GC次数/总耗时
#  FGC/FGCT: Full GC次数/总耗时
#  GCT: GC总耗时

# 2. 查看堆内存各区域容量和使用量(更详细)
jstat -gc <pid> 2000

# 3. 查看JVM进程摘要信息(JDK自带工具)
jcmd <pid> VM.info

通过这一步,你应该能回答面试官:“我首先通过监控平台发现老年代使用率在每次FullGC后下降不明显,且FullGC频率在最近一小时内从每天几次上升到每分钟几次,同时接口P99延迟同步飙升。这初步判断可能是内存泄漏,而非单纯的大对象瞬时分配。”

2. 线索追踪:深度解析GC日志

监控指标告诉我们“病了”,GC日志则像“化验单”,能告诉我们“病的可能原因”。获取一份详尽的GC日志是分析的基础。很多线上问题复现困难,一份完整的GC日志往往是事后分析的唯一可靠依据。

2.1 如何生成一份“有用”的GC日志

很多同学在面试中被问到“你怎么看GC日志”时,第一关就卡住了——因为他们的测试环境甚至线上环境根本没开详细的GC日志。这是一个重要的实战点。

必备的JVM参数(以G1 GC为例,JDK 8+):

# 开启GC日志记录,这是最基本的
-Xloggc:/path/to/your/gc-%t.log
# 使用可读的时间戳
-XX:+PrintGCDateStamps
# 打印详细的GC信息
-XX:+PrintGCDetails
# 打印GC前后的堆内存分布
-XX:+PrintHeapAtGC
# 打印导致GC的原因(如Allocation Failure)
-XX:+PrintGCCause

# 对于G1,还可以增加以下参数获得更详细的信息
-XX:+PrintAdaptiveSizePolicy # 打印G1自适应策略调整信息
-XX:+PrintTenuringDistribution # 打印对象年龄分布,有助于分析晋升

# 日志滚动,防止单个文件过大
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=10M

对于JDK 9及以上版本,推荐使用统一日志框架:

-Xlog:gc*,gc+heap*,gc+age*:file=/path/to/gc-%t.log:time,level,tags:filecount=10,filesize=100m

2.2 解读GC日志:寻找故障的蛛丝马迹

拿到日志后,不要被密密麻麻的文字吓到。我们像侦探一样,关注几个关键部分。下面看一段典型的G1 Full GC日志:

2024-05-27T10:15:30.123+0800: 34567.890: [Full GC (Allocation Failure) 2024-05-27T10:15:30.123+0800: 34567.890: [G1Ergonomics (Heap Sizing) expand the heap, requested expansion amount: 357564416 bytes, attempted expansion amount: 357564416 bytes, expansion limit: 1073741824 bytes]
  [Eden: 0.0B(100.0M)->0.0B(100.0M) Survivors: 0.0B->0.0B Heap: 4096.0M(4096.0M)->1024.5M(4096.0M)], [Metaspace: 85632K->85632K(113664K)]
 [Times: user=1.23 sys=0.05, real=0.98 secs]

逐行拆解:

  1. 时间戳与触发原因:[Full GC (Allocation Failure) 表明这是一次Full GC,触发原因是分配失败。这是最常见的Full GC触发原因之一,意味着JVM在尝试分配对象时,无论是新生代还是老年代,都无法找到足够的连续空间。
  2. 堆内存变化:Heap: 4096.0M(4096.0M)->1024.5M(4096.0M) 这是最关键的信息。它表示GC前堆已用4096M(堆总容量4096M,即100%满了),GC后堆已用1024.5M(释放了约3G)。这看起来回收了很多内存,但需要结合前后日志看趋势。如果每次Full GC前堆都接近100%,且回收后释放的内存越来越少(例如从3G到1G,再到500M),这就是典型内存泄漏的迹象——存活对象在持续累积。
  3. 各区域细节:
    • Eden: 0.0B(100.0M)->0.0B(100.0M):Eden区在GC前后都是空的,这符合Full GC的定义(会回收整个堆,包括新生代)。
    • Survivors: 0.0B->0.0B:Survivor区同样被清空。
    • Metaspace: 85632K->85632K(113664K):元空间使用量在GC前后没有变化。如果这个数值在多次GC中持续增长,直到接近限制(如(113664K)),则可能触发了Metadata GC Threshold类型的Full GC,指向类加载泄漏问题。
  4. 耗时:[Times: user=1.23 sys=0.05, real=0.98 secs]。real=0.98 secs 表示这次Full GC导致了应用停顿(STW)了约1秒钟。对于低延迟服务,这是不可接受的。

其他常见的Full GC触发原因及日志关键字:

  • [Full GC (Metadata GC Threshold)]:元空间使用量达到阈值触发。重点关注Metaspace使用量是否只增不减。
  • [Full GC (System.gc())]:代码中显式调用了System.gc()。需要检查代码或第三方库。
  • [Full GC (G1 Humongous Allocation Failure)]:G1垃圾收集器在分配巨型对象(大于Region一半大小的对象)时失败。需要检查是否有大对象(如大数组、大字符串)被直接分配到了老年代。

分析模式总结:

  • 模式A(瞬时压力):Full GC发生间隔不规则,每次GC前堆使用率很高,但GC后能释放大量空间(如从90%降到30%)。这通常是由突发性的大对象分配或批量数据处理引起。
  • 模式B(内存泄漏):Full GC发生频率越来越快,每次GC前堆使用率都接近100%,但GC后释放的空间越来越少(如从90%降到85%,再到88%)。老年代使用率曲线呈“楼梯式上升”。这是最需要警惕的模式。
  • 模式C(元空间泄漏):Full GC触发原因为Metadata GC Threshold,且Metaspace使用量在多次GC中持续增长,GC后几乎不下降。

在面试中,你可以说:“我拿到GC日志后,首先会搜索‘Full GC’关键字,统计频率和耗时。然后重点看每次Full GC前后老年代和Metaspace的使用量变化。如果发现老年代使用率在GC后下降不明显,呈上升趋势,我就会高度怀疑是内存泄漏,并准备进行堆转储分析。”

3. 内存解剖:堆转储分析与MAT实战

当GC日志指向可能存在内存泄漏或异常大对象时,我们就需要给JVM内存拍一张“CT片”——也就是生成堆转储(Heap Dump),然后用专业工具进行深度分析。这是定位问题根因的终极手段。

3.1 安全地获取堆转储

在生产环境获取堆转储需要谨慎,因为它会触发一次Full GC(如果使用live参数)并产生一个可能很大的文件,对正在运行的服务有短暂影响。

常用命令:

# 最常用的命令,生成包含所有存活对象的堆转储
jmap -dump:live,format=b,file=heap.hprof <pid>

# 如果不加`live`,会包含所有对象(包括即将被回收的),文件更大,分析噪音也多
# jmap -dump:format=b,file=heap.hprof <pid>

最佳实践与注意事项:

  • 时机:最好在Full GC刚刚发生后立即执行,这样dump文件中包含的都是“顽固”的存活对象,分析起来更清晰。
  • 磁盘空间:确保磁盘有足够空间(堆转储文件大小通常接近JVM堆内存使用量)。
  • 线上谨慎:对于超大堆(如数十GB)的服务,jmap可能导致服务停顿数秒甚至更久。可以考虑使用Arthas的heapdump命令,它通常更轻量,或者通过JVM参数配置在发生OOM时自动生成dump。
    # 使用Arthas(需先attach到进程)
    heapdump /tmp/heap.hprof
    
  • 自动触发:可以在JVM启动参数中加入以下参数,以便在发生OOM时自动生成dump,方便事后分析。
    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprof
    

3.2 使用MAT进行深度分析

Eclipse Memory Analyzer Tool (MAT) 是分析堆转储最强大的工具之一。它不仅能帮你找到占用内存最大的对象,还能分析是谁持有着这些对象导致其无法被回收。

分析流程与面试表达:

  1. 打开堆转储文件:MAT会提示你生成分析报告,选择“Leak Suspects Report”(泄漏疑点报告)是一个很好的开始。

  2. 查看“概览”与“疑点”:MAT首页的“Overview”和“Leak Suspects”会给出一个智能分析结果。它会列出疑似内存泄漏的问题点,比如“一个java.util.HashMap的实例占据了1.2GB内存”。在面试中,你可以直接从这里开始陈述:“我用MAT打开dump文件后,泄漏疑点报告直接提示一个ConcurrentHashMap实例保留了超过60%的堆内存,这立刻引起了我的注意。”

  3. 使用支配树(Dominator Tree):这是MAT的核心功能。支配树按对象的“保留大小(Retained Heap)”排序,能直观地告诉你,如果这个对象被回收,能释放多少内存。

    • 在支配树视图中,找到排名最靠前的几个对象。
    • 右键点击可疑对象(比如一个巨大的ArrayList或HashMap),选择“Path To GC Roots” -> “exclude weak/soft references”(排除弱/软引用)。这一步至关重要,它显示了保持该对象存活的强引用链。如果引用链的根部是一个静态变量(static字段)或是一个被线程池长期持有的对象,那么内存泄漏的根因就找到了。
  4. 分析案例实战: 假设支配树显示一个com.xxx.OrderCache类的静态变量orderMap(一个HashMap)占据了1.5GB内存。查看其Path to GC Roots,引用链可能是:

    orderMap (java.util.HashMap) @ 0x12345678
    <- static cache (com.xxx.OrderCache) @ 0x87654321
    <- class (java.lang.Class) @ 0x...
    <- system class loader
    

    这清晰地表明,这个巨大的HashMap被一个类的静态字段持有,而该类又被系统类加载器加载。由于类加载器是GC Roots的一部分,只要应用不重启,这个HashMap和它里面的所有Order对象就永远不会被回收。根因就是:这个缓存被设计成了永不清理的静态Map。

  5. 查看对象详情:你可以点开这个HashMap,查看里面的条目数、具体的键值对是什么。也许你会发现里面缓存了上百万条用户会话数据,却没有设置过期时间或LRU淘汰策略。

面试中如何描述这个过程: “通过MAT的支配树,我快速定位到内存占用最大的对象是一个UserSessionCache里的ConcurrentHashMap。接着我使用‘Path to GC Roots’功能,排除了弱引用,发现它被一个static final字段引用。这就解释了为什么Full GC无法回收它——它是一个全局静态缓存,随着用户不断登录,里面的UserSession对象只增不减,最终撑爆了老年代。解决方案是为这个缓存引入LRU淘汰机制或者设置一个合理的TTL。”

4. 根因归纳与解决方案设计

分析出内存占用的“罪魁祸首”后,我们需要将其归纳为常见的根因模式,并设计相应的解决方案。在面试中,清晰地分类和提出有层次的解决思路,能极大提升你的专业形象。

4.1 五大常见根因及应对策略

根据MAT分析结果和代码审查,问题通常可以归结为以下几类:

1. 缓存滥用与失效

  • 特征:支配树显示某个Map(如Guava Cache、Caffeine Cache的底层Map,或简单的HashMap)体积巨大,且其内容大多是业务对象。
  • 根因:缓存没有设置大小限制、过期时间或淘汰策略(LRU/LFU),变成了一个只进不出的“黑洞”。在Web应用中,常见的如将全量用户信息、商品列表缓存在本地内存。
  • 解决方案:
    • 紧急止血:如果缓存数据非核心,可以考虑在低峰期重启服务,或通过管理接口手动清理缓存。
    • 代码优化:为缓存设置合理的maximumSize和expireAfterAccess/expireAfterWrite策略。使用成熟的缓存框架(如Caffeine)替代手写的ConcurrentHashMap。
    • 架构升级:评估数据量和一致性要求。对于大数据集或集群环境,将缓存外部化到Redis等分布式缓存是治本之策,彻底解除对JVM堆内存的依赖。

2. 集合使用不当与内存泄漏

  • 特征:发现大型的ArrayList、HashMap或LinkedList,其内容可能是数据库查询结果、日志集合等。
  • 根因:
    • 静态集合:如上述案例,被static修饰的集合,生命周期与应用一致。
    • 生命周期错配:例如,将对象放入一个ThreadLocal的Map中,但使用后没有调用remove()。由于Web服务器使用线程池,线程会被复用,导致这个Map及其内容一直无法释放。
    • 监听器或回调未注销:向全局事件总线注册了监听器,但在对象销毁时没有注销。
  • 解决方案:
    • 审查静态集合的使用场景,确保有清理逻辑。
    • 使用ThreadLocal时,务必在try-finally块中清理。
    try {
        userContext.set(currentUser);
        // ... 执行业务逻辑
    } finally {
        userContext.remove(); // 确保清理
    }
    
    • 对于异步或监听场景,确保在对象生命周期结束时反注册。

3. 大对象与不合理的批量操作

  • 特征:GC日志中频繁出现“Humongous Allocation”提示,或堆转储中发现一些特别大的对象(如巨大的byte[]、char[],或者一个包含数十万条记录的List)。
  • 根因:
    • 一次性加载大量数据:例如,SELECT * FROM huge_table without pagination,将几十万条记录一次性加载到内存的List中。
    • 文件或网络流处理不当:将整个大文件读入内存,而不是使用流式处理。
    • 不合理的序列化/反序列化:传输或缓存了过大的对象。
  • 解决方案:
    • 分页与流式处理:所有列表查询强制分页。对于批处理任务,使用数据库游标(如MyBatis的Cursor)或JDBC的ResultSet流式读取。
    • 字段裁剪:查询时只取需要的字段,避免SELECT *。
    • 拆分大对象:对于必须传输的大数据,考虑分块处理。

4. 元空间(Metaspace)泄漏

  • 特征:Full GC触发原因是Metadata GC Threshold,MAT中查看ClassLoader数量异常多,或者有大量动态生成的类(如$$EnhancerByCGLIB$$, GroovyClassLoader加载的类)。
  • 根因:
    • 动态类生成未管理:大量使用CGLib动态代理(如Spring AOP)、Groovy脚本引擎、JSP编译等,每次调用都生成新类,且对应的ClassLoader没有被及时回收。
    • 框架使用不当:例如,在循环中频繁调用ASM或LambdaMetafactory生成类。
  • 解决方案:
    • 缓存生成的类:对反射得到的Method、Constructor等进行缓存。
    • 复用ClassLoader:对于Groovy等脚本,尽量复用同一个ClassLoader,而不是每次都创建新的。
    • 调整Metaspace参数:作为临时措施,可以适当调大-XX:MaxMetaspaceSize,但这不是根本解决办法。
    • 审视技术选型:评估是否过度使用了动态代理。

5. JVM参数配置不当

  • 特征:应用本身逻辑看似正常,但一上压力就频繁Full GC。GC日志显示新生代GC非常频繁,且对象晋升老年代的速度很快。
  • 根因:
    • 新生代太小(-Xmn):导致短期存活的对象频繁触发Young GC,并且一些“中年”对象过早晋升到老年代。
    • Survivor区比例不合理(-XX:SurvivorRatio):导致对象在年轻代没有足够的空间被充分回收。
    • G1的MaxGCPauseMillis设置过于激进:导致G1过早启动混合回收,但回收效率低下。
  • 解决方案:
    • 基于数据调优:不要盲目套用“网上最佳参数”。通过jstat -gcutil观察各区域使用率和晋升情况。
    • 通用思路:如果晋升率高,尝试增大新生代(-Xmn)。如果Survivor区经常满,调整-XX:SurvivorRatio。对于G1,-XX:MaxGCPauseMillis目标值设置要合理(如100-200ms),并关注-XX:InitiatingHeapOccupancyPercent(IHOP)阈值。

4.2 构建体系化的防御方案

解决一次FullGC问题固然重要,但构建一个能预防和快速发现问题的体系更有价值。在面试的最后,你可以谈谈这方面的思考,展现你的架构视野。

  1. 监控告警常态化:将Full GC频率、老年代使用率、GC停顿时间等关键指标纳入监控大盘,并设置合理的告警阈值(如:Full GC频率 > 2次/分钟,或单次STW > 800ms)。
  2. 代码规范与Code Review:将“禁止使用无界缓存”、“使用ThreadLocal必须配套try-finally清理”、“大数据量查询必须分页”等作为代码规范,在Code Review中重点检查。
  3. 压测与混沌工程:在新服务上线或大功能发布前,进行充分的压力测试,观察GC表现。引入混沌工程实验,模拟内存缓慢增长等场景,验证系统的弹性和自愈能力。
  4. 预案与演练:制定内存泄漏等问题的应急处理预案,包括如何快速生成堆转储、如何定位Pod、如何执行预案代码(如调用清理缓存接口)等,并定期演练。

排查FullGC的过程,是一次从现象到本质,从应急到治本的完整技术演练。它考验的不仅是JVM知识,更是系统性的问题定位能力、严谨的分析逻辑和面向生产的工程化思维。下次面试官再抛出这个问题时,希望你能从容地沿着“监控发现 -> 日志定位 -> 堆转储深挖 -> 根因解决 -> 体系防御”这条主线,清晰地展示你的技术肌肉。记住,答案的深度和条理性,往往比死记硬背几个参数更能打动人心。

制造业重点关注的17个Agent智能体落地场景方案.pptx 立即下载

相关推荐

【人工智能工程】完结JEV 决策大模型实战,让 AI 从会聊天到能决策

内容概要:本文介绍了JEV决策大模型的核心理念与工程实践,强调将其作为“快判断”层从通用大模型中剥离使用。JEV不生成文本,而是针对明确的状态和问题,输出结构化、带概率的决策结果,适用于高频、原子化的判断任务。文章详细阐述了JEV的工作机制、与通用大模型的本质区别、典型应用场景(如Agent工具路由)、questions的设计方法、能力边界以及兜底机制的重要性,并指出其在成本、延迟和输出确定性方面的优势。; 适合人群:具备一定AI工程实践经验的研发人员、系统架构师,尤其是正在构建Agent、自动化决策系统或优化大模型调用链的技术团队;; 使用场景及目标:①优化高频、轻量级判断任务(如工单分类、内容初筛、RAG相关性判定)的效率与成本;②实现主模型与决策模块的职责分离,提升系统整体稳定性与可维护性;③学习如何设计高质量的判断问题与概率校准机制; 阅读建议:此资源聚焦于决策模型的工程化落地,建议结合实际业务中的判断流程进行POC验证,重点关注questions设计、阈值校准与兜底策略的构建,避免盲目神化JEV的能力。

Chrome 性能优化实战指南:2026 前端页面提速与内存优化全攻略

2026年Chrome已切换为双周更新节奏,页面性能优化规则也随之迭代。本文详解Chrome性能面板高级用法、内存泄漏排查、渲染路径优化与最新API落地技巧,帮助你把页面首屏速度提升50%以上。

Frag0ut的博客 346

搭建PX4开发系统(Ubuntu 22.04)

本文是《从零开始学 PX4 无人机开发》系列第二篇,适合开发者在 Ubuntu 系统下快速搭建 PX4 编译与仿真环境,支持 QGroundControl、Gazebo、MAVSDK 等完整工具链。

qq_15856721的博客 4219

AI 应用开发工程师技术实践:大模型接入、通用组件封装与性能优化

本文提出AI应用从PoC到生产的核心挑战:模型调用的持续可用、可控与可优化。通过构建统一LLM网关实现多供应商路由与故障转移,封装对话、工具调用与RAG组件以解耦业务逻辑,结合前缀缓存、批处理与流式背压治理等性能优化手段,形成“接通→接稳→接快”的工程路径,最终以工程化能力决定AI应用的生产可用性。

2301_79189962的博客 614

STM32CubeMX实战:TIM定时器中断配置避坑指南(附100ms精准定时代码)

本文深入解析STM32CubeMX配置TIM定时器中断的常见误区与避坑技巧,重点阐述时钟源、预分频器与自动重装载值的精准计算方法。通过实战案例,提供一份可直接复用的100ms精准定时中断代码模板,并分享调试验证方法,帮助开发者构建稳定可靠的嵌入式系统心跳。

grafana8visual的博客 500

STM32H723ZGT6-单ADC极限采样率实战与分辨率权衡

本文通过实战测试,深入探讨了STM32H723ZGT6微控制器中单ADC模块的极限性能。文章详细展示了如何通过CubeMX配置时钟树、ADC参数、定时器触发与DMA,实测得出在16位分辨率下最高稳定采样率约为4.6MHz,而将分辨率降至8位后,采样率可提升至约6.2MHz,并分析了速度与分辨率之间的关键权衡,为高速数据采集项目提供选型与优化参考。

weixin_29240711的博客 297

UGUI 与 NGUI 使用及性能优化

本文解析 Lua 与 ToLua 在 Unity 中的运行机制及热更新原理。Lua 作为可嵌入语言,通过编译字节码由虚拟机执行,支持运行时加载新脚本;ToLua 实现 C# 与 Lua 的双向调用,通过生成 Wrap 代码注册类型接口;热更新依赖于宿主动态加载并执行新脚本,结合资源管理、版本控制与状态处理机制。关键点包括:table 共享引用、函数值不随重定义更新、闭包捕获状态、元表实现类逻辑,以及对象跨语言传递的生命周期管理。完整热更新需独立设计补丁分发与回滚策略。

2503_90324697的博客 313

SAP 销售订单及发票 利润中心替代 Userexit出口 配置及程序

在跨公司销售业务中,跨公司销售订单的发票时无法从销售订单中将利润中心带到发票中,所以在跨公司的发票创建过程中需要配置出口来获取对应销售订单行项目的利润中心。 事务代码: 0KEM 配置步骤: 1、创建一个新的替代 2、创建一个步骤 3、维护一个先决条件,比如针对于特定工厂 PCASUB-VKBUR = '0001' 4、选择替代程序FORM,FORM必须为指定程序中存在的FORM名 5、编辑替代程序FORM 实现效果: 在程序FORM中打上断点 ...

李威威wiwi的博客 5069

低代码平台性能优化实战:从用户认证模块出发的基准测试与优化

整个系统由以下几个核心部分组成:- 前端:基于 React 构建的登录页面 - 后端:Node.js + Express 接口服务 - 数据库:MySQL 用户信息存储前端部分通过 fetch 请求后端/api/login接口,并在接口中处理身份验证、数据库查询与返回结果。// 示例:Node.js 后端 /api/login 接口逻辑(伪代码)return res.status(500).send({ error: '数据库查询失败' });} else {});});

后台模板 196

基于Python的彭博社新闻高效爬取实战:最新技术与完整代码解析

本文将详细介绍如何使用Python最新技术构建一个高效的彭博社(Bloomberg)新闻爬虫系统。我们将从爬虫基础概念讲起,逐步深入到高级反反爬技术、异步抓取、数据解析与存储等核心环节。文章包含完整的代码实现,采用最新的aiohttp、Playwright等技术栈,并特别关注法律合规性和数据质量保障。通过本文,读者将掌握一个完整的商业新闻爬虫开发流程,并能够根据实际需求进行定制化开发。关键词:Python爬虫、彭博社、Bloomberg、新闻采集、aiohttp、Playwright、反反爬技术。

2201_76125261的博客 1503

YOLO26涨点改进 | 全网独家首发 主干改进篇 | TGRS 2025 | RepViT-TD,告别庞大骨干!YOLO26 + RepViT-TD轻量又强大,实现更快更准的小目标检测!

本文提出将RepViT-TD轻量级主干网络应用于YOLO26目标检测框架,以提升小目标检测性能。RepViT-TD通过优化计算资源分配,强化前两层高分辨率特征提取能力,在保持轻量化的同时(仅4.85M参数)显著提升微小目标的检测精度(AI-TODv2数据集AP50达54.6%)。文章详细介绍了三种主干改进方案(RepVit_ldy1/2/3)的代码实现,并提供了完整的YAML配置文件修改指南,使模型能高效部署于边缘设备。实验表明,该方法在计算复杂度(38.19G FLOPs)和检测精度间取得了良好平衡。

Ai缝合怪、助力小伙伴高效发论文 329

RISC-V 基础软件的工程化与性能优化实践

从软件生态现状、优化方法到在龙蜥社区、如意社区等的开源贡献,这些探索展现了基础软件连接硬件能力与业务价值的作用,也为 RISC-V 生态共建提供了实践参考。

weixin_60347558的博客 425

Android Framework 开发工程师职位深度解析与面试指南

摘要:博泰车联网科技(上海)股份有限公司招聘Android Framework开发工程师,负责车载系统的底层开发与优化。岗位要求5年以上经验,深入掌握Android Framework机制(WindowManager、PowerManager等模块),熟悉高通平台中间件架构及NDK/JNI开发,具备性能优化(启动时间、ANR处理)、OTA升级等能力。需熟练使用Android Studio、Git等工具,有车载开发经验者优先。工作内容包括Framework定制开发、问题排查及技术文档编写。

郑伟强dev的专栏 552

深入 MyBatis-Plus:避开常见陷阱与性能优化实践

本文结合日常后端开发经验,梳理 MyBatis-Plus 在现代 Spring Boot 环境中的核心用法与易踩坑点。重点讲解 Wrapper 链式调用、自动填充机制、分页插件序列化问题及批量操作的底层行为,分析动态 SQL 生成逻辑与索引失效场景,并提供可验证的代码示例与排查思路。内容聚焦工程落地,明确版本依赖差异,指出官方未强调的性能边界与替代方案。

2402_83344867的博客 430

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Day103-RAG 性能优化:检索延迟/并发/批量与缓存分层

RAG 跑通不算完,扛住流量才是真本事。本文把 RAG 的端到端延迟拆成"检索—重排—生成"三段,逐段给出优化手段:Embedding 批量异步、检索并发合并、热点 Query 多级缓存、生成端流式输出,并附一张可直接照着抄的优化清单。

雨1986的博客 262

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Caddy反向代理性能优化实战:基准测试到瓶颈定位的5大关

在数据统计报表与BI系统中,反向代理作为流量调度的关键节点,其性能直接影响到整体系统的响应效率。Caddy作为一种轻量级、高性能的Web服务器和反向代理工具,常被用于此类场景。然而,随着访问量的增长,若未进行适当的性能优化,系统可能会出现延迟高、吞吐低等问题。本文将结合真实业务场景,深入探讨如何通过基准测试、瓶颈定位以及优化手段提升Caddy在数据报表服务中的性能表现,并提供可复用的实践经验。

wuchangjian的专栏 196

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Chrome性能优化实战:让老旧浏览器重获流畅体验

Chrome越用越卡、打开十几个标签页就占满内存、滚动页面掉帧?不用换电脑也不用重装系统,通过调整原生设置和清理冗余资源,就能让老旧设备上的Chrome重新变得流畅。本文从内存管理、后台限制、缓存优化到实验性功能开启,一步步帮你榨干浏览器性能潜力。

MyBili的博客 243

性能优化实战:常见性能问题定位与解决方案整理

性能优化那点事

sun_daming的博客 317

Chrome浏览器视频播放性能优化配置完整指南

本文从网络排查、硬件加速验证、核心参数配置、缓存清理、扩展管理等维度,手把手带你解决Chrome浏览器视频卡顿、跳帧、CPU占用过高的问题,快速实现4K视频流畅硬解码。

the3clipse的博客 408

单并发提速73%,多并发能力达原来2.4倍:Qwen3.8-27B性能优化实践

推理优化需同时考虑场景配置、引擎实现和底层计算。

SmartX 超融合 267

Spring Boot 性能优化实战:从启动加速到运行时调优

本文结合微服务扩缩容与高并发场景,梳理 Spring Boot 应用在启动速度与运行期性能上的优化路径。内容涵盖懒加载与类索引的配置细节、GraalVM AOT 编译的落地条件与边界、JVM 参数在容器环境下的正确设置、线程池与连接池的容量测算方法,以及基于 Arthas 和 JFR 的线上诊断流程。通过具体配置示例、压测对比思路和排查路径,给出可验证的调优步骤,帮助后端团队在有限资源下平衡冷启动成本与吞吐量稳定性。

2402_83344867的博客 419

HTTP/1.1 vs HTTP/2:博客平台接口性能优化

在内容创作与发布日益频繁的今天,博客平台与内容管理系统(CMS)面临着巨大的访问压力。尤其是对于独立开发者或个人博主而言,如何在有限资源条件下保障平台性能,成为了一个亟需解决的问题。本文将以某独立博客平台为案例,通过的方式,深入探讨使用 HTTP/1.1 与 HTTP/2 对接口性能的影响,并提供一套可落地的性能调优策略。

后台模板 178

【Unity知识速递】第6期 URP性能优化完全指南:从内存到GPU的三维调优

移动端 Store Actions 设为 Auto/Discard在低端移动平台上,将 Store Actions 设为 Auto 或 Discard,避免 URP 把每一遍的渲染目标都复制到内存中。Volume Update Mode 设为 Via Scripting默认情况下 URP 每帧都更新 Volume,如果你的 Volume 不常变,改成脚本手动更新,能省不少 CPU。内存带宽、CPU、GPU 三个维度各有关键配置项,用对了能在不牺牲画质的前提下,帧率提升 30% 以上。

crystal_WJT的博客 1048

2026-11-06-wenda-edge-llm-lab-性能优化-对比评测-踩坑排错

把自研 EdgeLLM Lab 的 KV Cache 源码抠出来真跑:教科书算 92 倍加速,端到端实测仅 0.98 倍。附显存账、时延账、INT8 体积三口径与 7 个 ONNX 产物图谱,数字全部来自 PyTorch 真实源码实测。

Dai_sir_man的博客 266

MySQL 批量操作的性能优化:从 insert into 到 load data 的进阶

本文通过三组实验对比循环单条INSERT、批量合并INSERT与LOADDATAINFILE三种MySQL批量插入方式,实测显示:前者耗时超150秒,后者仅需3-5秒。核心优化策略包括调大bulk_insert_buffer_size、关闭自动提交及索引/约束校验,并推荐海量数据优先使用LOADDATAINFILE配合文件导入与索引提前删除,实现百万级数据秒级写入,彻底解决批量插入慢、卡死、超时问题。

unicrom的博客 398
上一篇: 国产化替代实战:用人大金仓V8R6替代MySQL的完整迁移记录(麒麟OS环境)
下一篇: STM32G070串口ORE错误实战:3步修复HAL库接收中断卡死问题
linux6sysadmin
博客等级 码龄4年 59粉丝 1615原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值