Another memory leak question

跟風遠走 提交于 2020-01-06 06:57:34

问题


My application keeps running for 4 to 6 hours, During this time there is no contineous increase in memory or anything similar.

Then after 4 to 6 hours i start getting EOutofMemory Exceptions. Even still at that time there is only 900MB out of 3GB RAM is used as per task manager. And application itself is not using more then 200MB .

Then why i am getting EOoutofMEmory error ?

Does it mean that memory leak is not necessarily visible in task manager ?

Regagards


回答1:


Use Process Explorer instead of Task Manager to look at the memory consumption of your application.

  • Private Bytes: is the amount of memory that is used by your application. This is also the value shown by Task Manager in the VM Size column (under XP)
  • Virtual Memory Size: this is the largest address that is currently in use by your application. This value is limited by 2 GB (for a 32-bit application in a 32-bit OS).

The different between Private Bytes and Virtual Memory Size is caused by memory fragmentation. The only thing you can do about it is to use a memory manager that tries to reduce fragmentation, e.g. by using memory pools.

The DougLea memory manager is a free alternative. There are also commercial memory manager. You can also try to write your own memory manager (it's not that hard: you only have to override the new and delete operators).

There are also tricks to increase the limit of 2 GB. If you link your application with the /LARGEADDRESSAWARE flag, your application will be able to allocate 3GB of memory (if XP is booted with the /3GB flag, for Vista/W7 there's probably a similar flag but I don't know this). On 64-bit Operating systems, a LargeAddressAware executable can even use up to 4 GB of memory.




回答2:


This may be caused by memory fragmentation. When the application runs for a long time, memory can be fragmented, which means it is filled by many small allocated blocks and free spaces. If you want to allocate a memory block larger than the largest free block, your allocation will fail, even though the total amount of free space suggests that there is enough memory for the allocation to succeed.

You may also want to check if you were not accidentally trying to allocate a huge block of memory at one point.

I suggest you check the size of the allocation that failed.



来源:https://stackoverflow.com/questions/2938091/another-memory-leak-question

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!