【Android 内存优化】Koom核心内存指标分析
文章目录
- 源码
- Runtime.getRuntime()
- /proc/self/status
- /proc/meminfo
- 附
- 总结
获取内存的指标有很多,假如我们要写一个用于监控APP内存泄漏的框架的话,主要获取哪些指标呢?
这篇文章来研究下KOOM里面获取到是哪些指标。
下面正文开始:
源码
File("/proc/self/status").forEachLineQuietly { line ->if (procStatus.vssInKb != 0 && procStatus.rssInKb != 0&& procStatus.thread != 0) return@forEachLineQuietlywhen {line.startsWith("VmSize") -> {procStatus.vssInKb = VSS_REGEX.matchValue(line)}line.startsWith("VmRSS") -> {procStatus.rssInKb = RSS_REGEX.matchValue(line)}line.startsWith("Threads") -> {procStatus.thread = THREADS_REGEX.matchValue(line)}}}File("/proc/meminfo").forEachLineQuietly { line ->when {line.startsWith("MemTotal") -> {memInfo.totalInKb = MEM_TOTAL_REGEX.matchValue(line)}line.startsWith("MemFree") -> {memInfo.freeInKb = MEM_FREE_REGEX.matchValue(line)}line.startsWith("MemAvailable") -> {memInfo.availableInKb = MEM_AVA_REGEX.matchValue(line)}line.startsWith("CmaTotal") -> {memInfo.cmaTotal = MEM_CMA_REGEX.matchValue(line)}/*** IONHeap 是 Android 系统中用于内存管理的一种机制,特别是在图形缓冲区和其他需要高效物理内存分配和映射的场合。ION (I/O Non-Contiguous Memory Allocator)* 是一个跨内核与用户空间设计的内存管理器,它支持多种类型的内存分配,包括但不限于系统堆(system heap)、连续内存块(contiguous memory)以及从特定预留区域分配的内存(carveout heap)。* 在Android系统中,ION通过统一接口处理各种类型的内存分配,允许更灵活地满足不同硬件组件(如GPU、摄像头、显示子系统等)对内存的需求,同时优化内存使用效率,减少碎片,并且支持高效的DMA操作。* 上述代码片段是Kotlin程序的一部分,其中memInfo.IONHeap是用来存储从日志或者其他文本信息中解析出来的ION内存相关信息的变量。当检测到某一行字符串以"ION_heap"开头时,说明这一行可能包含* ION堆的内存使用量数据,于是调用正则表达式MEM_ION_REGEX来提取出具体的内存值并将其存储在memInfo.IONHeap中。*/line.startsWith("ION_heap") -> {memInfo.IONHeap = MEM_ION_REGEX.matchValue(line)}}}memInfo.rate = 1.0f * memInfo.availableInKb / memInfo.totalInKbMonitorLog.i(TAG, "----OOM Monitor Memory----")MonitorLog.i(TAG, "[java] max:${javaHeap.max} used ratio:${(javaHeap.rate * 100).toInt()}%")MonitorLog.i(TAG,"[proc] VmSize:${procStatus.vssInKb}kB VmRss:${procStatus.rssInKb}kB " + "Threads:${procStatus.thread}")MonitorLog.i(TAG,"[meminfo] MemTotal:${memInfo.totalInKb}kB MemFree:${memInfo.freeInKb}kB " + "MemAvailable:${memInfo.availableInKb}kB")MonitorLog.i(TAG,"avaliable ratio:${(memInfo.rate * 100).toInt()}% CmaTotal:${memInfo.cmaTotal}kB ION_heap:${memInfo.IONHeap}kB")}
这里直接copy这部分的源码出来,可以看到里面只拿到了几个指标。为什么拿到的是这些指标呢?我们通过命令行拿到对应的数据研究下。
Runtime.getRuntime()
javaHeap.max = Runtime.getRuntime().maxMemory()javaHeap.total = Runtime.getRuntime().totalMemory()javaHeap.free = Runtime.getRuntime().freeMemory()
通过运行时获取到Java虚拟机堆的信息。
/proc/self/status
首先拿到进程对应的pid。
PS C:\Users\LinShujie> adb shell ps | grep koom
PS C:\Users\LinShujie> adb shell ps | grep koom
u0_a50 2888 1362 3219764 95460 0 0 S com.kwai.koom.demo
手动触发memory leak前:
PS C:\Users\LinShujie> adb shell cat /proc/2888/status
Name: .kwai.koom.demo
State: S (sleeping)
Tgid: 2888
Ngid: 0
Pid: 2888
PPid: 1362
TracerPid: 0
Uid: 10050 10050 10050 10050
Gid: 10050 10050 10050 10050
FDSize: 64
Groups: 9997 20050 50050
NStgid: 2888
NSpid: 2888
NSpgid: 1362
NSsid: 0
VmPeak: 3580660 kB
VmSize: 3219892 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 95460 kB
VmRSS: 95460 kB
VmData: 2311600 kB
VmStk: 8192 kB
VmExe: 20 kB
VmLib: 117940 kB
VmPTE: 632 kB
VmPMD: 24 kB
VmSwap: 0 kB
HugetlbPages: 0 kB
Threads: 13
SigQ: 0/3957
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000001204
SigIgn: 0000000000000001
SigCgt: 00000006400084f8
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000000000000000
CapAmb: 0000000000000000
Seccomp: 0Speculation_Store_Bypass: vulnerable
Cpus_allowed: 3
Cpus_allowed_list: 0-1
voluntary_ctxt_switches: 197
nonvoluntary_ctxt_switches: 100
手动触发memory leak后:
PS C:\Users\LinShujie> adb shell cat /proc/2888/status
Name: .kwai.koom.demo
State: S (sleeping)
Tgid: 2888
Ngid: 0
Pid: 2888
PPid: 1362
TracerPid: 0
Uid: 10050 10050 10050 10050
Gid: 10050 10050 10050 10050
FDSize: 64
Groups: 9997 20050 50050
NStgid: 2888
NSpid: 2888
NSpgid: 1362
NSsid: 0
VmPeak: 4015804 kB
VmSize: 4014224 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 114012 kB
VmRSS: 114004 kB
VmData: 3093864 kB
VmStk: 8192 kB
VmExe: 20 kB
VmLib: 119268 kB
VmPTE: 2212 kB
VmPMD: 28 kB
VmSwap: 0 kB
HugetlbPages: 0 kB
Threads: 715
SigQ: 0/3957
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000001204
SigIgn: 0000000000000001
SigCgt: 00000006400084f8
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000000000000000
CapAmb: 0000000000000000
Seccomp: 0Speculation_Store_Bypass: vulnerable
Cpus_allowed: 3
Cpus_allowed_list: 0-1
voluntary_ctxt_switches: 1964
nonvoluntary_ctxt_switches: 229
代码里面拿到的是VmSize、VmRSS、和线程数。
这里的VmSize和VmRss和Vss 、Rss是否为同一个指标?
我们procrank命令来看下结果:
1|star2qltechn:/ $ su
:/ # procrankPID Vss Rss Pss Uss cmdline1529 3848968K 194612K 87827K 77496K system_server1673 3296392K 167556K 63256K 52388K com.android.systemui2888 3247024K 115544K 39744K 32996K com.kwai.koom.demo2176 3250116K 139600K 39249K 29464K com.android.launcher31859 3245816K 114868K 27183K 20520K com.android.settings1696 1386324K 46092K 23500K 12600K webview_zygote1843 3226548K 104512K 19487K 13796K com.android.phone2251 3612560K 107956K 19465K 10796K com.android.flysilkworm1659 3230128K 93368K 15295K 10788K com.android.bluetooth1363 1380040K 51524K 13215K 1048K zygote2298 3594528K 89688K 12022K 4932K com.android.flysilkworm:LdPushService2309 3183496K 84676K 11479K 7676K android.process.acore2466 3186916K 80976K 10735K 7396K com.android.messaging2164 3187012K 84496K 10149K 5936K android.process.media2349 3590068K 83284K 9305K 3456K com.android.flysilkworm:filedownloader1362 3497064K 94596K 8836K 2008K zygote642122 3201828K 78048K 8263K 4664K com.android.coreservice2403 3182732K 77792K 7110K 3452K com.android.inputmethod.pinyin2491 3182640K 68984K 7041K 4496K com.android.packageinstaller2550 3182916K 70348K 6993K 4352K com.android.traceur2516 3180036K 74636K 6848K 3764K com.android.providers.calendar2422 3179424K 68632K 6399K 3832K com.android.managedprovisioning2140 3180556K 69872K 6121K 3412K com.android.printspooler1907 3180500K 71608K 5962K 2968K android.ext.services1391 88240K 13488K 5378K 4684K /system/bin/surfaceflinger2108 3181736K 67684K 5261K 2648K com.android.se2848 3179104K 66600K 5177K 2600K com.android.keychain2198 3178328K 66728K 5140K 2456K com.android.smspush1389 58304K 10272K 5116K 4300K /system/bin/audioserver1406 66712K 10912K 5024K 3976K /system/bin/mediaserver1404 2169688K 15624K 4993K 3888K media.extractor1410 44792K 7780K 3718K 3252K media.codec1398 41808K 8316K 3220K 2440K /system/bin/cameraserver1405 2138768K 11496K 2899K 2164K media.metrics1306 19344K 5356K 2616K 2572K /system/bin/logd1399 28636K 6772K 2157K 1532K /system/bin/drmserver1361 32884K 7900K 2152K 1892K /system/bin/netd1379 66128K 7728K 2039K 1724K /vendor/bin/hw/android.hardware.graphics.composer@2.1-service1377 36548K 6532K 1919K 1768K /vendor/bin/hw/android.hardware.gnss@1.0-service1311 22268K 6924K 1889K 1752K /system/bin/vold2590 33372K 1964K 1867K 1860K /system/bin/adbd1 19188K 2996K 1845K 1468K /init1401 20044K 6152K 1842K 1732K /system/bin/installd1368 41692K 4932K 1839K 1452K /vendor/bin/hw/android.hardware.audio@2.0-service1411 19168K 5320K 1758K 1696K /vendor/bin/hw/rild1371 38212K 5232K 1698K 1272K /vendor/bin/hw/android.hardware.camera.provider@2.4-service1408 20764K 6244K 1646K 1464K /system/bin/storaged1387 17820K 5208K 1634K 1572K /vendor/bin/hw/android.hardware.wifi@1.0-service1407 20448K 6136K 1495K 1380K /system/bin/statsd1409 19872K 6084K 1469K 1360K /system/bin/wificond1367 23308K 7096K 1400K 1176K /system/bin/vr_hwc1402 21536K 6648K 1389K 1244K /system/bin/keystore1308 16620K 5884K 1381K 1192K /system/bin/hwservicemanager1403 18776K 4428K 1196K 832K /system/bin/mediadrmserver1378 35308K 5720K 1164K 1020K /vendor/bin/hw/android.hardware.graphics.allocator@2.0-service1400 18120K 5608K 1144K 1048K /system/bin/incidentd1412 17428K 6208K 1136K 1004K /system/bin/gatekeeperd1375 17124K 6108K 1115K 952K /vendor/bin/hw/android.hardware.drm@1.1-service.clearkey3778 13040K 3488K 1077K 1044K procrank1374 18524K 4060K 1066K 780K /vendor/bin/hw/android.hardware.drm@1.0-service1369 16828K 4728K 1061K 844K /vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti1011 7192K 2032K 1056K 732K /sbin/ueventd1490 9552K 3384K 1048K 1016K /system/bin/ip6tables-restore1376 15100K 5616K 981K 876K /vendor/bin/hw/android.hardware.gatekeeper@1.0-service1384 33900K 4972K 944K 844K /vendor/bin/hw/android.hardware.sensors@1.0-service1489 9536K 3124K 929K 900K /system/bin/iptables-restore1413 17792K 4492K 919K 848K /system/bin/perfprofd1392 14920K 5272K 908K 824K /system/bin/thermalserviced1372 11840K 3728K 903K 628K /vendor/bin/hw/android.hardware.cas@1.0-service1310 13932K 4760K 861K 780K /vendor/bin/hw/android.hardware.keymaster@3.0-service1373 15192K 4516K 844K 764K /vendor/bin/hw/android.hardware.configstore@1.1-service1009 7064K 1804K 842K 528K /init1380 11988K 4388K 834K 696K /vendor/bin/hw/android.hardware.health@2.0-service.default1307 11096K 3760K 826K 764K /system/bin/servicemanager1388 31500K 4084K 825K 768K /system/bin/ldinit2830 9228K 3188K 799K 764K /data/local/tmp/.studio/process-tracker2834 9228K 3256K 798K 764K /data/local/tmp/.studio/process-tracker1423 5760K 816K 776K 776K /system/bin/mdnsd1366 11996K 4244K 759K 700K /system/bin/healthd1309 11096K 3784K 743K 672K /vendor/bin/vndservicemanager1370 12416K 4228K 724K 668K /vendor/bin/hw/android.hardware.broadcastradio@1.1-service1010 6936K 1632K 722K 432K /init1396 11336K 3400K 712K 592K /system/bin/traced_probes1385 12876K 4088K 700K 644K /vendor/bin/hw/android.hardware.usb@1.0-service1383 11844K 4160K 694K 632K /vendor/bin/hw/android.hardware.power@1.1-service.default1381 11764K 4196K 692K 636K /vendor/bin/hw/android.hardware.light@2.0-service1365 11724K 4304K 687K 616K /system/bin/hw/android.hidl.allocator@1.0-service1386 11752K 4024K 680K 624K /vendor/bin/hw/android.hardware.vibrator@1.0-service.default1382 11728K 4200K 666K 608K /vendor/bin/hw/android.hardware.oemlock@1.0-service.default2824 9388K 3452K 659K 612K logcat1395 11336K 3316K 656K 536K /system/bin/traced3764 9024K 3212K 647K 516K sh3739 9024K 3068K 644K 516K /system/bin/sh1393 9024K 3236K 643K 512K /system/bin/sh1390 9624K 3012K 518K 484K /system/bin/lmkd1414 9388K 2864K 472K 440K /system/bin/tombstoned3746 8028K 772K 288K 132K su3758 5916K 708K 212K 60K /system/xbin/su3745 5916K 696K 208K 64K su3750 5916K 704K 208K 56K /system/xbin/su1426 5916K 612K 177K 68K /system/xbin/su------ ------ ------582656K 418368K TOTALRAM: 1015336K total, 257140K free, 3196K buffers, 323996K cached, 828K shmem, 54780K slab
数据有点多,我们做个筛选:
:/ # procrank | grep koom2888 3247024K 115544K 39743K 32996K com.kwai.koom.demo
这里
vss=3247024K
rss=115544K
而上面
VmSize: 4014224 kB
VmRSS: 114004 kB
数据总体差不多,但是细节有点差异,推测是同一概念,因为虚拟内存作为一种内存管理技术会在进程运行不同阶段发生动态变化。
/proc/meminfo
我这边运行是在虚拟机上面跑到Android系统,给机器分配了1G的内存。
运行命令:
127|:/ # cat /proc/meminfo
MemTotal: 1015336 kB
MemFree: 277452 kB
MemAvailable: 573328 kB
Buffers: 3392 kB
Cached: 322680 kB
SwapCached: 0 kB
Active: 511760 kB
Inactive: 130752 kB
Active(anon): 319152 kB
Inactive(anon): 384 kB
Active(file): 192608 kB
Inactive(file): 130368 kB
Unevictable: 2824 kB
Mlocked: 2824 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 319368 kB
Mapped: 242092 kB
Shmem: 828 kB
Slab: 53360 kB
SReclaimable: 17724 kB
SUnreclaim: 35636 kB
KernelStack: 12144 kB
PageTables: 19208 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 507668 kB
Committed_AS: 20653316 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 34752 kB
DirectMap2M: 1013760 kB
源码获取的指标有:
- MemTotal
- MemFree
- MemAvailable
- CmaTotal
- ION_heap
这里主要是拿到当前机器的物理内存。
这里解释下CmaTotal的概念:
在 Linux 内核中,CMA(Contiguous Memory Allocator,连续内存分配器)是一种内存管理机制,旨在为一些对连续内存有特定需求的设备提供分配连续内存的能力。
而ION_heap:
ION(Input-Output Memory Management)是Android系统中的一种内存管理框架,用于管理设备内存的分配和映射。
ION_heap是ION框架中用于分配内存的堆(heap)。它允许Android系统和设备驱动程序在需要时动态地分配和管理内存,以满足不同应用程序和系统组件的需求。
附
In general, memory footprint has the following rules: VSS >= RSS >= PSS >= USS
Overview
The aim of this post was to provide information that would assist in interpreting memory reports from various tools so the T Rue memory usage for Linux processes and the system can is determined.
Android have a tool called Procrank (/system/xbin/procrank), which lists out the memory usage of Linux processes in order F Rom highest to lowest usage. The sizes reported per process is VSS, RSS, PSS, and USS.
For the sake of simplicity in this description, memory would be a expressed in terms of pages, rather than bytes. Linux systems like ours manage memory in 4096 bytes pages at the lowest level.
VSS (reported as VSZ from PS) are the total accessible address space of a process. This is the size also includes memory that May is resident in RAM like Mallocs that has been allocated but not written to. VSS is of very little use for determing real memory usage of a process.
RSS is the total memory actually held in RAM for a process. RSS can be misleading, because it reports the total all of the the the A-Libraries that process uses, even though a share D library is a loaded into memory once regardless of what many processes use it. RSS isn’t an accurate representation of the memory usage for a single process.
pss differs from RSS on that it reports the proportional size of its shared Librari ES, i.e. if three processes all use a shared libraries that have pages, that library would only contribute pages to the PSS is reported for each of the three processes. PSS is a very useful number because if the PSS for all processes in the system is summed together, which is a good repre Sentation for the total memory usage in the system. When a process was killed, the shared libraries that contributed to its PSS would be proportionally distributed to the PSS T Otals for the remaining processes still using that library. In this-a-slightly misleading, because when a process is killed, PSS does not accurately represent the memory Returned to the overall system.
USS is the total private memory for a process, i.e. that’s memory that’s completely unique to that process. USS is an extremely useful number because it indicates the true incremental cost of running a particular process. When a process was killed, the USS is actually returned to the system. USS is the best number to watch when initially suspicious of memory leaks in a process.
引用地址:Vss/rss/pss/uss of Android Memory (alibabacloud.com)
总结
----OOM Monitor Memory----
[java] max:201326592 used ratio:2%
[proc] VmSize:4010936kB VmRss:108604kB Threads:715
[meminfo] MemTotal:1015336kB MemFree:225820kB MemAvailable:515340kB
avaliable ratio:50% CmaTotal:0kB ION_heap:0kB
[meet condition] overThresholdCount:1, threadCount: 715
这就是KOOM在Java层内存监控拿到的内存指标。有了这些指标,可以比较清晰地知道当前机器和进程内存的情况。
相关文章:
【Android 内存优化】Koom核心内存指标分析
文章目录 源码Runtime.getRuntime()/proc/self/status/proc/meminfo 附总结 获取内存的指标有很多,假如我们要写一个用于监控APP内存泄漏的框架的话,主要获取哪些指标呢? 这篇文章来研究下KOOM里面获取到是哪些指标。 下面正文开始ÿ…...

Spring相关框架八股
单例bean是线程安全的吗? AOP 事务失效 Bean生命周期 Bean循环依赖解决 MVC执行流程 自动装配原理 Spring常见注解 SpringMVC注解 SpringBoot注解 MyBatis执行流程 MyBatis延迟加载 MyBatis缓存 SpringCloud五大组件 注册中心Nacos、Eureka 负载均衡Ribbon 服务雪崩…...
RK3588开发笔记-v1.3.0-SDK文件系统分区添加
目录 目录 前言 一、分区文件 二、分区文件初始化 三、板级配置文件修改...

架构评估方法相关知识总结
一、架构评估中的重要概念 定义:软件架构评估是在对架构分析、评估的基础上,对架构策略的选取进行决策。 常用系统架构评估的方式: 1. 基于调查问卷或检查表的方法:该方法的关键是设计好问卷或检查表。缺点是在很大 程度上依赖于评…...
常用ES标准
ES2015: 1.块级作用域const、let const声明对象可修改属性,但不能重新赋值对象。 2.解构赋值 const arr [a1, a2, a3]; const [a1, ...rest] arr; // rest [a2, a3];3.模板字符串 const date "星期一"; console.log(今天是${date};);4…...

Http中Host,Referer,Origin和Access-Control-Allow-Origin
Http中Host,Referer,Origin和Access-Control-Allow-Origin 文章目录 Http中Host,Referer,Origin和Access-Control-Allow-OriginHost定义特性作用 Referer定义特性作用 Origin定义特性作用 Access-Control-Allow-Origin定义特性作用…...

UDP实现聊天室
现象: 源码: 服务器: #include<myhead.h>struct sockaddr_in serveraddr,caddr; enum type_t//枚举 {Login,Chat,Quit, }; typedef struct MSG {char type;//L C Qchar name[32];//char text[128];// }msg_t;typedef struct NODE//链…...
排序算法:如冒泡排序、插入排序、选择排序、快速排序、归并排序
冒泡排序(Bubble Sort):冒泡排序是一种简单的排序算法。它通过反复交换相邻的元素,将最大的元素逐步“浮”到数组的末尾。基本思想是每次比较相邻的两个元素,如果顺序不对就进行交换,直到整个数组有序。时间…...

深度学习pytorch——GPU加速(持续更新)
使用 .to(device),以前使用 .cuda() ,但是现在基本不使用了。 代码示例: 查看电脑GPU运行情况: 使用Ctrl Shift ESC快捷键:...

StringRedisTemplate
Redis快速入门 3.2.3.StringRedisTemplate 为了节省内存空间,我们可以不使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。…...

Linux cp、mv命令显示进度条
1.advcpmv 平常使用cp 拷贝大文件时,看不到多久可以完成,虽然加上-v参数也只能看到正在拷贝文件,那就使用以下方法实现 git clone https://github.com/jarun/advcpmv.git cd advcpmv/ bash install.shmv ./advcp /usr/local/bin/ mv ./advmv …...
在Java中使用Apache POI保留Excel样式合并多个工作簿
背景 在日常工作中,我们经常需要将多个Excel文件合并成一个,同时保留原有的样式和格式。Apache POI是一个流行的Java库,用于读取和写入Microsoft Office格式的文件,包括Excel。然而,仅仅使用Apache POI的基本功能进行…...
Nomachine远程黑屏通用处理方法
Nomachine远程黑屏通用处理方法 文章目录 前言正文解决步骤 总结 前言 NoMachine是一种远程桌面软件,它允许用户通过互联网或局域网连接到远程计算机,并在本地计算机上使用远程计算机的桌面环境和应用程序。它提供了高性能的图形渲染和低延迟的响应&…...

基于51单片机数控直流电压源proteus仿真LCD显示+程序+设计报告+讲解视频
基于51单片机数控直流电压源proteus仿真LCD显示( proteus仿真程序设计报告讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0072 讲解视频 基于51单片机数控直流电压源proteus仿真程序…...

[Linux]文件缓冲区
文件fd 输出重定向除了用dup2()改变数组下标外,还可以用命令来完成 所有的命令执行,都必须有操作系统将其运行起来变成进程,然后根据>>, <<来判断是输入重定向,还是输出重定向。 缓冲区 之所以有缓冲区࿰…...

ARM:按键中断
key_inc.c #include"key_inc.h"void key1_it_config(){//使能GPIOF外设时钟RCC->MP_AHB4ENSETR | (0x1<<5);//将PF9设置为输入模式GPIOF->MODER & (~(0x3<<18));//设置由PF9管脚产生EXTI9事件EXTI->EXTICR3 & (~(0XFF<<8));EXTI…...
JavaScript高级(五)--柯西化函数
柯里化 定义 首先,我们参照维基百科给出的定义: 在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数…...

带3090显卡的Linux服务器上部署SDWebui
背景 一直在研究文生图,之前一直是用原始模型和diffuser跑SD模型,近来看到不少比较博主在用 SDWebui,于是想着在Linux服务器上部署体验一下,谁知道并没有想象的那么顺利,还是踩了不少坑。记录一下过程,也许…...

37、Linux中Xsync数据同步备份工具
37、Linux中Xsync数据同步备份工具 一、介绍二、配置集群hostname三、修改xsync文件四、赋权五、安装Rsync六、验证一七、配置免密登录1、生成rsa密钥2、copy机器自身公钥到目标机器3、.ssh/文件目录赋权 八、验证二 ⚠️ 注:本文全程在普通用户下操作,…...
网络基础:构建你的数字世界之桥
I. 引言 A. 什么是网络? 网络是由各种电子设备通过通信线路或无线电波连接起来,以便彼此之间进行数据交换和资源共享的系统。在当今数字化时代,网络已经成为我们生活和工作中不可或缺的一部分,无论是互联网、局域网还是无线通信…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...