标签: heap-fragmentation

对C++堆分配器和STL进行碎片整理

我正在寻找一个自我碎片整理的内存管理器,其中一个简单的递增堆分配器与一个简单的压缩碎片整理程序结合使用.

粗略的方案是从最低内存地址开始向上分配块,并保持从最高内存地址开始向下工作的簿记信息.

内存管理器会传回智能指针 - boost的intrusive_ptr似乎对于簿记结构最为明显,这些结构本身会指向实际的内存块,从而提供一个间接级别,以便可以轻松地移动块.

碎片整理程序将从"生成"书签开始压缩堆,以加快进程并且一次只对固定数量的内存进行碎片整理.对块本身的原始指针在下一次碎片整理通过之前是有效的,因此可以自由传递直到这样的时间改善性能.

具体应用是控制台游戏编程,因此在每个帧的开始或结束时,可以相对安全地完成碎片整理传递.

所以我的问题是,任何人都使用这种分配方案与STL结合,它会让STL分开,因为我怀疑.我可以看到std :: list <intrusive_ptr>在intrusive_ptr级别工作,但是stl列表节点本身的分配是什么,无论如何都要覆盖next/prev指针为intrusive_ptr本身,或者我只需要有一个标准堆分配器旁边这个更动态的.

c++ heap memory-management defragmentation heap-fragmentation

8
推荐指数
1
解决办法
3900
查看次数

记忆和指针

我需要一些关于任务的一些帮助.

我的任务是创建一个内存区域

void *memory = malloc(320);
Run Code Online (Sandbox Code Playgroud)

然后使用指针将文本存储到这个存储位置:我们想将这个区域划分为32个字节的数据块,母猪我们可以存储:320/32 = 10个数据块,32个字节.在一个数据块中,我可以存储(1个ASCSII char = 1个字节)32个字符.

我有一个10位的位图,其中每个位指示是否使用数据块(1)或不使用(0).

但是,如果我想存储长度为60个字符的文本呢?然后我需要2个数据块(2 x 32字节).位图显示数据块2和6是空闲的,1和6不是并排的.我怎样才能做到这一点?

struct  data {
    char * text;
};

typedef struct data d;

d->text = ???
Run Code Online (Sandbox Code Playgroud)

c memory pointers heap-fragmentation

5
推荐指数
1
解决办法
255
查看次数

我的iPad运行时内存在哪里?

我显然导致设备(iPad)耗尽内存,所以它放弃了我的应用程序.我正在试图理解正在发生的事情,因为Instruments正在告诉我,我使用的是大约80Mb,并且设备上没有运行其他应用程序.

我发现这段代码片段要求iOS下的Mach系统获取内存统计信息:

#import <mach/mach.h>
#import <mach/mach_host.h>

static void print_free_memory () {
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;

host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);       

vm_statistics_data_t vm_stat;

if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS)
    NSLog(@"Failed to fetch vm statistics");

/* Stats in bytes */
natural_t mem_used = (vm_stat.active_count +
                      vm_stat.inactive_count +
                      vm_stat.wire_count) * pagesize;
natural_t mem_free = vm_stat.free_count * pagesize;
natural_t mem_total = mem_used + mem_free;
NSLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total);
}
Run Code Online (Sandbox Code Playgroud)

当我使用此函数获取三个内存值时,我发现即使mem_used总数没有发生太大变化,mem_total值也会下降.这是两个连续的输出行:

<Warning>: …
Run Code Online (Sandbox Code Playgroud)

memory heap-fragmentation ios

5
推荐指数
1
解决办法
5854
查看次数

如何解决Gen2堆碎片

我正在运行一个服务HTTP请求的C#应用​​程序。我最近注意到,它占用的内存比我预期的要多。我抓起一些转储,将它们弹出到Windbg中,发现大部分内存都标记为“空闲”:

!dumpheap -stat
...
00007ffde4783630   681599     65433504 System.Threading.Tasks.TaskFactory+CompleteOnInvokePromise
00007ffde47cc988   167885     76872908 System.Byte[]
00007ffde47c6948   521353     80352802 System.String
0000007e3a16c2d0  1870425   1415374334      Free
Run Code Online (Sandbox Code Playgroud)

因此,转储约为3GB,因此其中约有一半是可用内存。看着堆,我看到了:

!heapstat
Heap             Gen0         Gen1         Gen2          LOH
Heap0        82248472      7354560    987275056    178834656
Heap1        93146552      6382864    857470096    129435960
Total       175395024     13737424   1844745152    308270616

Free space:                                                 Percentage
Heap0        40969256       146456    640426720     54829792 SOH: 63% LOH: 30%
Heap1        75943736        94448    550812312     54825216 SOH: 65% LOH: 42%
Total       116912992       240904   1191239032    109655008
Run Code Online (Sandbox Code Playgroud)

因此,我的小对象堆非常分散,特别是Gen2。在服务器上,我可以看到gen2集合正在发生(使用性能计数器),但是即使它们是gen2堆,也似乎没有对其进行压缩。即使服务器上只有1-2%的RAM可用,gen2堆也不会被压缩。

在我看来,由于堆是零散的,所以我正遭受这种内存压力。但是我无法弄清楚为什么会发生碎片或为什么gen2无法压缩。一些可用空间的大小为6MB,所以我认为肯定可以将那些空间压缩掉。

谁能给我一些关于如何弄清楚我的堆为什么如此分散的想法?我什至在这里吠叫正确的树吗?

任何帮助将不胜感激,谢谢!

编辑1:

的细分!gchandles为:

Handles:
Strong Handles:       4507 …
Run Code Online (Sandbox Code Playgroud)

.net c# garbage-collection heap-fragmentation memory-fragmentation

5
推荐指数
1
解决办法
763
查看次数

何时解决托管堆碎片问题

我正在阅读Josh Smith 撰写的博客文章,他使用缓存机制来"减少托管堆碎片".他的缓存减少了创建的短期对象的数量,但代价是执行速度稍慢.

在像C#这样的托管语言中管理堆碎片有多少问题?你如何诊断它是否是一个问题?在什么情况下你通常需要解决它?

.net caching heap-fragmentation

2
推荐指数
1
解决办法
1055
查看次数