小编MAB*_*ABC的帖子

Linux内存过度使用细节

我正在为嵌入式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并查看是否有任何进程需要更多可用的物理内存.

memory-management out-of-memory low-memory embedded-linux

4
推荐指数
1
解决办法
2万
查看次数

使用 Spring AspectJ 记录 REST 资源 URL

我正在使用 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 的路径。

java rest aspectj spring-boot

4
推荐指数
2
解决办法
3271
查看次数

memcpy调用中的内存故障

我打电话给以下时面对"内存故障":

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 = …

c linux gcc uclibc

0
推荐指数
1
解决办法
419
查看次数

将char c ='a'转换为int value = 10

拥有这段代码:

int main(void)
{
    char c;
    int hex;
    ....
}
Run Code Online (Sandbox Code Playgroud)

如果c是'a'我想hex成为10.如果c有'f',hex应该是15.我知道如何完成这个任务的整数(c - '0'虽然这不赞成)或字符串(使用sprintfstrtol)但我不知道如何完成这个简单的任务一般.

c hex

0
推荐指数
1
解决办法
591
查看次数