2010-12-08 22 views
2

Mon ordinateur dispose de 8 Go de RAM et exécute Windows Server 2008. malloc/realloc() ne parvient pas à allouer plus de mémoire lorsque mon application a déjà 1,5 ~ 1,7 Go déjà alloués. J'ai essayé de passer à HeapAlloc/HeapRealloc à la place et la même situation se produit.realloc/HeapRealloc échoue bien que suffisamment de mémoire est disponible

Y a-t-il quelque chose qui me manque ici? Qu'est-ce qui pourrait empêcher mon application d'allouer plus de mémoire quand il y a de la mémoire vive disponible?

+0

Combien de mémoire essayez-vous d'acquérir? Est-ce que votre application est une version 32 bits ou 64 bits? – thkala

+0

Windows est 64Bit et mon application est 32Bit. Il est peu probable que ce soit un problème de fragmentation, puisque la dernière fois que je l'ai débogué, il a échoué en essayant de réallouer ~ 7 Mo de morceau dans ~ 9 Mo morceau, et la mémoire libre est d'environ 5 Go. –

+0

Par libre meory vous voulez dire RAM? Au lieu de voir la RAM libre disponible, vous devez voir l'espace libre contiguos le plus grand disponible dans votre espace d'adressage virtuel. Si elle est inférieure à la mémoire que vous demandez, l'allocation échouera. Cela est dû principalement à la fragmentation du tas. – Naveen

Répondre

1

Qu'est-ce qui pourrait empêcher mon application d'allouer plus de mémoire lorsqu'il y a une mémoire vive disponible?

fragmentation Heap. L'attribution ne demande pas simplement de la mémoire. Il demande un morceau de mémoire contigu.

Bien sûr, étant donné la rareté des données que vous avez fournies (combien essayez-vous de re-alloc quand cela arrive? Est-ce un 32bit ou 64bit app?), Il pourrait y avoir d'autres problèmes aussi bien.

2

Par défaut sur le système d'exploitation Windows 32 bits, vous pouvez utiliser 2DB pour un processus. Si vous utilisez le compilateur MSVC, vous devez définir l'option LARGEADDRESSAWARE.

+0

Euh, est Windows Server 2008 _32bit_ ?? – sbi

+0

Drapeau LargeAddressAware est nécessaire pour l'application 64 bits aussi bien que je le sais. – DReJ

+1

Non seulement votre système d'exploitation doit être en 64 bits (ce qui est le cas ici), mais vous devez également compiler votre application pour qu'elle soit en 64 bits. Notez que l'option LARGEADDRESSAWARE active uniquement l'utilisation de l'intégralité du bit 32 pour vos adresses virtuelles, au-dessus de laquelle vous avez besoin d'une compilation 64 bits. – rioki

4

La quantité de RAM que vous avez dans votre machine n'a pas d'importance. Chaque processus de 32 bits sur Windows obtient un espace d'adressage de 4 Go dont 2 Go sont disponibles dans l'espace d'adresse de l'utilisateur. Ainsi, la mémoire de votre programme (y compris son code, les DLL chargées, la pile, etc.) sera allouée à partir de cet espace uniquement. Comme vous approchez des limites de l'espace d'adressage virtuel, l'allocation de mémoire échoue.