Proces Java se v podstatě skládá ze dvou různých haldových prostorů.
- Hromadu Java (nový, starý a trvalý prostor)
- A takzvaná nativní hromada C.
Výše uvedené je často matoucí, pokud jde o chyby OutOfMemory a selhání alokace. Zejména v 32bitovém režimu, kde je celkový procesní prostor omezen na 4 GB nebo dokonce 2 GB v závislosti na operačním systému.
Jak bylo uvedeno výše, celková velikost procesu v 32bitovém režimu je omezena na maximum 4 GB. Java halda a C halda kombinované spolu s dalšími prostory, např. pro knihovny, vlákna atd. nelze překročit tento limit 4 GB. Pokud tedy zvýšíte haldu Java, např. zvýšením -Xmx/-Xms z 1,5 gb na 2,5 gb to bude mít významný vedlejší účinek na hromadu C. Před navýšením mohla halda C snadno narůst až na 2 GB. Protože zbývalo 4gb -1,5gb =2,5gb. PO zvýšení haldy Java z 1,5 gb na 2,5 gb nám zbyly pouze 4 gb – 2,5 gb =1,5 gb pro všechny ostatní prostory. Včetně C-hromady.
Bohužel je zcela závislé na aplikaci, jak velká musí být halda Java a halda C. Zatímco velikost haldy Java lze konfigurovat explicitně, nelze to provést pro haldu C. C-heap se jednoduše rozšiřuje, dokud velikost procesu nedosáhne limitu 4 GB. Pokud tedy nakonfigurujete haldu Java příliš velkou, musíte být opatrní. To může a bude mít za následek selhání alokace C-haldy. Např. zprávy, jako je tato, obvykle znamenají, že halda C byla vyčerpána:
java.lang.OutOfMemoryError: requested 67108872 bytes for Chunk::new. Out of swap space?
Všimněte si syntaxe C++ s dvojitými dvojtečkami. Nebo tento:
# There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (malloc) failed to allocate 65544 bytes
V obou případech byla C-hromada příliš malá. Řešením by bylo snížit haldu Java. Ano, snížit! To by dalo C-hromadě více prostoru pro expanzi. Na druhou stranu stále můžeme zasáhnout klasické Java.lang.OutOfMemoryErrors. Ty jasně ukazují na nedostatečnou kapacitu haldy Java.
Jak vidíte, pokud pracujete v 32bitovém režimu, může dojít ke konfliktu mezi Java a C-heap, který nemusí být snadné vyřešit. Pokud vše selže, zvažte přechod na 64bitovou verzi, kde již nebude omezení velikosti procesu 4 GB problémem. Základní informace:Samotný virtuální stroj Hotspot Java (JVM) je napsán v C++. Veškeré interní alokace JVM se tedy odehrávají výhradně v haldě C. Například když GC začne shromažďovat mrtvé objekty na hromadě Java, přidělí prostor v nativní hromadě, aby mohl vykonávat svou práci.
Na druhou stranu všechny objekty Java, které jsou alokovány programem Java, skončí v haldě Java. C-hromady se nedotknete.