我正在为嵌入式Linux开发SW,我正在遭受系统挂起,因为OOM Killer不时出现.在超越之前,我想解决有关Linux内核如何分配动态内存的一些令人困惑的问题,假设/ proc/sys/vm/overcommit_memory为0且/ proc/sys/vm/min_free_kbytes为712,并且没有交换.
假设嵌入式Linux目前可用的物理内存为5MB(5MB可用内存,并且没有可用的缓存或缓冲内存可用),如果我编写这段代码:
.....
#define MEGABYTE 1024*1024
.....
.....
void *ptr = NULL;
ptr = (void *) malloc(6*MEGABYTE); //Preserving 6MB
if (!prt)
exit(1);
memset(ptr, 1, MEGABYTE);
.....
Run Code Online (Sandbox Code Playgroud)
我想知道,当提交memset调用时,内核将尝试在物理内存空间中分配~6MB或~1MB(或min_free_kbytes倍数).
现在我的嵌入式设备大约有9MB,有32MB RAM.我做了检查
# echo 3 > /proc/sys/vm/drop_caches
# free
total used free shared buffers
Mem: 23732 14184 9548 0 220
Swap: 0 0 0
Total: 23732 14184 9548
Run Code Online (Sandbox Code Playgroud)
忘记最后一段C代码,我想知道当可用内存大约> 6MB时是否可能出现oom杀手.我想知道当oom出现时系统是否内存不足,所以我认为我有两个选择:
请参阅可疑进程的/ proc/pid/status中的VmRSS条目.
设置/ proc/sys/vm/overcommit_memory = 2和/ proc/sys/vm/overcommit_memory = 75并查看是否有任何进程需要更多可用的物理内存.
我正在使用 Spring Boot 开发 REST API,我想记录客户端使用 Spring Aspect 检索的资源的 URL。我的 Aspect 类有以下代码:
@Component
@Aspect
public class Logs {
@Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
public void allResources() {}
@Before("allResources()")
public void apiRequestLog(JoinPoint jp) {
LogManager.getLogger(jp.getSignature().getDeclaringTypeName()).info("------------------------- o -------------------------");
String log = jp.getSignature().getName() + " >>>";
for (Object arg : jp.getArgs()) {
log += "\n ARG: " + arg;
}
LogManager.getLogger(jp.getSignature().getDeclaringTypeName()).info(log);
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何将 RequestMapping 对象作为参数传递给建议,并获取 URL 的路径。
我打电话给以下时面对"内存故障":
extern void *memcpy (void *__restrict __dest,
__const void *__restrict __src, size_t __n)
__THROW __nonnull ((1, 2));
Run Code Online (Sandbox Code Playgroud)
这是一段代码:
fprintf(stderr, "sysconfig line 440 \n");
fprintf(stderr, "Value size: %d ; Pointer mymsg: %p ; Pointer value: %p ; mymsg->mtext: %s ; value: %s ; size: %d ; \n", strlen(value), mymsg, value, mymsg->mtext, value, size);
memcpy(mymsg->mtext, value, size);
fprintf(stderr, "sysconfig line 442 \n");
Run Code Online (Sandbox Code Playgroud)
mymsg是一个指向struct的指针:
MSG_T *mymsg;
Run Code Online (Sandbox Code Playgroud)
MSG_T:
typedef struct msgInfo {
int cmd;
int arg1;
int arg2;
char mtext[MAX_SEND_SIZE];
} MSG_T;
Run Code Online (Sandbox Code Playgroud)
MAX_SEND_SIZE = …
拥有这段代码:
int main(void)
{
char c;
int hex;
....
}
Run Code Online (Sandbox Code Playgroud)
如果c
是'a'我想hex
成为10.如果c
有'f',hex
应该是15.我知道如何完成这个任务的整数(c - '0'
虽然这不赞成)或字符串(使用sprintf
或strtol
)但我不知道如何完成这个简单的任务一般.