Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是Linux Mono应用程序中的内存泄漏吗?_Linux_Memory_Mono_Sgen - Fatal编程技术网

这是Linux Mono应用程序中的内存泄漏吗?

这是Linux Mono应用程序中的内存泄漏吗?,linux,memory,mono,sgen,Linux,Memory,Mono,Sgen,我一直在努力确定我在Debian Wheezy Mono Sgen 2.10.8.1-8嵌入式应用程序中看到的是否是内存泄漏。系统有512MB的RAM。交换被禁用。我一直在学习,试图了解Linux是如何管理进程内存的,从而得出结论,我所看到的实际上是Mono Sgen中某个地方的内存泄漏。我很确定它不是我的应用程序,因为在连续运行数周之后,我已经对它进行了多次分析,并且GC内存总是会回到应用程序的基线。从我的应用程序的角度来看,没有对象泄漏。这并不意味着Mono Sgen内部没有泄漏,但我还没有

我一直在努力确定我在Debian Wheezy Mono Sgen 2.10.8.1-8嵌入式应用程序中看到的是否是内存泄漏。系统有512MB的RAM。交换被禁用。我一直在学习,试图了解Linux是如何管理进程内存的,从而得出结论,我所看到的实际上是Mono Sgen中某个地方的内存泄漏。我很确定它不是我的应用程序,因为在连续运行数周之后,我已经对它进行了多次分析,并且GC内存总是会回到应用程序的基线。从我的应用程序的角度来看,没有对象泄漏。这并不意味着Mono Sgen内部没有泄漏,但我还没有确定这一点,而且可能没有

我已经尝试对我的Mono-Sgen堆设置上限,因为大型堆的Mono默认值为512MB,并且由于这是我的系统的全部功能,我假设我需要设置上限,以防止Linux出现OOM。我的Mono Sgen配置如下:

导出MONO_GC_PARAMS=major=marksweep fixed,主堆大小=32m,托儿所大小=4m,疏散阈值=75

据我所知,我使用的是固定大小为32MB、默认大小为4MB的mark and sweep固定主堆,如果任何主堆分配桶的利用率低于75%以防止碎片,Mono Sgen将在主堆上执行复制收集。我把违约率提高了66%

自从断电导致重置后,我的设备目前已运行了6天多一点。当我的应用程序第一次启动时,我等待大约10分钟以确保它已完全初始化,然后拍摄/proc/PID/status文件的快照以获取其内存使用的基线。今天,我又去了一家快照店,看看我现在在哪里,和往常一样,我在Mono-Sgen流程实例中的虚拟、常驻和数据再次增长。它还没有突破初始化过程中出现的高水位线,但上次我做这个测试时它做到了。我没能做到的,也是我试图做到的,就是让它运行到耗尽系统所有物理内存的程度。我需要知道这是否是内存泄漏,或者Linux是否会在某个时候回收进程分配的某些页面

我注意到的一件事是,即使知道我没有交换,我的monosgen进程的驻留大小也总是比数据计数小30MB左右。据我所知,数据计数是堆分配的数量,驻留大小是物理内存中的实际大小,虚拟大小是已分配的,不一定使用

我的假设是,Linux只是Linux,不会浪费时间或内存,除非它必须这样做。我假设由于系统的负载非常轻,Linux没有内存压力来做任何事情来回收内存,唯恐Mono Sgen继续分配和增加堆,我希望当出现一些实际的内存压力时,Linux会介入并回收没有真正被使用的页面

我已经读到,当在先前分配的内存上调用free时,Linux不会收缩进程的分配内存大小。我不明白为什么,除非Linux是Linux,否则它只有在必要的时候才会这么做。但我担心的是,我需要等待多久,直到这一切发生

这是内存泄漏还是Linux会在内存压力开始增大时收回此进程的驻留和数据大小之间的页面差异?我已经搜索并阅读了所有我能得到的关于这个主题的信息,但我没有找到我想要的答案,我真的不想等待一个月来发现我的应用程序是否会因为OOM killer而反弹。无论如何我会的:)但我想事先知道

我已经研究了Mono Sgen 2.10.8.1-8可能存在的内存泄漏,但是对于我正在做的事情(使用大量对本机Linux应用程序的process.start()调用),大多数会伤害我的bug都不在本版本中。我试图升级到Jessie的Mono-Sgen版本(我想是3.2.8),但它在我的系统上崩溃了,所以出于未知的恐惧,我又回到了稳定的Mono-Sgen 2.10.8.1-8版本

附件中有许多典型内存信息的快照,我的大部分注意力都集中在/proc/PID/status返回的内容上

我们将一如既往地非常感谢您提供的任何信息,我希望我不明白Linux是如何在一个负载较轻的系统上回收内存的


您可以设置以下环境变量来控制malloc的内部内存分配。设置后,它将回答您的问题。如果您想了解其他选项,请参考:

导出MALLOC\u MMAP\u阈值=8192


导出MALLOC_ARENA_MAX=4

使用valgrind运行它。您还没有发布足够的信息供我们告知。谢谢,我会尝试,我不确定armel是否可以使用。感谢您的回复,已经有一段时间了,因为设备对运行时间不重要,所以我每隔两周在凌晨4点定期重设应用程序。我不知道最好的kludge,但它需要船舶:)我会研究一下,看看它是否会有帮助。再次感谢。