I'm sure there are tools for windows that can give you the status of a memory but nevertheless you should develop your service with this problem in mind.
First you should understand what are the allocations you preform. I think the simple way to do it is by overriding the new and delete operators, and from these new operators you should count some statistics of your allocations and then call the default new and delete operators of your compiler.
The minimum statistics you should count in my opinion are the Number of allocations of common block sizes ranges.
e.g.
blocks between 0 bytes to 15 bytes, blocks between 16 bytes to 32 bytes, blocks between 32 bytes to 48 bytes, ...
You can add also the Number of sequential allocation of each blocks size range
After you collect this data you can reduce the fragmentation problem by aligning you blocks to common sizes.
The best and simple technique for alignment is to use a blocks that are power of 2.
for example to align a number to closest number that divide by 16, you can use the following function:
int align(int size)
{
return ((size + 15) & ~0x0000000F);
}
Off course you should use your statistics to select the best power of 2 to align with.
The target is to reach a number that most of your allocations will get into few blocks ranges and in the same time to keep the overhead of the alignment reasonable.
Good luck...