Linux内存排查:当top显示内存不足却找不到占用进程时如何解决
1. 问题引入当TOP告诉你一个“谎言”在Linux系统运维和性能调优的日常里top命令是我们最信赖的“仪表盘”。它能实时告诉我们CPU在忙什么内存被谁吃了。但有时候这个仪表盘会显示一个令人困惑的读数系统的内存使用率%MEM或RES居高不下可用内存free所剩无几甚至开始使用大量交换分区swap然而当你逐行查看进程列表时却发现没有一个进程的占用高到能解释这个总量。这种“内存去哪儿了”的灵异事件相信不少运维和开发朋友都遇到过。它不像某个Java进程OOM那样目标明确也不像MySQL吃光内存那样有迹可循。系统明明“感觉”很卡top却指不出“元凶”这种无力感最是磨人。今天我们就来彻底拆解这个问题从top命令的局限性讲起一步步深入到Linux内核的内存管理机制手把手带你找到那些“隐藏”的内存消耗者。简单来说这个问题可以归结为用户空间进程可见的内存占用top/ps显示与内核视角的系统总体内存占用之间存在巨大的“认知差”。这个差值就被内核用于各种非进程直管的目的。我们的排查就是一场缩小这个“认知差”的侦探游戏。2. 理解Linux内存管理水库与蓄水池模型在开始排查前我们必须建立一个正确的内存观。把服务器内存想象成一个多功能水库存水系统而不仅仅是进程的“私人泳池”。2.1 内存的多种“形态”在Linux中通过free -h命令我们通常会看到这样的输出total used free shared buff/cache available Mem: 62G 15G 500M 1.2G 46G 45G Swap: 4.0G 0B 4.0G这里的关键是理解每一列的真实含义特别是used,free,buff/cache,available。Total/Used/Free (传统视角)这是最粗略的划分。used包含了进程实际使用的内存RES和内核用于缓存和缓冲的内存。所以used高不一定代表出问题。Buff/Cache (性能加速器)这是内核为了提升磁盘I/O性能而占用的内存包括缓冲区Buffers和页面缓存Page Cache。当你频繁读写文件后文件内容就会缓存在这里。这部分内存在进程需要时可以被立即回收因此它更像是“可用的空闲内存”而不是“被占用的内存”。Available (真实可用内存)这是内核估算的、在不发生交换swap的情况下可以分配给新启动的应用程序的内存总量。它包含了free内存和大部分可回收的buff/cache内存。这个指标比free更重要。核心误区纠正看到free内存很少就紧张是新手最常见的错误。Linux的设计哲学是“不用白不用”它会尽可能利用空闲内存来做缓存以提升系统性能。所以free少而buff/cache多通常是系统健康且性能优化的表现而不是内存泄漏。2.2 TOP命令的局限它看到了什么没看到什么top命令主要从/proc文件系统中获取进程级信息。它显示的进程内存占用通常我们关注两列VIRT (Virtual Memory Size): 虚拟内存大小是进程“声称”需要的总地址空间包括代码、数据、共享库、交换出去的部分等。这个数字通常很大参考意义有限。RES (Resident Memory Size): 常驻内存大小这是进程当前实际占用物理内存的部分也是top默认排序和%MEM计算的基础。top汇总所有进程的RES理论上应该接近系统总used内存但现实往往并非如此。top没告诉你的事内核内存Kernel Memory内核自己运行也需要内存比如网络栈的sk_buff文件系统的dentry和inode缓存以及内核模块、驱动程序分配的内存。这部分在top的进程列表里是看不到的。不可回收的页面缓存虽然大部分缓存可回收但如果有进程正在以“内存映射mmap”的方式读写一个大文件这部分缓存可能被锁定无法被立即回收。内存碎片物理内存被分割成小块虽然总量够但可能找不到一块连续的大内存满足某个申请导致内存无法有效利用这在top里也无法体现。透明大页Transparent Huge Pages, THP的副作用THP是内核为了减少TLB未命中而做的优化但它的合并和拆分操作有时会导致内存被“困住”显示为已用但找不到归属进程。理解了这些我们就知道排查的起点不是死磕top的进程列表而是去检查那些top不直接展示的“暗区”。3. 系统性排查工具箱与核心思路当遇到内存高企却找不到进程时一个系统性的排查思路至关重要。盲目重启虽然能暂时解决问题但无法根除隐患。下面是一套从宏观到微观的排查路径。3.1 第一步使用更全面的全局视图命令在top之外我们首先需要几个全局视角的命令来定位方向。1. 查看内存概况free与cat /proc/meminfofree -h给了我们第一印象。但更详细的信息藏在/proc/meminfo中。执行cat /proc/meminfo关注以下几行MemTotal,MemFree,MemAvailable: 基础信息。Buffers,Cached: 对应free中的buff/cache。Slab:这是重中之重Slab是内核对象如dentry,inode,sk_buff的缓存。它的无节制增长是导致“内存失踪”的常见元凶。SReclaimable表示可回收的SlabSUnreclaim表示不可回收的。PageTables: 进程页表占用的内存。如果系统运行了大量进程或使用了大量内存映射这里会很高。Shmem: 共享内存包括tmpfs。Committed_AS: 系统已承诺可能已分配或即将分配的虚拟内存总量。如果它远大于物理内存说明系统可能已超配。2. 查看内核内存分配slabtop如果/proc/meminfo显示Slab很大立即使用slabtop命令类似top按c按占用排序。它会实时显示哪些内核对象dentry,inode_cache,buffer_head,skbuff_head_cache等占用了最多的Slab内存。一个满是dentry的列表通常意味着文件系统操作频繁缓存了海量的目录项。3. 查看系统缓存详情vmstat与sarvmstat -s以单行形式输出丰富的内存统计信息便于脚本抓取。sar -r 1 3使用sysstat工具包可以查看历史内存使用趋势判断内存是缓慢增长还是突然飙升。3.2 第二步定位可能的“大户”与特殊场景有了全局视图我们就可以针对性地深挖。1. 检查共享内存Shmem与tmpfs共享内存如Oracle SGA, PostgreSQL shared_buffers和tmpfs文件系统如/dev/shm,docker容器的某些存储占用的内存在top中可能被分摊到多个进程或显示不全。df -h查看所有挂载点特别关注tmpfs类型的文件系统使用情况。ipcs -m查看系统V共享内存段信息。对于/dev/shm可以直接ls -lah /dev/shm查看里面有什么大文件。2. 检查内存映射mmap与大页内存pmap命令对可疑的高VIRT进程使用pmap -x PID可以查看该进程地址空间的详细映射寻找巨大的匿名映射anon或文件映射。透明大页THP检查THP状态cat /sys/kernel/mm/transparent_hugepage/enabled。如果为always在某些极端负载下可能导致问题。可以尝试设置为madviseecho madvise /sys/kernel/mm/transparent_hugepage/enabled临时生效。3. 检查内核模块与驱动有缺陷或特殊的内核模块、驱动程序可能会泄漏内存。使用lsmod查看已加载模块但更有效的是结合/proc/meminfo和slabtop的线索。如果Slab异常高且与某个驱动对象相关如网络驱动相关的skbuff可以尝试更新或排查该驱动。4. 检查容器环境Docker/K8s在容器化环境中问题可能更隐蔽。容器引擎层面docker stats或crictl stats可以查看容器的内存使用但要注意其显示的是容器内进程的RES总和可能不包含容器运行时如containerd或内核为容器分配的一些内部资源。宿主机视角在宿主机上容器的内存可能体现在cgroup的内存统计中。查看/sys/fs/cgroup/memory/memory.stat路径可能因系统而异关注total_cache,total_rss, 以及total_kmem内核内存。kubectl top pod/node命令也是常用工具。4. 实战排查流程与命令详解让我们模拟一次完整的排查过程假设一台服务器free显示内存用了90%但top看进程总和只有50%。4.1 场景复现与初步诊断确认现象$ free -h total used free shared buff/cache available Mem: 62G 56G 1.2G 2.3G 4.8G 3.5G Swap: 4G 2.5G 1.5G内存紧张已用交换分区。使用top排序 在top界面按ShiftM按%MEM降序排列。发现前几名进程的RES加起来远小于56G。记下这个差值比如相差约30G。查看详细内存信息$ cat /proc/meminfo | grep -E “^(MemTotal|MemFree|MemAvailable|Buffers|Cached|Slab|SReclaimable|SUnreclaim|PageTables|Shmem)” MemTotal: 65083304 kB MemFree: 1320456 kB MemAvailable: 3676540 kB Buffers: 214500 kB Cached: 4208316 kB Slab: 28450700 kB # 异常高 SReclaimable: 16892000 kB SUnreclaim: 11558700 kB # 不可回收的部分也很高 PageTables: 1234567 kB Shmem: 2500000 kB关键发现Slab占用高达28GB其中不可回收的SUnreclaim有11GB。这很可能就是“失踪”内存的主要去向。4.2 深入Slab使用slabtop和/proc/slabinfo运行slabtop按c按缓存大小排序Active / Total Objects (% used) : 23456789 / 34567890 (67.8%) Active / Total Slabs (% used) : 456789 / 567890 (80.5%) Active / Total Caches (% used) : 78 / 90 (86.7%) Active / Total Size (% used) : 28450.70M / 32456.12M (87.6%) Minimum / Average / Maximum Object : 0.01K / 0.09K / 8.00K OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 4567890 3456789 75% 0.19K 345678 132 34567M dentry 1234567 987654 80% 0.06K 23456 52 1234M kernfs_node_cache 987654 876543 88% 0.10K 23456 42 987M buffer_head ... (其他缓存)一目了然dentry目录项缓存占用了惊人的34GB其次是buffer_head和kernfs_node_cache。分析原因dentry缓存爆炸通常是因为文件系统进行了极其频繁的文件名查找、目录遍历操作。常见诱因包括备份软件在遍历海量小文件。应用程序存在有问题的递归目录扫描逻辑。监控agent如某些版本的filebeat, auditd配置不当在持续监控大量文件变动。Docker容器频繁启动停止产生大量镜像层和容器层相关的dentry。定位相关进程虽然dentry是内核对象但我们可以通过/proc文件系统寻找线索。一个间接的方法是查找打开文件句柄多的进程# 查看打开文件数最多的前10个进程 $ lsof | awk ‘{print $2}’ | sort | uniq -c | sort -rn | head -10或者如果怀疑是某个路径下的文件操作可以用fatrace或inotifywait工具监控文件系统事件但这在生产环境要谨慎使用。4.3 解决方案与临时缓解找到根源后解决方案因情况而异优化应用程序行为如果是自家应用修复递归扫描逻辑避免不必要的stat调用。调整备份策略与备份团队协调调整扫描策略或时间。调整内核参数谨慎操作对于dentry缓存内核有参数控制其回收积极性。vfs_cache_pressure控制内核回收dentry和inode缓存的倾向。默认值100。值越大回收越积极。可以临时设置为一个更大的值如500来观察sysctl -w vm.vfs_cache_pressure500。drop_caches这是最后的手段非调试勿用它可以手动清理缓存但会立即导致依赖这些缓存的性能下降。# 释放PageCache: echo 1 /proc/sys/vm/drop_caches # 释放dentries和inodes: echo 2 /proc/sys/vm/drop_caches # 释放PageCache, dentries和inodes: echo 3 /proc/sys/vm/drop_caches重要警告在生产环境执行echo 3前必须确认系统负载允许短暂的I/O性能下降。这不能解决根本问题只是临时腾出内存。对于不可回收的SlabSUnreclaim如果SUnreclaim很高可能是内核模块有bug或内核数据结构被永久占用。尝试更新内核到稳定版本或排查最近加载的内核模块、驱动。在极端情况下可能需要重启来释放。4.4 其他场景的排查示例场景APageTables过大如果/proc/meminfo中PageTables占用数GB内存说明系统可能存在大量进程或线程每个都有独立的页表或者有进程进行了超大规模的内存映射如某些科学计算或大数据应用。排查使用ps -eLf | wc -l查看总线程数。使用pmap对内存最大的几个进程进行检查。解决优化应用减少不必要的线程或内存映射区域。对于长期运行的服务考虑使用Huge Pages来减少页表项数量。场景Btmpfs占用过高df -h发现/dev/shm或/run等tmpfs分区快满了。排查进入该目录使用du -sh *查找大文件。可能是某个程序在这里创建了临时文件或共享内存文件。解决清理无用文件或调整程序配置将临时文件指向磁盘。也可以考虑在/etc/fstab中调整tmpfs分区的大小但治标不治本。5. 高级工具与长期监控策略对于复杂或间歇性问题我们需要更强大的武器和预防措施。5.1 使用专业内存分析工具smem工具它能以更直观的方式展示内存占用特别是能区分USS进程独占内存、PSS按比例分摊共享库后的内存和RSS对于分析共享库内存占用更有帮助。valgrind与massif这是开发阶段的利器。用于检测C/C程序的内存泄漏。massif是valgrind的一个工具可以生成内存使用的堆剖面图精确显示内存是如何被分配和累积的。perf与SystemTap/eBPF这些是内核级的性能剖析神器。perf mem record可以记录内存访问事件。eBPF工具如drgn,bpftrace可以编写脚本动态追踪内核内存分配函数如kmalloc,kmem_cache_alloc定位是哪个内核代码路径在持续分配内存。但这需要较高的内核知识。5.2 建立监控与告警体系被动排查不如主动预防。应在监控系统中配置以下关键指标内存利用率监控MemAvailable而非MemFree。设置阈值告警如Available 总内存的10%。Slab内存监控/proc/meminfo中的Slab和SUnreclaim。如果SUnreclaim持续增长且不释放就需要告警。PageTables大小监控其增长趋势。交换分区使用率即使内存没完全用完交换分区开始被使用也是一个重要的性能劣化信号。进程级PSS使用监控代理如Prometheus的node_exporter配合smem导出器收集进程的PSS数据能更准确地评估进程真实内存影响。5.3 配置内核参数优化经验之谈根据业务负载类型可以预先调整一些内核参数防患于未然。以下是一些常见配置修改前务必在测试环境验证# 编辑 /etc/sysctl.conf # 提高内存溢出OOM杀手在触发前评估进程的积极性避免误杀重要进程需要根据业务调整权重 vm.oom_kill_allocating_task 0 # 提高vfs缓存回收压力适用于文件操作频繁的系统 vm.vfs_cache_pressure 150 # 减少交换倾向对于内存充足、追求性能的服务器可以降低到10以下 vm.swappiness 10 # 控制脏页待写回磁盘的数据比例避免I/O尖峰 vm.dirty_ratio 20 vm.dirty_background_ratio 10 # 使配置生效 sysctl -p6. 总结与心法从现象到本质的思考排查“内存高却无进程”的问题本质上是一场对Linux内存管理子系统的深度理解之旅。它考验的不是记住几个命令而是建立起一套从用户空间到内核空间的立体分析框架。我的经验是遇到这类问题心态要稳步骤要系统信数据不盲信感觉首先用free和/proc/meminfo确认宏观数据用available指标代替free做判断。从内核找答案当进程解释不通时立即转向内核内存区。Slab,PageTables,Shmem是三大嫌疑犯而slabtop是打开Slab黑盒的钥匙。关联上下文内存问题很少孤立发生。结合系统日志dmesg、应用日志、以及当时的业务操作是否在跑备份、编译、批量处理一起分析。临时清理要谨慎drop_caches是“重启大法”在内核缓存层面的等价物它能快速缓解症状但会牺牲性能并掩盖根因只应在紧急恢复或明确诊断后使用。根治靠设计和监控长期来看优化应用程序的内存使用模式、选择合适的内核版本与参数、建立涵盖内核内存指标的监控体系才是杜绝此类问题的根本。最后记住Linux的内存使用是“狡猾”的但并非无迹可寻。它把内存当作一种多功能资源在进程、缓存和内核之间动态调度。我们的目标不是让free命令显示很多空闲内存而是确保MemAvailable始终充足系统运行流畅同时理解每一字节内存的用途。当你能够从容地解释slabtop里那一串串缓存名字的含义时你就已经掌握了Linux内存管理的精髓。

相关新闻

Photoshop 2020新手入门:从安装到核心工具与图层蒙版详解

Photoshop 2020新手入门:从安装到核心工具与图层蒙版详解

1. 项目概述:从零开始的PS学习与安装指南 如果你刚接触设计,或者想给自己的照片、社交媒体内容加点料,Photoshop(简称PS)这个名字你一定不陌生。它几乎是图像处理领域的代名词,功能强大到让人又爱又怕。爱的…

2026/8/16 20:08:16 阅读更多 →
Anaconda安装后Path环境变量配置全解析与排错指南

Anaconda安装后Path环境变量配置全解析与排错指南

1. 为什么你的Anaconda总是“装上了又好像没装上”?如果你在搜索引擎里敲下“Anaconda安装”这几个字,大概率是因为你刚经历了一场小小的挫败:明明看着教程一步步点完了安装程序,可一打开命令行,输入conda或者python&a…

2026/8/16 20:08:16 阅读更多 →
逻辑回归中最大似然到底是怎么转换为交叉熵损失的(带你彻底搞懂逻辑回归的损失函数)

逻辑回归中最大似然到底是怎么转换为交叉熵损失的(带你彻底搞懂逻辑回归的损失函数)

逻辑回归中最大似然估计的理解从 lny1−ywxbln\frac{y}{1-y}wxb ln1−yy​wxb到最大化似然函数(其实就是最小化损失)的过程理解和简单推导. 很多课件在这里跳得太快,导致很多人不知道逻辑回归是怎么从最大似然估计推导到了经典的二元交叉熵损失函数的。其实中间缺了…

2026/8/16 20:08:16 阅读更多 →

最新新闻

图像修复智能体:从多任务学习到顺序感知决策的技术演进

图像修复智能体:从多任务学习到顺序感知决策的技术演进

1. 从“修图”到“智能体”:图像修复的范式革命最近在图像处理圈子里,一个叫 DiTTo 的项目讨论度挺高。光看标题 “Scalable Order-aware All-in-One Image Restoration Agent”, 信息量就很大。它不像我们熟悉的那些“一键去噪”、“超分辨率…

2026/8/18 1:03:31 阅读更多 →
汽车零部件质量困局:从电子电气到动力总成的故障分析与应对策略

汽车零部件质量困局:从电子电气到动力总成的故障分析与应对策略

1. 从“修不好”到“不敢买”:汽车投诉背后的零部件困局最近和几个做汽车后市场的朋友聊天,话题总绕不开一个现象:现在车主来店里,抱怨的已经不只是“车坏了”,而是“这个零件怎么又坏了”、“上次换的件才用了半年”、…

2026/8/18 1:03:31 阅读更多 →
新能源汽车动力电池选购指南:从电芯、BMS到安全与场景化选择

新能源汽车动力电池选购指南:从电芯、BMS到安全与场景化选择

1. 从“里程焦虑”到“电池焦虑”:为什么选车先看电池?如果你最近在看新能源车,尤其是纯电车型,大概率会听到销售顾问反复强调一个词:续航。但“续航”这个数字背后,真正决定你用车体验、钱包厚度甚至车辆残…

2026/8/18 1:03:31 阅读更多 →
Android 时间选择器终极定制指南:一步步用 PickerView 打造顺手的日期时间控件

Android 时间选择器终极定制指南:一步步用 PickerView 打造顺手的日期时间控件

Android 时间选择器终极定制指南:一步步用 PickerView 打造顺手的日期时间控件 【免费下载链接】Android-PickerView This is a picker view for android , support linkage effect, timepicker and optionspicker.(时间选择器、省市区三级联动&#xff…

2026/8/18 1:03:31 阅读更多 →
构建行为自适应对话智能体:从静态人格到流体人格框架的工程实践

构建行为自适应对话智能体:从静态人格到流体人格框架的工程实践

1. 从“千人一面”到“千人千面”:对话智能体的个性困境与破局点 最近在折腾大语言模型应用落地的朋友,估计都绕不开一个核心问题:我们费尽心思调教出来的AI助手,怎么总感觉“味儿不对”?无论是客服机器人、虚拟陪伴助…

2026/8/18 1:03:31 阅读更多 →
Coze工作流实战:从零构建智能简历筛选助手,掌握AI应用工程化核心

Coze工作流实战:从零构建智能简历筛选助手,掌握AI应用工程化核心

如果你最近关注AI应用开发,可能会发现一个现象:很多教程都在讲“零代码搭建AI应用”,但当你真正上手时,却发现要么是功能过于简单,要么是遇到复杂逻辑就束手无策。问题出在哪里?核心在于,大多数…

2026/8/18 1:02:31 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻:设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/17 2:58:27 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/17 2:58:30 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/17 2:58:32 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →