Articles of 堆

Eclipse将堆释放回系统

我在Linux(64位)上使用最新的Sun Java 6的Eclipse 3.6,其中包含大量大型项目。 在一些特殊情况下(例如SVN更新),Eclipse需要高达1 GB的堆。 但大部分时间只需要350 MB。 当我启用堆状态面板时,我大部分时间都看到: 350万878M 我用这些设置启动Eclipse:-Xms128m -Xmx1024m 所以大部分的时间都是白白浪费的,只是在短时间内存使用量达到峰值时才使用。 我不喜欢这一点,我希望Eclipse释放内存回到系统,所以我可以用它来做其他程序。 当Eclipse需要更多的内存,而没有足够的可用RAM时,Linux可以将其他正在运行的程序换掉,我可以忍受。 我听说有一个-XX:MaxHeapFreeRatio选项。 但我从来没有想出我有什么价值,所以它的工作原理。 没有任何价值,我尝试曾经有所作为。 那么我怎么能告诉Eclipse(或Java)释放未使用的堆?

一个空的堆竞技场的开销

我的工具是Linux,gcc和pthreads。 当我的程序从多个线程中调用新的/删除的时候,当这个堆存在争用的时候,就会创build'竞技场'(参见http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html )。 我的程序全天候运行,而且两周后仍然偶尔会创build竞技场。 我认为最终可能会有像线程一样多的领域。 ps(1)显示惊人的内存消耗,但我怀疑只有一小部分实际映射。 什么是一个空的舞台上的“开销”? (如果所有的分配被限制在传统堆中,每个竞技场使用的内存多less?) 有没有办法在n场之前强制创作? 有什么办法可以迫使空的场地遭到破坏吗?

什么是SuSE Linux的最大Java堆空间?

这个问题与Java拒绝开始 – 无法为对象堆留出足够的空间有关 ,应该很容易弄清楚。 然而; 我的search没有产生任何有用的东西。 基本上,我们有两个32位操作系统(RedHat&SuSE)在不同的机器上使用相同的硬件。 两者都使用相同的JVM执行相同的命令行。 RedHat工作得很好,但SuSE报告没有足够的内存。 我们只需要知道这是否是我们正在使用的SuSE版本的限制,或者是否是其他内容。 “猫/ proc /版本”给我们: Linux version 2.6.5-7.244-bigsmp (geeko@buildhost) (gcc version 3.3.3 (SuSE Linux)) #1 SMP Mon Dec 12 18:32:25 UTC 2005 'uname -a'给了我们以下两种types的机器: UTC 2005 i686 i686 i386 GNU/Linux

Java内存的奥秘(我有泄漏)?

我有一个独立的Java问题在Linux服务器上运行。 我用-Xmx256m开始了jvm。 我附加了一个JMX监视器,可以看到堆永远不会真的通过256Mb。 但是,在我的Linux系统上运行顶层命令时,我可以看到: 1)首先,这个过程的RES内存使用量约为350Mb。 为什么? 我想这是因为堆外的记忆? 2)其次,这个过程的VIRT内存使用量正在不断增长和增长。 它永远不会停止! 现在显示在2500Mb! 所以我有泄漏? 但堆不增加,它只是循环! 最终,这会造成一个问题,因为系统交换不断增长,最终导致系统死亡。 任何想法是怎么回事? 我想问的一个重要问题是,这可能是我的代码的结果,而不是JVM,内核等的一些情况。例如,如果线程的数量不断增加,那么是否符合我的观察的描述? 任何类似的东西,你可以build议我留意?

堆内存和板分配

我对heap和free list感到困惑。 我有几个问题,我有我自己的理解,如何在C中malloc工作。请纠正我,如果我错了。 堆内存是否组织为一个链表(空闲列表)的数据块? 堆内存和自由列表之间有区别吗? 我对存储分配的理解(打开以便改进): – 当我们调用malloc时,它在堆中分配内存,通过从free list中select合适大小的数据块来实现。 当malloc返回某个内存块时,它将从空闲列表中删除,并且在该页表中更新该块内存的物理地址。 当使用free()释放内存时,将数据块插回到空闲列表中,并且可能会减less碎片,并与相邻的块相结合,并且清除页表项中的present位。 所以整个堆是一个自由列表(空闲块的链表)+分配的数据块。 这是一个存储分配的全面情况? 编辑:从Linux内核开发(罗伯特·洛夫)章内存pipe理, 板分配 “空闲列表包含一个可用的,已分配的数据结构块,当代码需要一个新的数据结构实例时,它可以从空闲列表中获取一个结构,而不是分配足够的内存并设置它之后,当数据结构不再需要的时候,它将被返回到空闲列表而不是释放,这样,空闲列表作为一个对象caching,caching一个经常使用的对象types。 自由列表被称为“可用的,分配的数据结构块”。 它是如何分配 ,当它在一个自由列表? 而如何返回一块内存空闲列表_ 不是像释放该块一样? 板块分配如何与存储分配不同?

C中的堆大小限制

我对C程序的程序执行布局图中的堆有疑问。 我知道所有dynamic分配的内存都分配在一个dynamic增长的堆中。 但是我想知道C程序的最大堆大小是多less? 我只是附加一个示例C程序…在这里我试图分配1GB的内存string,甚至做memset … #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char *argv[]) { char *temp; mybuffer=malloc(1024*1024*1024*1); temp = memset(mybuffer,0,(1024*1024*1024*1)); if( (mybuffer == temp) && (mybuffer != NULL)) printf("%x – %x\n", mybuffer, &mybuffer[((1024*1024*1024*1)-1)]]); else printf("Wrong\n"); sleep(20); free(mybuffer); return 0; } 如果我一次运行3个程序中的程序,那么malloc应该至less在一个实例中失败[我觉得] …但仍然malloc是成功的。 如果成功,我可以知道操作系统如何照顾3GB的dynamic分配的内存。

Linux堆结构和malloc()和free()

我有一个Linux 2.6内核的Debian,我试图理解堆是如何工作/行为与malloc()和free() 。 我试图searchmalloc()和free()algorithm和堆结构,但我找不到任何有用的东西。 不幸的是,我对Linux和内存工作原理知之甚less,无法理解free()和malloc()的源代码。 这是一个示例代码: int main(int argc, char **argv) { char *a, *b, *c; a = malloc(32); b = malloc(32); c = malloc(32); strcpy(a, argv[1]); strcpy(b, argv[2]); strcpy(c, argv[3]); free(c); free(b); free(a); } 使用gdb并run AAAA BBBB CCCC我可以检查堆。 这是strcpys之后,但在frees之前的状态: (gdb) x/32x 0x804c000 0x804c000: 0x00000000 0x00000029 0x41414141 0x00000000 0x804c010: 0x00000000 0x00000000 0x00000000 0x00000000 0x804c020: 0x00000000 […]

如何以编程方式获取Linux上堆的地址

我可以用sbrk(0)得到堆结束的地址,但有没有办法以编程方式获得堆的开始地址,而不是通过parsing/proc/self/maps ?

具体来说,fork()如何在Linux中处理从malloc()dynamic分配的内存?

我有一个父母和孩子的程序。 在fork()之前,父进程调用malloc()并用一些数据填充数组。 在fork()之后,孩子需要这些数据。 我知道我可以使用pipe道,但下面的代码似乎工作: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main( int argc, char *argv[] ) { char *array; array = malloc( 20 ); strcpy( array, "Hello" ); switch( fork() ) { case 0: printf( "Child array: %s\n", array ); strcpy( array, "Goodbye" ); printf( "Child array: %s\n", array ); free( array […]

在gdb中检查C / C ++堆内存统计信息

我试图调查在Linux amd64 gdb内的C / C ++堆的状态,是否有一个很好的方法来做到这一点? 我试过的一种方法是“调用mallinfo()”,但不幸的是我不能提取我想要的值,因为gdb没有正确处理返回值。 我不是很容易编写一个函数来编译到我附加的过程的二进制文件中,所以我可以简单地实现我自己的函数,通过以这种方式在我自己的代码中调用mallinfo()来提取值。 是否有一个聪明的把戏,可以让我在飞行中做到这一点? 另一个select可能是find堆并遍历malloc头文件/空闲列表; 我很感激任何指向我可以开始寻找这些位置和布局的地方。 我一直在试图谷歌和解决这个问题约2个小时,我已经学到了一些迷人的东西,但仍然没有find我所需要的。