GNU/Linux >> Znalost Linux >  >> Linux

Rozdíl mezi haldou Java a nativní haldou C

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.


Linux
  1. Rozdíl mezi [[ $a ==Z* ]] a [ $a ==Z* ]?

  2. Rozdíl mezi .exrc a .vimrc?

  3. Rozdíl mezi „$ . Foo“ A „$ ./foo“??

  1. Rozdíl mezi ~/.profile a ~/.bash_profile?

  2. Rozdíl mezi Nss a Pam?

  3. Jaký je rozdíl mezi strtok_r a strtok_s v C?

  1. Jaký je rozdíl mezi fsck a e2fsck?

  2. Jaký je rozdíl mezi adduser a useradd?

  3. Jaký je rozdíl mezi $(CC) a $CC?