Articles of 内存泄漏

检查正在运行的程序中的内存泄漏

出于对检查内存泄漏的好奇心,我有个疑问。 作为一个在过去的一两年中经常使用valgrind来检查代码中的内存泄漏的人,我突然想到在程序生命周期之后 ,它只能检测到丢失/未logging的内存。 所以,有鉴于此,我在想,如果你有一个长期运行的程序, malloc()是间歇性的,在应用程序退出之前不会free() ,那么潜在的吃内存(不一定是通过泄漏 )是巨大的,使用这些工具是不可观察的,因为他们只检查程序的生命周期。 是否有类似GDB的工具可以在运行时停止应用程序,并检查在应用程序生命周期中是否被引用的内存?

在linux下运行Drupal时出现内存泄漏apache,但同样的应用程序不会在windows服务器上泄漏mem

目前我的网站使用的是drupal 6,apache的http使用的是prefork mpm。 当我testing我的Web应用程序时,内存不会释放,它只是增加了内存使用量。 但是,在Windows上,它使用mpm_winnt.c,它工作得很好,没有内存泄漏。 如果我将其更改为在我的Linux服务器上使用worker.c,它会工作吗?

alsa – mem泄漏?

我一直在追逐内存泄漏(由'valgrind –leak-check = yes'报告),它似乎来自ALSA。 这段代码已经有一段时间在自由的世界里了,所以我猜这是我做错了。 #include <stdio.h> #include <stdlib.h> #include <alsa/asoundlib.h> int main (int argc, char *argv[]) { snd_ctl_t *handle; int err = snd_ctl_open( &handle, "hw:1", 0 ); printf( "snd_ctl_open: %d\n", err ); err = snd_ctl_close(handle); printf( "snd_ctl_close: %d\n", err ); } 输出如下所示: [root@aeolus alsa]# valgrind –leak-check=yes ./test2 ==16296== Memcheck, a memory error detector ==16296== […]

Ubuntu System Monitor和valgrind在C ++应用程序中发现内存泄漏

我用C ++编写了一个应用程序,它使用了一些外部的开源库。 我试图看看Ubuntu系统监视器有关于我的过程如何使用资源的信息,我注意到驻留内存继续增加到非常大的值(超过100MiB)。 这个应用程序应该在embedded式设备上运行,所以我必须小心。 我开始认为应该有(一些)内存泄漏,所以我使用valgrind。 不幸的是,似乎valgrind没有报告显着的内存泄漏,只有我使用的库中的一些小问题,仅此而已。 那么,我是否必须得出结论:我的algorithm真的使用了那么多的内存? 对我来说这似乎很奇怪…或者,我误解了系统监视器列的含义? 在与软件分析相关的时候,有人能澄清系统监视器中“虚拟内存”,“驻留内存”,“可写内存”和“内存”的含义吗? 我应该期望这些值能够立即表示我的进程在RAM中占用了多less内存? 在过去,我使用了能够告诉我在哪里使用内存的工具,比如Apple Profiling Tools。 有什么类似的我可以在Linux中使用? 谢谢!

JVM进程如何分配内存?

在理解JVM进程如何分配自己的内存方面,我有一点空隙。 我所知道的 RSS = Heap size + MetaSpace + OffHeap size OffHeap由线程堆栈,直接缓冲区,映射文件(库和jar)和JVM代码本身组成; 目前我正试图分析我的Java应用程序(Spring Boot + Infinispan),RSS是779M (它运行在docker容器中,所以pid 1可以): [ root@daf5a5ae9bb7:/data ]$ ps -o rss,vsz,sz 1 RSS VSZ SZ 798324 6242160 1560540 根据jvisualvm ,承诺的堆大小是374M Metasapce大小是89M 换句话说,我想解释799M – (374M + 89M)= 316M的OffHeap内存。 我的应用程序(平均)有36个活线程 。 每个线程消耗1M: [ root@fac6d0dfbbb4:/data ]$ java -XX:+PrintFlagsFinal -version |grep ThreadStackSize intx CompilerThreadStackSize = 0 […]

Linux和内存泄漏

Linux会立即自动重新申请应用程序使用的所有内存吗? 如果是这样的话,应用程序真的会在退出之前释放所有内存吗? 在调用exit(0)之前调用multithreading应用程序中每个类的析构函数是否真的值得? 如果Linux总是立即重新声明应用程序使用的所有内存,那么内存泄漏只是应用程序创build的悬挂指针,也只是它的生命周期。

如果/何时取消分配的堆内存得到回收?

我一直在embedded式Linux系统上运行一夜的内存testing。 使用vmstat我已经观察到,随着时间的推移,空闲内存会稳步下降。 根据procfs中的一些分析,一个进程的堆栈大致以相同的速度增长。 我怀疑有内存泄漏,并在代码中发现了一些经常使用new和delete位置。 但是,我没有看到没有匹配delete调用的new调用。 我再次运行内存testing,今天早上通过以下调用清除了内存caching echo 3 > /proc/sys/vm/drop_caches vmstat中列出的可用内存下降到接近testing开始时的值。 内核是否定期回收未使用的堆页? 如果是这样,除了上面的那个,还有其他的时间呢? 空闲内存可能低于某个阈值时

我如何find哪个进程正在泄漏内存

我有一个系统(Ubuntu)与许多进程和一个(或多个)有内存泄漏。 有没有一种很好的方法来find泄漏的过程? 一些进程是JVM,有些则不是。 有些是本土的,有些是开源的。

有没有一种方法来定位进程的哪一部分使用大部分内存,只查看生成的核心文件?

我有一个进程(每次都由一个看门狗启动,因为某种原因停止了),通常使用大约200MB的内存。 一旦我看到它正在吃掉内存 – 内存使用量约为1.5-2GB,这肯定意味着某处出现了“内存泄漏”(引用中的“内存泄漏”,因为这不是真正的内存泄漏 – 像分配的内存一样,从来没有释放过无法访问 – 请注意, 只有智能指针被使用 ,所以,我想一些巨大的容器(我没有find)或类似的东西) 后来,进程崩溃,因为内存使用率高,产生了一个核心转储 – 大约2GB。 但问题是,我不能重现这个问题,所以valgrind不会在这里帮助(我猜)。 这很less发生,我不能“抓住”它。 所以,我的问题是 – 有没有办法,使用EXE和核心文件,来定位进程的哪一部分,已经使用了大部分的内存? 我用gdb看了一下核心文件,没有什么不寻常的。 但核心是大的,所以一定有一些东西。 有一个聪明的方法来了解发生了什么,或者只有猜测可能有帮助(但对于这样的大EXE .. 12线程,大约50-100(可能更多)类等等) 这是一个在RHEL5U3上运行的C++应用程序。

OpenSSL函数EVP_EncryptFinal_ex中的内存泄漏

我基于这个教程实现了encryption过程: http://www.openssl.org/docs/crypto/EVP_EncryptInit.html# 当我运行它低谷valgring并得到以下报告: ==2371== 176 bytes in 1 blocks are still reachable in loss record 3 of 6 ==2371== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64- linux.so) ==2371== by 0x56CA133: CRYPTO_malloc (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0) ==2371== by 0x575280F: lh_new (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0) ==2371== by 0x5754D4F: ??? (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0) ==2371== by 0x575503E: ??? (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0) ==2371== by 0x5755A1D: ERR_get_state (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0) […]