I can definitely think of workloads where a too-simplistic strategy can get you in trouble, but they're pretty seriously contrived.
Let's say your memory is currently all free. Your allocation strategy is to search through memory for the first chunk large enough to hold the size of your malloc() and to allocate that piece.
If you did this:
while( memory available )
{
malloc(8);
malloc(16);
}
And then freed all the 8-byte allocations, you'd be stuck, since you'd have no chunks of memory larger than 8 bytes, even though 1/3 of your memory was unused. But this would be an incredibly stupid thing to do, and they probably do somewhat more sophisticated allocation than that.
Java, I think, also does something along those lines, but I'm not 100% sure.