Articles of 堆

什么是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我所需要的。

如何检查Linux上进程的堆大小

我正在写一些代码,并不断崩溃。 后来挖掘转储后,我意识到我超过了堆的最大限制(如果我已经在malloc上添加了一个检查,生活会更容易)。 虽然我修正了这个问题,有没有办法增加我的堆大小? PS:这里有一个非常类似的问题 ,但答复对我来说还不清楚。

windbg的“!heap -h”输出中的“Internal”是什么意思?

我正在关注这个stackoverflow文章“!堆-flt -s xxxx”windbg命令中的不同列表示什么 我正在试图了解打印出来的信息,这些信息占用了大量的内存。 我可以理解大部分专栏,但在我的windbg上,我看到了一个额外的专栏。 我的大多数条目都标记为“ 内部” 。 我想知道这是什么意思。 我已经完成!gflags +ust 。 所以,我可以看到调用栈进行内存分配。 除了标记为“ 内部 ”的项目之外,我可以在大部分项目上执行此操作。 内部是什么意思? 这与LFH的实施有关吗? 如果这是LFH的内部实现,这些内部堆条目将如何以及何时返回到空闲列表? 现在没有任何理由让我记忆犹新。 这里是!heap -h 0000000002330000的输出供您参考。 Index Address Name Debugging options enabled 8: 02330000 Segment at 0000000002330000 to 0000000002340000 (00010000 bytes committed) Segment at 00000000032b0000 to 00000000033b0000 (00100000 bytes committed) Segment at 00000000065a0000 to 00000000067a0000 (00200000 bytes committed) […]