Ad souvislou oblast virtuální paměti dostane každý proces, který si vyžádá dostatečně velkou oblast voláním malloc(3) - pokud je k dispozici tak velký kus paměti v adresním prostoru aplikace (podmínka nutná, nikoliv postačující).
Adresní prostor aplikace je samozřejmě virtual address space, nikoliv physical address space. Nicméně jsou v něm natažené knihovny (které jsou jak známo in-process), takže heap nemusí být souvislý. Obecně vzato vám každá alokace paměti může vrátit blok začínající v libovolné části adresního prostoru aplikace. Jinými slovy ten nový blok nemusí navazovat na blok který jste dostal při minulém volání HeapAlloc(). Aplikacím to běžně nevadí, protože alokují paměť podle okamžité potřeby. Java je (byla) výjimkou, z důvodu velmi podivného designu jejího interního memory managementu.
Nejlépe se to asi dá demonstrovat na mapě paměti procesu:
http://blogs.msdn.com/blogfiles/tess/WindowsLiveWriter/ShowmethememoryToolforvisualizingvirtua_96C2/image_2.png
Ty hnědé bloky v pravé polovině obrázku jsou DLL v horní části paměťového prostoru, a adresní prostor aplikace fragmentují. I když máte X nealokovaného místa v adresním prostoru, největší souvislý blok má velikost Y, kde Y<X. Na 32-bitových Windows mohla Java získat cca 1.2GB souvislý blok, víc ne. Aplikace alokující paměť v menších blocích mohly alokovat výrazně více.