Articles of 堆

在linux(或POSIX)函数中类似于win32的mem api

我在Windows上编写解释型语言,我使用HeapCreate来实现堆栈和HeapCreate / HeapAllocdynamic分配我的语言。 也许我需要将我的语言移植到其他操作系统..所以,在Linux(或POSIX标准..),有什么类似于这些win32 api? (我希望他们没有很大的不同..) 好的,如果你不知道这些win32 API,请看下面的内容: HeapCreate – 简单。 创build一个新的堆: void *mem = malloc(123); // alloc from default heap HANDLE hHeap = HeapCreate(…); // create a new heap void *mem2 = HeapAlloc(hHeap, some_flag, 123); // alloc from new heap PAGE_GUARD – 有点复杂; 它被用来实现堆栈。 例如,有一个堆栈,其最大大小为5页。 为了节省内存,我只分配一个页面,只是“保留”4个页面的虚拟内存地址。 ——— | alloc | ——— |reserve| ——— |reserve| […]

如何在Linux中find堆的大小?

我有一个运行在ARM Cortex-A8处理器板上的Linux。 内核的版本是由(uname -a)获得的: Linux 2.6.29-dirty#2 Fri Jan 29 16:54:21 IST 2010 armv7l未知 debugging一些由于malloc()失败而导致崩溃的应用程序(我的mallocing的大小很大),并且电路板有208 MB的DRAM。 在这个Linux /主板设置上,我需要找出: 什么是分配/留出这个kernetconfiguration的堆大小。 我怎样才能增加这个堆大小。 是否需要内核重新构build/新版本的内核映像?

valgrind显示的额外程序内存消耗

我的程序使用了很多内存。 这就是valgrind massif工具向我展示的内容: ——————————————————————————– n time(i) total(B) useful-heap(B) extra-heap(B) stacks(B) ——————————————————————————– 28 38,531,086,036 760,235,208 143,002,822 617,232,386 0 正如你所看到的,额外的部分比有用的堆大几倍。 我该怎么做才能减less这些额外的内存? less分配? 这就是所谓的内存碎片? 操作系统:Linux 2.6。 程序是用C编写的。它应该工作24 \ 7,它处理大量的数据。

什么是tomcat内存堆提交?

我们正在监视tomcat服务器,我发现每当提交堆内存达到最大堆内存我的Tomcat崩溃或OOM错误,但同时堆已用内存正常使用。 有人可以解释什么是使用承诺,以及为什么它崩溃,而堆使用是正常的。 看到下面的图表,所以你有一些想法。

在Linux中启动默认堆大小?

ulimit -s显示了默认的堆栈大小限制 。 有没有启动默认堆大小?

根据variables地址存储variables(数据段或堆或BSS)的位置?

与存储静态variables(数据段或堆或BSS)在哪里有点类似? ,但不是一样的。 现在我得到另一个进程的variables的地址,如:0x10fb90,这个variables存储在哪里(数据段或堆或BSS),我可以从进程的PID和variables的地址获取位置? 我正在使用obj-c和c在osx上工作。

后备列表vs低碎片堆

有人可以解释这两者之间的差异。 我知道在Windows Vista之前,LFH并没有默认启用,并且在XP中使用了旁视列表。 谢谢

堆pipe理

我知道有一个元数据存储在free() , realloc()时使用的辅助信息,当我们只提供指针的时候。 我对堆的怀疑不大。 堆栈是按进程分配的。 这一点毫无疑问,但并不确定。 每个进程是否全局维护一个堆信息,会有一些机制保存有关该进程的分配内存的信息。 堆信息将如何维护? 我猜哈希机制。 我GOOGLE了,也试过了。 他们中的大多数人将其解释为具体实现。

Ubuntu 16.04 – malloc实现。 指向下一个块的指针在哪里?

我想了解glibc中的malloc实现是如何工作的。 根据malloc的源代码(glibc 2.23中的malloc.c),空闲内存块具有以下结构。 chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of previous chunk | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ `head:' | Size of chunk, in bytes |P| mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Forward pointer to next chunk in list | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Back pointer to previous chunk in list | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Unused space (may be 0 bytes long) . . . . | […]

堆利用失败:内存损坏

目前学习堆开发,但有一些奇怪的我不明白: 这是通过调用malloc(0x80)分配的下一个块: 0x602090: 0x0000000000000000 0x0000000000000091 0x6020a0: 0x00007ffff7dd1b78 0x0000000000601120 … 在此之后调用另一个malloc(0x80),我的目标是回到0x601130。 这工作,但只有如果0x601128 == 0x90: 0x601120: 0x0000000000602010 0x0000000000000090 0x601130: 0x0000000000602130 0x00000000006021c0 如果我将90更改为任何其他值,则会导致内存损坏: *** Error in `censored': malloc(): memory corruption: 0x00000000006021d0 ** … #0 0x00007ffff7a42428 in __GI_raise (sig=sig@entry=0x6) at ../sysdeps/unix/sysv/linux/raise.c:54 #1 0x00007ffff7a4402a in __GI_abort () at abort.c:89 #2 0x00007ffff7a847ea in __libc_message (do_abort=0x2, fmt=fmt@entry=0x7ffff7b9de98 "*** Error in `%s': %s: […]