内存充足出现oom,从日志定位原因

在开发板上出现oom问题,正常运行时剩余20多M内存空间。系统oom阈值为1392kb,发生oom时order为0,只申请了4k的内存,还有20多m内存。能否从下面的日志中分析出为什么会出现oom


[10-18:56:37:792] sh invoked oom-killer: gfp_mask=0x0, order=0, oom_score_adj=0
[10-18:56:37:792] CPU: 0 PID: 19990 Comm: sh Tainted: P           O    4.4.176 #12
[10-18:56:37:793] Stack : 00000000 00000000 80540000 00000009 85b9a314 806391a7 805c238c 00004e16
[10-18:56:37:793]           806a34e8 00000000 00000003 806393dc 000007d3 80053ec0 00000006 024200ca
[10-18:56:37:793]           00000000 00000000 805c7c58 814a5cfc 806a674a 8007d1ec 00000000 00003031
[10-18:56:37:793]           00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[10-18:56:37:793]           00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[10-18:56:37:793]           ...
[10-18:56:37:793] Call Trace:
[10-18:56:37:793] [<8000b35c>] show_stack+0x8c/0xa8
[10-18:56:37:793] [<800b9430>] dump_header.isra.4+0x50/0x19c
[10-18:56:37:793] [<800829a8>] oom_kill_process+0x2ec/0x4f0
[10-18:56:37:793] [<80082f98>] out_of_memory+0x3b4/0x3c4
[10-18:56:37:793] [<80082fec>] pagefault_out_of_memory+0x44/0x88
[10-18:56:37:793] [<80011ac8>] __do_page_fault+0x4c8/0x52c
[10-18:56:37:793] [<80005cc0>] ret_from_exception+0x0/0x10
[10-18:56:37:793] 
[10-18:56:37:793] Mem-Info:
[10-18:56:37:793] active_anon:2980 inactive_anon:28 isolated_anon:0
[10-18:56:37:794]  active_file:3804 inactive_file:2156 isolated_file:0
[10-18:56:37:794]  unevictable:1194 dirty:0 writeback:0 unstable:0
[10-18:56:37:794]  slab_reclaimable:604 slab_unreclaimable:8490
[10-18:56:37:794]  mapped:2426 shmem:258 pagetables:98 bounce:0
[10-18:56:37:794]  free:6214 free_pcp:39 free_cma:0
[10-18:56:37:794] Normal free:24856kB min:1392kB low:1740kB high:2088kB active_anon:11920kB inactive_anon:112kB active_file:15216kB inactive_file:8624kB unevictable:4776kB isolated(anon):0kB isolated(file):0kB present:130048kB managed:121976kB mlocked:0kB dirty:0kB writeback:0kB mapped:9704kB shmem:1032kB slab_reclaimable:2416kB slab_unreclaimable:33960kB kernel_stack:976kB pagetables:392kB unstable:0kB bounce:0kB free_pcp:156kB local_pcp:156kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no
[10-18:56:37:794] lowmem_reserve[]: 0 0
[10-18:56:37:794] Normal: 652*4kB (UMEH) 467*8kB (UMEH) 181*16kB (UMEH) 192*32kB (UMEH) 84*64kB (UMEH) 14*128kB (UEH) 5*256kB (UE) 0*512kB 1*1024kB (E) 0*2048kB 0*4096kB = 24856kB
[10-18:56:37:794] 7412 total pagecache pages
[10-18:56:37:794] 32512 pages RAM
[10-18:56:37:794] 0 pages HighMem/MovableOnly
[10-18:56:37:794] 2018 pages reserved
[10-18:56:37:795] mempool: mem_used 14089248(0xd6fc20)bytes mem_thru 0(0x0)
[10-18:56:37:795] name eth_buffer pool 87062b00 size 1712  obj_size 2016
[10-18:56:37:795]         max 7200 used 1434 min 1422 free 181 thru 177
[10-18:56:37:795]         rpu 64028 resized 2987 shrinked 54 timestamp 19647762 freed 6
[10-18:56:37:795]         rmu 0 mem_used 3255840(0x31ae20)bytes
[10-18:56:37:795]         alloced 971938 returned 970323 failed 0
[10-18:56:37:795] name wifi0_rxq pool 853c8900 size 16096  obj_size 16384
[10-18:56:37:795]         max 1536 used 534 min 384 free 17 thru 48
[10-18:56:37:795]         rpu 0 resized 2577 shrinked 45 timestamp 0 freed 0
[10-18:56:37:795]         rmu 0 mem_used 9027584(0x89c000)bytes
[10-18:56:37:795]         alloced 305649 returned 305098 failed 447
[10-18:56:37:795] name wifi0_rpq pool 853c8800 size 992  obj_size 1280
[10-18:56:37:795]         max 256 used 64 min 64 free 0 thru 8
[10-18:56:37:795]         rpu 0 resized 0 shrinked 0 timestamp 0 freed 0
[10-18:56:37:796]         rmu 0 mem_used 81920(0x14000)bytes
[10-18:56:37:796]         alloced 64 returned 0 failed 0
[10-18:56:37:796] name wifi0_rxbuf pool 8690d700 size 2600  obj_size 2912
[10-18:56:37:796]         max 2048 used 512 min 512 free 80 thru 64
[10-18:56:37:796]         rpu 0 resized 1731 shrinked 349 timestamp 19647750 freed 96
[10-18:56:37:796]         rmu 0 mem_used 1723904(0x1a4e00)bytes
[10-18:56:37:796]         alloced 133264 returned 132672 failed 0
[10-18:56:37:800] Out of memory: Kill process 2221 (web) score 65 or sacrifice child
[10-18:56:37:801] Killed process 2221 (web) total-vm:17496kB, anon-rss:3204kB, file-rss:5024kB

oom并不是指内存耗尽,内存要真耗尽系统直接死机了,也不会报错的
oom是指你申请的内存空间指针溢出,你把4K改成4K-1看是不是就好了呢
比如在C语言中,不管你实际内存到底有多大,你一次申请的数组长度不能超过int的表示范围,单片机里这个值到底是多少我不确定,你需要测试

OOM(内存溢出)造成原因及解决方案
主要原因:存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。
情况1:内存泄漏:长期保持某些资源的引用,垃圾回收器无法回收它
情况2:内存溢出:保存多个耗用内存过大或当加载单个超大的对象时
情况3:其他各种原因:死循环
解题思路:
1、修改JVM启动参数,直接增加内存
2、找出可能存在内存溢出的位置并解决
3、检查代码中是否有死循环或递归调用

OOM问题快速线上定位原因和排查
借鉴下
https://blog.csdn.net/weixin_40924043/article/details/123629978

在分析 oom 时,需要考虑多种因素,包括内存使用情况、进程的内存需求、系统的 oom 阈值、进程的 oom 得分等。从你提供的日志中,我们可以看出:

当前系统的 oom 阈值为 1392KB。
触发 oom 的进程的 oom 得分为 0。
触发 oom 的进程申请了 4KB 的内存。
系统剩余的内存超过 20MB。
根据这些信息,可以初步判断,触发 oom 的进程并不是因为内存使用量过大,而是因为 oom 得分过低。

可能的原因有:

进程的 oom 得分被人为调整过低。你可以使用命令 cat /proc/PID/oom_score_adj 来查看进程的 oom 得分。
进程的内存使用量突然增加,导致 oom 得分低于系统的 oom 阈值,从而触发 oom。你可以使用命令 cat /proc/PID/status 来查看进程的内存使用量。
要解决 oom 问题,需要根据具体情况进行调整。你可以尝试以下方法:

调整进程的 oom 得分,使其高于系统的 oom 阈值。
尝试减少进程的内存使用量,例如优化代码、减少使用的第三方库、减少读写文件等。