Π Π°Π·Π½ΠΎΠ΅

Java ΠΏΠ°ΠΌΡΡ‚ΡŒ: Π‘Ρ‚Π΅ΠΊ ΠΈ ΠΊΡƒΡ‡Π° Π² Java

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

РаспрСдСлСниС памяти Π² JVM / Π‘Π»ΠΎΠ³ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ OTUS. Онлайн-ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ / Π₯Π°Π±Ρ€

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚! ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ сСгодняшнСго ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΈΡƒΡ€ΠΎΡ‡ΠΈΡ‚ΡŒ ΠΊ запуску Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΠΎ курсу Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ JavaΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ стартуСт ΡƒΠΆΠ΅ Π·Π°Π²Ρ‚Ρ€Π°. Π§Ρ‚ΠΎ ΠΆ Π½Π°Ρ‡Π½Ρ‘ΠΌ.

JVM ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слоТным Π·Π²Π΅Ρ€Π΅ΠΌ. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, большая Ρ‡Π°ΡΡ‚ΡŒ этой слоТности скрыта ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ, ΠΈ ΠΌΡ‹, ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ отвСтствСнныС Π·Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ, часто Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ± этом сильно Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ. Π₯отя ΠΈΠ·-Π·Π° роста популярности Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ развСртывания ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ…, стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° распрСдСлСниС памяти Π² JVM.

Π”Π²Π° Π²ΠΈΠ΄Π° памяти

JVM раздСляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π° Π΄Π²Π΅ основныС ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ: Β«ΠΊΡƒΡ‡ΡƒΒ» (heap) ΠΈ Β«Π½Π΅ ΠΊΡƒΡ‡ΡƒΒ» (non-heap). ΠšΡƒΡ‡Π° β€” это Ρ‡Π°ΡΡ‚ΡŒ памяти JVM, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹. Π—Π΄Π΅ΡΡŒ хранятся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, созданныС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Они ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΌ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ±Ρ€Π°Π½Ρ‹ сборщиком мусора. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, измСняСтся Π² зависимости ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.


ΠŸΠ°ΠΌΡΡ‚ΡŒ Π²Π½Π΅ ΠΊΡƒΡ‡ΠΈ дСлится Π½Π° нСсколько областСй. Π’ HotSpot для изучСния областСй этой памяти ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Native memory tracking (NMT). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ, хотя NMT Π½Π΅ отслСТиваСт использованиС всСй Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ отслСТиваСтся Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти сторонним ΠΊΠΎΠ΄ΠΎΠΌ), Π΅Π³ΠΎ возмоТностСй достаточно для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Spring. Для использования NMT запуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ -XX:NativeMemoryTracking=summary ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ jcmd VM.native_memory summary посмотритС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ памяти.

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим использованиС NMT Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ нашСго старого Π΄Ρ€ΡƒΠ³Π° Petclinic. Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ использованиС памяти JVM ΠΏΠΎ Π΄Π°Π½Π½Ρ‹ΠΌ NMT (Π·Π° Π²Ρ‹Ρ‡Π΅Ρ‚ΠΎΠΌ собствСнного ΠΎΠ²Π΅Ρ€Ρ…Π΅Π΄Π° NMT) ΠΏΡ€ΠΈ запускС Petclinic с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΊΡƒΡ‡ΠΈ 48 ΠœΠ‘ (-Xmx48M):

Как Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π½Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²Π½Π΅ ΠΊΡƒΡ‡ΠΈ приходится большая Ρ‡Π°ΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ памяти JVM, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ составляСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ ΡˆΠ΅ΡΡ‚ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΡ‘ΠΌΠ°. Π’ этом случаС это ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 44 ΠœΠ‘ (ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… 33 ΠœΠ‘ использовалось сразу послС сборки мусора). ИспользованиС памяти Π²Π½Π΅ ΠΊΡƒΡ‡ΠΈ составило Π² суммС 223 ΠœΠ‘.

ΠžΠ±Π»Π°ΡΡ‚ΠΈ Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти

Compressed class space (ΠΎΠ±Π»Π°ΡΡ‚ΡŒ сТатых ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ): ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… классах. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ MaxMetaspaceSize. Ѐункция количСства классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°

ΠŸΠΎΡ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Π°Π²Ρ‚ΠΎΡ€ ΠΏΠΈΡˆΠ΅Ρ‚ ΠΏΡ€ΠΎ Β«Compressed class spaceΒ», Π° Π½Π΅ ΠΏΡ€ΠΎ всю ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Β«ClassΒ». ΠžΠ±Π»Π°ΡΡ‚ΡŒ Β«Compressed class spaceΒ» Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состав области Β«Π‘lassΒ», Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ MaxMetaspaceSize ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ всСй области Β«ClassΒ», Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Β«Compressed class spaceΒ». Для ограничСния Β«Compressed class spaceΒ» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ CompressedClassSpaceSize.

ΠžΡ‚ΡΡŽΠ΄Π°:

If UseCompressedOops is turned on and UseCompressedClassesPointers is used, then two logically different areas of native memory are used for class metadata…

A region is allocated for these compressed class pointers (the 32-bit offsets). The size of the region can be set with CompressedClassSpaceSize and is 1 gigabyte (GB) by default…

The MaxMetaspaceSize applies to the sum of the committed compressed class space and the space for the other class metadata

Если Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ UseCompressedOops ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ UseCompressedClassesPointers, Ρ‚ΠΎΠ³Π΄Π° для ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… классов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Π²Π΅ логичСски Ρ€Π°Π·Π½Ρ‹Π΅ области Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти…

Для сТатых ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ выдСляСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти (32-Π±ΠΈΡ‚Π½Ρ‹Π΅ смСщСния). Π Π°Π·ΠΌΠ΅Ρ€ этой области ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСн CompressedClassSpaceSize ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½ 1 ГБ…

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ MaxMetaspaceSize относится ΠΊ суммС области сТатых ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ области для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… класса.

  • Thread (ΠΏΠΎΡ‚ΠΎΠΊΠΈ): ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π² JVM. Ѐункция количСства Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².
  • Code cache (кэш ΠΊΠΎΠ΄Π°): ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ JIT для Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Ѐункция количСства классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ReservedCodeCacheSize. МоТно ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ настройкой JIT, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠ² ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ (tiered compilation).
  • GC (сборщик мусора): Ρ…Ρ€Π°Π½ΠΈΡ‚ Π΄Π°Π½Π½Ρ‹Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ сборщиком мусора. Зависит ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ сборщика мусора.
  • Symbol (символы): Ρ…Ρ€Π°Π½ΠΈΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ символы, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ»Π΅ΠΉ, сигнатуры ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ строки. Π§Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠ΅ использованиС памяти символов ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ строки слишком ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹.
  • Internal (Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅): Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ входят Π½ΠΈ Π² ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… областСй.

ΠžΡ‚Π»ΠΈΡ‡ΠΈΡ

По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΊΡƒΡ‡Π΅ΠΉ, ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²Π½Π΅ ΠΊΡƒΡ‡ΠΈ мСньшС измСняСтся ΠΏΠΎΠ΄ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ всС классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ JIT ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ прогрССтся, всё ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ Π² устойчивоС состояниС. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ использования области Compressed class space, Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ» классы, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½ сборщиком мусора. Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ распространСно Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° прилоТСния Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π»ΠΈΡΡŒ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… сСрвлСтов ΠΈΠ»ΠΈ сСрвСрах ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ классов прилоТСния удалялся сборщиком мусора, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠ΄Π°Π»ΡΠ»ΠΎΡΡŒ с сСрвСра ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ), Π½ΠΎ с соврСмСнными ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°ΠΌΠΈ ΠΊ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ это случаСтся Ρ€Π΅Π΄ΠΊΠΎ.

Настройка JVM

ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ JVM для эффСктивного использования доступной ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти нСпросто. Если Π²Ρ‹ запуститС JVM с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ -Xmx16M ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 16 ΠœΠ‘ памяти, Ρ‚ΠΎ вас ΠΆΠ΄Ρ‘Ρ‚ нСприятный ΡΡŽΡ€ΠΏΡ€ΠΈΠ·.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ памяти JVM являСтся кэш ΠΊΠΎΠ΄Π° JIT. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ HotSpot JVM Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎ 240 ΠœΠ‘. Если кэш ΠΊΠΎΠ΄Π° слишком ΠΌΠ°Π», Π² JIT ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ мСста для хранСния своих Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ сниТСна ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Если кэш слишком Π²Π΅Π»ΠΈΠΊ, Ρ‚ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π° Π²ΠΏΡƒΡΡ‚ΡƒΡŽ. ΠŸΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° кэша Π²Π°ΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ влияниС ΠΊΠ°ΠΊ Π½Π° использованиС памяти, Ρ‚Π°ΠΊ ΠΈ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Docker послСдниС вСрсии Java Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π½Π°ΡŽΡ‚ ΠΎΠ± ограничСниях памяти ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈ ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ памяти JVM. К соТалСнию, часто происходит Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ большого количСства памяти Π²Π½Π΅ ΠΊΡƒΡ‡ΠΈ ΠΈ нСдостаточного Π² ΠΊΡƒΡ‡Π΅. Допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π΅ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ с 2-мя процСссорами ΠΈ 512 ΠœΠ‘ доступной памяти. Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»ΠΎΡΡŒ большС Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚Π΅ количСство процСссоров Π΄ΠΎ 4-Ρ… ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π΄ΠΎ 1 Π“Π‘. Как ΠΌΡ‹ обсуТдали Π²Ρ‹ΡˆΠ΅, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ измСняСтся Π² зависимости ΠΎΡ‚ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²Π½Π΅ ΠΊΡƒΡ‡ΠΈ измСняСтся Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ мСньшС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ большая Ρ‡Π°ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… 512 ΠœΠ‘ Π±ΡƒΠ΄Π΅Ρ‚ прСдоставлСна ΠΊΡƒΡ‡Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ. К соТалСнию, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ JVM этого Π½Π΅ сдСлаСт ΠΈ распрСдСлит Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π½Π΅Π΅ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² ΠΊΡƒΡ‡Π΅ ΠΈ Π²Π½Π΅ ΠΊΡƒΡ‡ΠΈ.

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, ΠΊΠΎΠΌΠ°Π½Π΄Π° CloudFoundry ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΎΠ±ΡˆΠΈΡ€Π½Ρ‹ΠΌΠΈ знаниями ΠΎ распрСдСлСнии памяти Π² JVM. Если Π²Ρ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚Π΅ прилоТСния Π² CloudFoundry, Ρ‚ΠΎ сборщик (build pack) автоматичСски ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ эти знания для вас. Если Π²Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ CloudFoudry ΠΈΠ»ΠΈ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ большС ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ JVM, Ρ‚ΠΎ рСкомСндуСтся ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ описаниС Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ вСрсии Java buildpack’s memory calculator.

Π§Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚ для Spring

Команда Spring ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, думая ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ использовании памяти, рассматривая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования памяти ΠΊΠ°ΠΊ Π² ΠΊΡƒΡ‡Π΅, Ρ‚Π°ΠΊ ΠΈ Π²Π½Π΅ ΠΊΡƒΡ‡ΠΈ. Один ΠΈΠ· способов ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ использованиС памяти Π²Π½Π΅ ΠΊΡƒΡ‡ΠΈ β€” это Π΄Π΅Π»Π°Ρ‚ΡŒ части Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° максимально ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ этого являСтся использованиС Reflection для создания ΠΈ внСдрСния зависимостСй Π² Π±ΠΈΠ½Ρ‹ вашСго прилоТСния. Благодаря использованию Reflection количСство ΠΊΠΎΠ΄Π° Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅, остаСтся постоянным, нСзависимо ΠΎΡ‚ количСства Π±ΠΈΠ½ΠΎΠ² Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ запуска ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ кэш Π² ΠΊΡƒΡ‡Π΅, очищая этот кэш послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ запуска. ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»Π΅Π³ΠΊΠΎ ΠΎΡ‡ΠΈΡ‰Π΅Π½Π° сборщиком мусора, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ большС доступной памяти Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ.

Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ ΠΆΠ΄Ρ‘ΠΌ ваши ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΏΠΎ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρƒ.

Java ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ стСка ΠΈ ΠΊΡƒΡ‡ΠΈ

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго: я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽ, Ρ‡Ρ‚ΠΎ ваши вопросы появятся послС прочтСния этой ΡΡ‚Π°Ρ‚ΡŒΠΈ ( ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ я Π²ΠΈΠΆΡƒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΡƒΡŽ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡƒ, ΠΊΠ°ΠΊ ΠΈ Π’Π°ΡˆΠ°), поэтому я Π½Π΅ Π±ΡƒΠ΄Ρƒ Ρ†ΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΌ, ΠΈ ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° ваши вопросы Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ ΡΡ‚ΠΎΠ»ΡŒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ Π² этом постС.

Читая всС ваши вопросы, Ρƒ мСня слоТилось Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ясно прСдставляСтС, ΠΊΠ°ΠΊ распрСдСляСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² стСкС ΠΈ ΠΊΡƒΡ‡Π΅, Π½ΠΎ ΡΠΎΠΌΠ½Π΅Π²Π°Π΅Ρ‚Π΅ΡΡŒ Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… классов, Ρ‚. Π΅. Π³Π΄Π΅ Π² памяти Π±ΡƒΠ΄ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ классов ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹. Π˜Ρ‚Π°ΠΊ, сначала ΠΏΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ JVM области памяти:


ΠŸΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ я ΠΏΠΎΠΌΠ΅Ρ‰Ρƒ эти 2 Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ области памяти JVM:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ схСма

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ схСма

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌ, Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° дрСвовидная структура памяти JVM, ΠΈ я ΠΏΠΎΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΠΏΡ€ΠΎΠ»ΠΈΡ‚ΡŒ свСт Π½Π° Ρ‚ΠΎ ΠΆΠ΅ самоС ( @Adit: ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, которая вас бСспокоит, — это пространство PermGen ΠΈΠ»ΠΈ постоянноС пространство Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ памяти Π±Π΅Π· ΠΊΡƒΡ‡ΠΈ ).

  • ΠšΡƒΡ‡Π½Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ
    • МолодоС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅
      • ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° Рая
      • ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠžΡΡ‚Π°Π²ΡˆΠ΅Π³ΠΎΡΡ Π’ Π–ΠΈΠ²Ρ‹Ρ…
    • Π‘Ρ‚Π°Ρ€ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅
      • Π¨Ρ‚Π°Ρ‚Π½ΠΎΠ΅ ПоколСниС
  • NonHeap ΠΏΠ°ΠΌΡΡ‚ΡŒ
    • ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½ΠΎΠΉ Π“Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ
    • Кэш ΠΊΠΎΠ΄Π° ( я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π» «only» ΠΏΠΎ HotSpot Java VM )

ΠšΡƒΡ‡Π½Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ

ΠšΡƒΡ‡Π½Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ — это ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Java VM выдСляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ для всСх экзСмпляров класса ΠΈ массивов. ΠšΡƒΡ‡Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ фиксированного ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора-это автоматичСская систСма управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, которая восстанавливаСт ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

МолодоС поколСниС

МолодоС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ — это мСсто, Π³Π΄Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ всС Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Когда ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ заполняСтся, производится Π²Ρ‹Π²ΠΎΠ· мусора. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора вызываСтся Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ GC. МолодоС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ дСлится Π½Π° 2 части

Eden space: ΠΏΡƒΠ», ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ выдСляСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΡ…: ΠΏΡƒΠ», содСрТащий ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ»ΠΈ сбор мусора Π² пространствС Π­Π΄Π΅ΠΌΠ°.

Π‘Ρ‚Π°Ρ€ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅

ΠŸΠ°ΠΌΡΡ‚ΡŒ старого поколСния содСрТит ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»Π³ΠΎ ΠΆΠΈΠ»ΠΈ ΠΈ Π²Ρ‹ΠΆΠΈΠ»ΠΈ послС ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ€Π°ΡƒΠ½Π΄ΠΎΠ² ΠΌΠΈΠ½ΠΎΡ€Π½Ρ‹Ρ… GC. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ сбор мусора выполняСтся Π² памяти старого поколСния, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°. Π‘Π±ΠΎΡ€ΠΊΠ° мусора старого поколСния называСтся Major GC ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π‘Ρ‚Π°Ρ€ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ содСрТит Π½ΠΈΠΆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ:

АрСндуСмоС пространство: ΠΏΡƒΠ», содСрТащий ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сущСствовали Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² пространствС Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΡ….

ΠŸΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ «ΠΊΡƒΡ‡ΠΈ»

ΠŸΠ°ΠΌΡΡ‚ΡŒ Π±Π΅Π· ΠΊΡƒΡ‡ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ всСми ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ»ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ для Java VM. Он Ρ…Ρ€Π°Π½ΠΈΡ‚ структуры для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΡƒΠ» констант Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»Π΅ΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΠ΄ для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ конструкторов. ΠžΠ±Π»Π°ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° логичСски являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΊΡƒΡ‡ΠΈ, Π½ΠΎ, Π² зависимости ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, a Java VM Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ мусор ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. Как ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ фиксированный ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€. ΠŸΠ°ΠΌΡΡ‚ΡŒ для области ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ смСТной.

ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½ΠΎΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ

ΠŸΡƒΠ», содСрТащий всС ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ самой Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π‘ Java VMs, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ совмСстноС использованиС Π΄Π°Π½Π½Ρ‹Ρ… класса, это ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ дСлится Π½Π° области Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния ΠΈ чтСния-записи.

Кэш кода

HotSpot Java VM Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя кэш ΠΊΠΎΠ΄Π°, содСрТащий ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для компиляции ΠΈ хранСния собствСнного ΠΊΠΎΠ΄Π°.


Π“Π΄Π΅ хранятся ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ s?

ΠŸΠ°ΠΌΡΡ‚ΡŒ Π±Π΅Π· ΠΊΡƒΡ‡ΠΈ —> постоянная гСнСрация

Π― создал Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π²Π½ΡƒΡ‚Ρ€ΡŒ MemoryClass myMethod, Π±ΡƒΠ΄Π΅Ρ‚ JVM
снова Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ для Ρ‚Π΅Ρ… ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π²Π½ΡƒΡ‚Ρ€ΠΈ стСковой памяти?

ΠŸΠ°ΠΌΡΡ‚ΡŒ стСка содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, поэтому ваш ORV (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ ссылочная пСрСмСнная) Π½ΠΎΠ²ΠΎΠ³ΠΎ MemoryClass всС Ρ€Π°Π²Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ создан Π² ΠΊΠ°Π΄Ρ€Π΅ стСка myMethod, Π½ΠΎ JVM Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ снова Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Ρ‚. Π΄. MemoryClass Π² «Permanent Generation».

JVM Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ класс Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ класс, Ρ‚ΠΎ пространство выдСляСтся Π½Π° «Permanent Generation» для этого класса, ΠΈ это происходит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° класс загруТаСтся JVM.

ΠžΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ Π»ΠΈ JVM ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ myMethod, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½Π°
Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ, Ссли Π΄Π°, Ρ‚ΠΎ ΠΊΠ°ΠΊ Π±Ρ‹ ΠΎΠ½ справился с ситуациСй
, упомянутой Π² вопросС 2(ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли JVM выдСляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ
нСсколько Ρ€Π°Π· ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ).

ΠšΠ°Π΄Ρ€ стСка, созданный для myMethod , Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· памяти стСка, поэтому вся ΠΏΠ°ΠΌΡΡ‚ΡŒ, созданная для Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡ΠΈΡ‰Π΅Π½Π°, Π½ΠΎ это Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ JVM очистит ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π² «Permanent Generation» для класса Ρ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ создали Π² myMethod

Π§Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹, Ссли Π±Ρ‹ я Ρ‚ΠΎΠ»ΡŒΠΊΠΎ объявил s ΠΈ Π½Π΅
ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π» Π΅Π³ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ JVM ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ всСм ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ
java.lang.String класс, Ссли Π΄Π°, Ρ‚ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ?

Π’ частности, говоря ΠΎ классС String , JVM Π²Ρ‹Π΄Π΅Π»ΠΈΠ» Π±Ρ‹ мСсто для String Π² «Permanent Generation» слишком Ρ€Π°Π½ΠΎ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ JVM Π·Π°ΠΏΡƒΡ‰Π΅Π½, ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ свою ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈΠ»ΠΈ Π½Π΅Ρ‚, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния «Permanent Generation» это Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния.

Говоря ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… классах, JVM Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ класс ΠΈ выдСляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² «Permanent Generation», ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ опрСдСляСтС класс, ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅, Π΄Π°ΠΆΠ΅ Ссли Π²Ρ‹ Π½Π΅ создаСтС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса, ΠΏΠ°ΠΌΡΡ‚ΡŒ выдСляСтся Π² «Permanent Generation» (ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π±Π΅Π· ΠΊΡƒΡ‡ΠΈ), Π° ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ создаСтС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса, Ρ‚ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ выдСляСтся Π² «Eden Space» ( ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ ).


Устройство памяти Java-процСсса. β€” floppyy blog

Если Π²Ρ‹ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ, Π·Π½Π°Ρ‡ΠΈΡ‚ Π²Ρ‹ ΡƒΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с Java ΠΈ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° простом Π·Π½Π°Π½ΠΈΠΈ синтаксиса языка, стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ популярных Java-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ² β€” Π²Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ JVM, ΠΊΠ°ΠΊ выдСляСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ происходит процСсс сборки мусора.

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒ вас с устройством памяти Π² Java. ΠžΡ‚ΡΡŽΠ΄Π° Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, Π³Π΄Π΅ Π² Java хранятся Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ ΠΊΠ°ΠΊ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… областСй памяти для Java-процСсса.

Π˜Ρ‚Π°ΠΊ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ сначала взглянСм ΠΈΠ· ΠΊΠ°ΠΊΠΈΡ… областСй состоит ΠΏΠ°ΠΌΡΡ‚ΡŒ, выдСляСмая JVM  для вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Java Heap.

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅. ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ создаСтС Π² своСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ JVM выдСляСт ΠΈΠ· области, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ ΠΊΡƒΡ‡Π΅ΠΉ (heap),  которая Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° части β€” Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Young Generation ΠΈ Old Generation. Π—Π°Ρ‡Π΅ΠΌ Π΄Π΅Π»ΠΈΡ‚ΡŒ всю ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π° Π΄Π²Π΅ части?

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎΠ± этом Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅, посвящСнной ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡƒ сборки мусора Π² JVM. БСйчас я объясню это совсСм ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ: сборка мусора Π² Java основываСтся Π½Π° Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ слабой Π³ΠΈΠΏΠΎΡ‚Π΅Π·Π΅ ΠΎ поколСниях, которая гласит ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ создаваСмых Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΡƒΠΌΠΈΡ€Π°ΡŽΡ‚ Ρ€Π°Π½ΠΎ: это всСвозмоТныС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ быстро ΠΎΡ‚ΠΆΠΈΠ²Π°ΡŽΡ‚ своС ΠΈ большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹. Garbage collector’у (сборщику мусора) Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΎΠ² ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ находятся Π² Young Generation. Но Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (мСньшая ΠΈΡ… Ρ‡Π°ΡΡ‚ΡŒ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя ΠΈΠ»ΠΈ Π½Π° протяТСнии ΠΆΠΈΠ·Π½ΠΈ всСго прилоТСния, Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ. На эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ постоянно Π½ΡƒΠΆΠ½Ρ‹ Β«ΠΆΠΈΠ²Ρ‹Π΅Β» ссылки. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора Π½Π΅ удаляСт ΠΈΡ… Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ссылки Π½Π° Π½ΠΈΡ… Π΅Ρ‰Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚. Они ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΎΠ΄Π½Ρƒ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ сборку мусора ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Java-Heap’а β€” Old Generation, ΠΎΡ‚ΠΊΡƒΠ΄Π° с Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшСй Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ (ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, всС зависит ΠΎΡ‚ спСцифики вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ, см. Π½ΠΈΠΆΠ΅).

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Out of Memory Error: java heap space ΠΈ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ страдаСт ΠΎΡ‚ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти ΠΈΠ»ΠΈ нСэффСктивного ΠΊΠΎΠ΄Π°?

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ, запустив Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ: -Xms(ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Java heap’а) ΠΈΠ»ΠΈ β€”Xmx(ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Java heap’a).

Permanent Generation.

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ вашСго класса JVM создаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Class. Π­Ρ‚ΠΎ мСтаинформация, нСобходимая для создания Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Java, хранится ΠΊΠ°ΠΊ Ρ€Π°Π· Π² области памяти,Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Permanent Generation. Код Π²Π°ΡˆΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ хранится здСсь, ΠΊΠ°ΠΊ ΠΈ всС статичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

И Π΅Ρ‰Π΅: Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² Π² процСссС выполнСния вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Out of Memory Error: PermGen space, Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π½Π°Ρ‚ΡŒ, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ области памяти Java-процСсса Π½Π°Π΄ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: β€”XX:PermSize(Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ PermGen) ΠΈΠ»ΠΈ -XX:MaxPermSize(ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ PermGen).

Java Stack.

Java β€” это стСковая Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина. НадСюсь, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ стСк. Если Π²Ρ‹ всС ΠΆΠ΅ Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚Π΅ΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²Π΅ΠΆΠΈΡ‚ΡŒ свои знания, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π˜Ρ‚Π°ΠΊ, Β JVM Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π² стСк всС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². ΠŸΡ€ΠΈ дальнСйшСм Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ½Π° ΠΈΡ… ΠΎΡ‚Ρ‚ΡƒΠ΄Π° Π·Π°Π±ΠΈΡ€Π°Π΅Ρ‚, осущСствляСт Π½ΡƒΠΆΠ½Ρ‹Π΅ дСйствия ΠΈ ΠΊΠ»Π°Π΄Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² стСк ΠΈΠ»ΠΈ просто ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄. Π’Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ,Ρ‡Ρ‚ΠΎ стСк дСлится Π½Π° нСсколько областСй, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ выполняСмому ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π² вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

Если всСм ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Π² вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½ΡƒΠΆΠ½ΠΎ большС памяти ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ StackOverflowError, Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ стСка, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -Xss. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ слСдуСт ΡƒΠ΄Π΅Π»ΠΈΡ‚ΡŒ внимания ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ,Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ рСкурсивныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π’Π°ΠΊΠΆΠ΅, для Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠΉ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° доступной памяти для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· конструкторов класса Thread(ThreadGroupΒ group,Β RunnableΒ target,Β StringΒ name, longΒ stackSize), Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ. ПослСдний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ stackSize Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ сам Π·Π° сСбя.

Я сказал, Ρ‡Ρ‚ΠΎ Π² стСкС хранятся всС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. Но это Π½Π΅ совсСм Ρ‚Π°ΠΊ. Для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² хранятся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ссылки Π½Π° Π½ΠΈΡ…, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ сами ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ находятся Π² ΠΊΡƒΡ‡Π΅. К слову, это ΡƒΠΆΠ΅ Π½Π΅ совсСм Ρ‚Π°ΠΊ благодаря Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Escape Analysis ΠΈΠ· Java 6: Ρ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ выполняСмого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² стСкС. Π­Ρ‚ΠΎ сдСлано для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сборщик мусора впослСдствии ΠΌΠΎΠ³ ΠΈΡ… быстро ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ познакомились с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΆΠ΅ JVM Β«ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌΒ», Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, выдСляСмой для создаваСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²,Π³Π΄Π΅ хранятся статичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π–Π΄Ρƒ Π²Π°ΡˆΠΈΡ… ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΈ ΠΏΠΎΠΆΠ΅Π»Π°Π½ΠΈΠΉ. УспСхов Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ!

ΠžΡΠ½ΠΎΠ²Ρ‹ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² Java

ΠžΠ±Ρ‰ΠΈΠ΅ свСдСния ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ — это процСсс размСщСния Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ мСсто для этих Π½ΠΎΠ²Ρ‹Ρ… ассигнований ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ для языков ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ способом управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ являСтся Ρ€ΡƒΡ‡Π½ΠΎΠΉ. Π•Π³ΠΎ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ являСтся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ:

  • Для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² динамичСской памяти программист явно Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ выдСлСния памяти. Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сохраняСтся ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для доступа ΠΊ Π½Π΅ΠΉ.
  • Π”ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° созданный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½ΡƒΠΆΠ΅Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° обращаСтся ΠΊ Π½Π΅ΠΌΡƒ Ρ‡Π΅Ρ€Π΅Π· Ρ€Π°Π½Π΅Π΅ сохранённый ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ.
  • Когда Π½Π°Π΄ΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚, программист явно Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ освобоТдСния памяти, пСрСдавая Π΅ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° удаляСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.
  • Π ΡƒΡ‡Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ допускаСт ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π΄Π²Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹: висячиС ссылки ΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти.

Висячая ссылка β€” это ΠΎΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Π² использовании ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ ΡƒΠ΄Π°Π»Ρ‘Π½. ПослС удалСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° всС ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ²ΡˆΠΈΠ΅ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ссылки Π½Π° Π½Π΅Π³ΠΎ становятся «висячими». ΠŸΠ°ΠΌΡΡ‚ΡŒ, занимаСмая Ρ€Π°Π½Π΅Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС ΠΈ ΡΡ‚Π°Ρ‚ΡŒ нСдоступной, ΠΈΠ»ΠΈ Π±Ρ‹Ρ‚ΡŒ использована для размСщСния Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

Π£Ρ‚Π΅Ρ‡ΠΊΠ° памяти — процСсс Π½Π΅ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ ΠΎΠ±ΡŠΡ‘ΠΌΠ° свободной ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ памяти ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, связанный с ошибками Π² Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, воврСмя Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ… Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ ΡƒΠΆΠ΅ участки памяти.

ВсС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ способа управлСния памяти Π² Java Ρ€Π΅ΡˆΠ°Π΅Ρ‚ автоматичСский сборщик мусора. Но ΠΏΡ€Π΅Π΄ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ΠΌ со сборщиком мусора, Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·ΡŠΡΡΠ½ΠΈΡ‚ΡŒ понятиС ΠΊΡƒΡ‡ΠΈ(heap).

ΠšΡƒΡ‡Π°

Π’ Java всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ находятся Π² области памяти ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΊΡƒΡ‡Π°. ΠšΡƒΡ‡Π° создаСтся, ΠΊΠΎΠ³Π΄Π° JVM запускаСтся ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒΡΡ Π² Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ… Π²ΠΎ врСмя выполнСния прилоТСния. Когда ΠΊΡƒΡ‡Π° становится ΠΏΠΎΠ»Π½ΠΎΠΉ, происходит ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сборки мусора. ВсС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° большС Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡΡ, ΠΎΡ‡ΠΈΡ‰Π°ΡŽΡ‚ΡΡ. Ρ‚Π΅ΠΌ самым освобоТдая мСсто для Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π’Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ JVM ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ большС памяти, Ρ‡Π΅ΠΌ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΡƒΡ‡Π°. НапримСр, для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Java ΠΈ стСков ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² выдСляСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ ΠΊΡƒΡ‡ΠΈ.

Π Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ зависит ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, это Π³Π΄Π΅-Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ 2 ΠΈ 128 Кб.

Garbage Collection

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сборки мусора — это процСсс освобоТдСния мСста Π² ΠΊΡƒΡ‡Π΅, для возмоТности добавлСния Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ посрСдством ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new, Ρ‚Π΅ΠΌ самым присваивая ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ссылку. Π—Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ² Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π²Ρ‹ просто пСрСстаСтС Π½Π° Π½Π΅Π³ΠΎ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ β€” достаточно ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ссылку Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null Π»ΠΈΠ±ΠΎ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈ своС сущСствованиС СстСствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ссылки Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚, принято Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ мусором (garbage), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½.

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Java, примСняя ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сборки мусора, Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ любой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ ссылками, остаСтся Π² памяти β€” всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСдостиТимы ΠΈΠ· выполняСмого ΠΊΠΎΠ΄Π° Π²Π²ΠΈΠ΄Ρƒ отсутствия ссылок Π½Π° Π½ΠΈΡ…, ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ с высвобоТдСниСм ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ для Π½ΠΈΡ… памяти. Π’ΠΎΡ‡Π½Π΅Π΅ говоря, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² сфСру дСйствия процСсса сборки мусора, Ссли ΠΎΠ½ достиТим посрСдством Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ссылок, начиная с ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ (root) ссылки, Ρ‚. Π΅. ссылки, нСпосрСдствСнно ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π² выполняСмом ΠΊΠΎΠ΄Π΅.

ΠŸΠ°ΠΌΡΡ‚ΡŒ освобоТдаСтся сборщиком мусора ΠΏΠΎ Π΅Π³ΠΎ собствСнному «ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ» ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° для дальнСйшСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ свободной памяти большСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Π½Π΅ΠΆΠ΅Π»ΠΈ Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ имССтся Π² распоряТСнии Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π»ΠΈΠ±ΠΎ Ссли сборщик мусора «ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ΠΈΡ‚» ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΡƒ памяти Π² блиТайшСм Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ (часто ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ ΠΈ происходит) Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π½Π΅ исчСрпав рСсурсов свободной памяти ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΠ²ΡˆΠΈΡΡŒ ΠΊ этой Ρ‡Π΅Ρ€Ρ‚Π΅, ΠΈ поэтому Π΅ΠΉ Ρ‚Π°ΠΊ ΠΈ Π½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ «ΡƒΡΠ»ΡƒΠ³ΠΈ» сборщика мусора. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ считаСтся «Π±ΠΎΠ»Π΅Π΅ нСдостиТимым», Ссли Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠ΄Π΅, выполняСмом Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π½Π΅ содСрТит ссылок Π½Π° Π½Π΅Π³ΠΎ Π»ΠΈΠ±ΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° ссылок, которая ΠΌΠΎΠ³Π»Π° Π±Ρ‹ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, обрываСтся.

ΠœΡƒΡΠΎΡ€ собираСтся систСмой Π±Π΅Π· вашСго Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°, Π½ΠΎ это Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ процСсс Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ внимания вовсС. ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ создания ΠΈ удалСния большого количСства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² сущСствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ сказываСтся Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈ Ссли быстродСйствиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ являСтся Π²Π°ΠΆΠ½Ρ‹ΠΌ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ, слСдуСт Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Π΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, связанныС с созданиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², β€” это, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ ΠΈ объСм мусора, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ ΡƒΡ‚ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Если Π’Π°ΠΌ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»Π°ΡΡŒ ΡΡ‚Π°Ρ‚ΡŒΡ, проголосуйтС Π·Π° Π½Π΅Π΅

Голосов: 25
Π“ΠΎΠ»ΠΎΡΠΎΠ²Π°Ρ‚ΡŒ Β 

2 способа увСличСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти

Β 

Из-Π·Π° взаимодСйствия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Java с Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ошибки, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π»Π΅ΠΆΠΈΡ‚ Π½Π° ΠΏΠ»Π΅Ρ‡Π°Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Оно достигаСтся двумя путями: пСрСустановкой модуля ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ памяти Java. Π‘ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ситуациСй стоит Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.

Π—Π°Ρ‡Π΅ΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Java

Π—Π°Π΄Π°Ρ‡Ρƒ ΠΏΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ Java памяти ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ставят ΠΏΠ΅Ρ€Π΅Π΄ собой Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… случаях:

  • НС запускаСтся ΠΈΠ³Ρ€Π° Minecraft. Π“Π΅ΠΉΠΌΠ΅Ρ€ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сообщСниС, Ρ‡Ρ‚ΠΎ для запуска Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ памяти, хотя ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ трСбования ΠΏΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²ΠΊΠ΅ ΡΠΎΠ±Π»ΡŽΠ΄Π΅Π½Ρ‹.
  • ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΊΡƒΡ‡ΠΈ Java. НаписанноС сСрвСрноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ запускаСтся. Для Π΅Π³ΠΎ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ трСбуСтся 512 Мб ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²ΠΊΠΈ Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Π½ΠΎ трудности с запуском Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ 4 Π“Π±.

Π˜ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ двумя способами.

Как Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Java

Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π”ΠΆΠ°Π²Π°-ΠΌΠΎΠ΄ΡƒΠ»ΡŽ большС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· «ПанСль управлСния». Бпособ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с запуском ΠΈΠ³Ρ€Ρ‹ Minecraft.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ:

  1. ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ΡΡ «ПанСль управлСния».
  2. Π’ поискС Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Java-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.
  3. ПослС запуска ПО Π² шапкС выбираСтся Ρ€Π°Π·Π΄Π΅Π» Java.
  4. Π’ Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ²ΡˆΠ΅ΠΌΡΡ ΠΎΠΊΠ½Π΅ открываСтся View.
  5. Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ модуля ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ лишниС строки, Ссли ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ. Π”ΠΎΠ»ΠΆΠ½Π° ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π°, Π³Π΄Π΅ ΡƒΠΊΠ°Π·Π°Π½Π° послСдняя вСрсия ПО. Π’Π°ΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π·Ρ€ΡΠ΄Π½ΠΎΡΡ‚ΡŒ.
  6. Для увСличСния памяти производится ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ столбца Runtime Parameters. ΠŸΡ€ΠΈ этом ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅: -Xincgc-Xmx2048M, Π³Π΄Π΅ 2048 – 2 Π“Π± выдСляСмой ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²ΠΊΠΈ. Π’Π°ΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ². Π’ 32-Π±ΠΈΡ‚Π½ΠΎΠΉ ОБ рСкомСндуСтся Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ 768 Мб.
  7. НаТимаСтся ОК, ОБ пСрСзагруТаСтся.

Π Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄:

  • Xincgc – освобоТдаСт Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· памяти;
  • Xmx – ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ объСм ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²ΠΊΠΈ;
  • Xms – ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ объСм.

Если это Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Minecraft, пСрСустановитС ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Java ΠΈ ΠΈΠ³Ρ€Ρƒ. ПослС удалСния очиститС рССстр с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CCleaner.

Β 

Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ памяти с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды

Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² Π”ΠΆΠ°Π²Π΅ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… систСмной срСды. Π’ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, упомянутых Ρ€Π°Π½Π΅Π΅: -Xms ΠΈ -Xmx.

Π§Ρ‚ΠΎΠ±Ρ‹ систСма воспринимала написанныС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Β«_JAVA_OPTIONSΒ».

Если количСство памяти, ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Java, Π² Π΄Π²Π° Ρ€Π°Π·Π° мСньшС ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²ΠΊΠΈ, Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ инструкции:

  1. ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ «Бвойства» Π½Π° ярлыкС «Мой ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Β».
  2. Из Π»Π΅Π²ΠΎΠΉ части Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Β«Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ систСмы».
  3. На Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Β«Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΒ» производится ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ Β«ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды».
  4. НаТимаСтся ΠΊΠ½ΠΎΠΏΠΊΠ° Β«Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒΒ».
  5. Имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ: Β«_JAVA_OPTIONSΒ», Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹: Β«-Xms512m -Xmx1024mΒ».

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ объСм ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²ΠΊΠΈ составлял 1 Π“Π±.

Π’ΠΈΠ΄Π΅ΠΎ: 3 способа Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ большС памяти Java.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ рассмотрСно Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° увСличСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти, выдСляСмой для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Java-модуля.

Β 

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ°…

Π§Ρ‚ΠΎ потрСбляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² процСссС Java?

ΠΌΡ‹ пытаСмся ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ использованиС памяти процСссом Java ΠΏΡ€ΠΈ ΡƒΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅.

  PID   USER    PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  12663 test    20   0 8378m 6.0g 4492 S   43  8.4 162:29.95 java

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρƒ нас Π΅ΡΡ‚ΡŒ рСзидСнтная ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π° 6Gb. Π’Π΅ΠΏΠ΅Ρ€ΡŒ интСрСсная Ρ‡Π°ΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ: процСсс выполняСтся с этими ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ:

  • -Xmx2048m
  • -Xms2048m
  • -XX: NewSize = 512m
  • -XX: MaxDirectMemorySize = 256m
  • . .. Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ для GC ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π΅

Глядя Π½Π° эти настройки ΠΈ Π½Π° фактичСскоС использованиС памяти, ΠΌΡ‹ сталкиваСмся с Ρ€Π°Π·Π½ΠΈΡ†Π΅ΠΉ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ этот процСсс Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π° самом Π΄Π΅Π»Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ ΠΏΡƒΡ‚Π΅ΠΌ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ, Π½ΠΎ Π² этом случаС наша ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π³Π΄Π΅-Ρ‚ΠΎ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΊΡƒΡ‡ΠΈ.

Вопросы: ΠšΠ°ΠΊΠΎΠ²Ρ‹ Π±Ρ‹Π»ΠΈ Π±Ρ‹ шаги, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ высокого использования памяти? КакиС инструмСнты ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² этом процСссС?

Π Π•Π”ΠΠšΠ’Π˜Π ΠžΠ’ΠΠ’Π¬ 0

НС ΠΏΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, связанная с ΠΊΡƒΡ‡Π΅ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ нас всС Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ достаточно мСста:

jmap -heap 12663

Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ (ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ для экономии мСста)

Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize      = 2147483648 (2048.0MB)
NewSize          = 536870912 (512.0MB)
MaxNewSize       = 536870912 (512.0MB)
OldSize          = 1610612736 (1536. 0MB)
NewRatio         = 7
SurvivorRatio    = 8
PermSize         = 21757952 (20.75MB)
MaxPermSize      = 85983232 (82.0MB)

New Generation: 45.7% used
Eden Space: 46.3% used
From Space: 41.4% used
To Space: 0.0% used
concurrent mark-sweep generation: 63.7% used
Perm Generation: 82.5% used

Π Π•Π”ΠΠšΠ’Π˜Π ΠžΠ’ΠΠ’Π¬ 1

ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ pmap, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ сущСствуСт довольно ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΉ 64 Мб:

pmap -x 12663 | grep rwx | sort -n -k3 | less

Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π²:

... a lot more of these 64Mb chunks
00007f32b8000000       0   65508   65508 rwx--    [ anon ] <- what are these?
00007f32ac000000       0   65512   65512 rwx--    [ anon ]
00007f3268000000       0   65516   65516 rwx--    [ anon ]
00007f3324000000       0   65516   65516 rwx--    [ anon ]
00007f32c0000000       0   65520   65520 rwx--    [ anon ]
00007f3314000000       0   65528   65528 rwx--    [ anon ] 
00000000401cf000       0  241904  240980 rwx--    [ anon ] <- Direct memory ?
000000077ae00000       0 2139688 2139048 rwx--    [ anon ] <- Heap ?

Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Π·Π° куски ΠΏΠΎ 64 Мб? Π§Ρ‚ΠΎ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚? КакиС Π΄Π°Π½Π½Ρ‹Π΅ Π² Π½ΠΈΡ…?

Бпасибо

Java Memory Model β€” urvanov.

ru

МодСль памяти Java ΠΈΠ»ΠΈ Java Memory Model (JMM) описываСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС. Она ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ Ρ‚ΠΎ, Π½Π° Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΠΈΡ€Π°Ρ‚ΡŒΡΡ программист, Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ дальшС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ достаточно большоС количСство Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ². Π”ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ большая Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ· Π½ΠΈΡ… пригодится Π²Π°ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° собСсСдованиях, Π½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Java Memory Model всё-Ρ‚Π°ΠΊΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.

Java ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… процСссорах ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π½ΠΈΡŽ синхронизации ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. МногиС соврСмСнныС процСссоры ΠΈΠΌΠ΅ΡŽΡ‚ нСсколько ядСр, ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π΅ Π² Ρ‚ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ записаны, Π° Ρ‚Π°ΠΊΠΆΠ΅ компиляторы ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ синхронизированныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ.

НапримСр, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
r1 ΠΈ
r2 ΠΈ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
A ΠΈ
B. ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ
A == B == 0.

Thread 1Thread 2
1: r2 = A;3: r1 = B;
2: B = 1;4: A = 2;

ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ r2 == 2 ΠΈ r1 == 1 Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π»ΠΈΠ±ΠΎ инструкция 1 Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠΉ, Π»ΠΈΠ±ΠΎ инструкция 3 Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠΉ. Если инструкция 1 Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠΉ, Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ смоТСт ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ число 2, записанноС Π² инструкции 4. Если инструкция 3 Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠΉ, Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ смоТСт ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ инструкции 2.

Если ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ ΠΊ Ρ‚Π°ΠΊΠΎΠΌΡƒ повСдСнию, Ρ‚ΠΎ ΠΌΡ‹ Π±Ρ‹ Π·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ инструкция 4 Π±Ρ‹Π»Π° Π΄ΠΎ инструкции 1, которая Π±Ρ‹Π»Π° Π΄ΠΎ инструкции 2, которая Π±Ρ‹Π»Π° Π΄ΠΎ инструкции 3, которая Π±Ρ‹Π»Π° Π΄ΠΎ инструкции 4, Ρ‡Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ абсурдно.

Однако соврСмСнным компиляторам Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ мСстами инструкции Π² ΠΎΠ±ΠΎΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° это Π½Π΅ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ исполнСниС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π΅ учитывая Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. Если инструкция 1 ΠΈ инструкция 2 ΠΏΠΎΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ мСстами, Ρ‚ΠΎ ΠΌΡ‹ с Π»Ρ‘Π³ΠΊΠΎΡΡ‚ΡŒΡŽ смоТСм ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
r2 == 2 ΠΈ
r1 == 1.

Thread 1Thread 2
B = 1;r1 = B;
r2 = A;A = 2;

Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… программистов ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΌ, Π½ΠΎ здСсь Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ этот ΠΊΠΎΠ΄ Π½Π΅Π²Π΅Ρ€Π½ΠΎ синхронизирован:

  • Ρƒ нас Π΅ΡΡ‚ΡŒ запись ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°;
  • ΠΌΡ‹ Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°;
  • Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись Π½Π΅ синхронизированы, Ρ‡Ρ‚ΠΎ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ порядок.

Битуация, описанныС Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅, называСтся «состояниСм Π³ΠΎΠ½ΠΊΠΈΒ» ΠΈΠ»ΠΈ Data Race.

ΠŸΠ΅Ρ€Π΅ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Just-In-Time компилятор ΠΈΠ»ΠΈ процСссор. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ядро процСссора ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ свой кСш. А Π·Π½Π°Ρ‡ΠΈΡ‚, Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСссора ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ своё Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π½ΠΎΠΉ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ.

МодСль памяти описываСт, ΠΊΠ°ΠΊΠΈΠ΅ значСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ считаны Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ПовСдСниС ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² изоляции Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ, ΠΊΠ°ΠΊΠΈΠΌ описано Π² самом ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Π½ΠΎ значСния, считываСмыС ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ модСлью памяти. Когда ΠΌΡ‹ ссылаСмся Π½Π° это, Ρ‚ΠΎ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° подчиняСтся intra-thread semantic, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ сСмантики ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ прилоТСния.

РаздСляСмыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

ΠŸΠ°ΠΌΡΡ‚ΡŒ, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ совмСстно использована Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, называСтся ΠΊΡƒΡ‡Π° (shared memory ΠΈΠ»ΠΈ heap memory).

ВсС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ экзСмпляров, статичСскиС поля, массивы элСмСнтов хранятся Π² ΠΊΡƒΡ‡Π΅. Π”Π°Π»ΡŒΡˆΠ΅ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Π±ΡƒΠ΄Ρƒ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… всСх просто ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ.

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ конструкторов ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π±Π»ΠΎΠΊΠ°
catch Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ.

Π”Π²Π° доступа ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‰ΠΈΠΌΠΈ, Ссли хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΈΡ… доступов мСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ°ΠΊ ΠΌΠ΅Π½ΡΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅).

ДСйствия

Inter-thread action (Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Ρ‚Π°ΠΊΠΎΠΉ, Π½Π΅ знаю, ΠΊΠ°ΠΊ пСрСвСсти, ΠΌΠΎΠΆΠ΅Ρ‚, ΠΌΠ΅ΠΆΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅ дСйствиС?) β€” это дСйствиС Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‡Π΅Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. БущСствуСт нСсколько Ρ‚ΠΈΠΏΠΎΠ² inter-thread action:

  • Π§Ρ‚Π΅Π½ΠΈΠ΅ (Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅, Π½Π΅ volatile). Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.
  • Π—Π°ΠΏΠΈΡΡŒ (Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Π°Ρ, Π½Π΅ volatile). Π—Π°ΠΏΠΈΡΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.
  • volatile read. Π§Ρ‚Π΅Π½ΠΈΠ΅ volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.
  • volatile write. Π—Π°ΠΏΠΈΡΡŒ volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.
  • Lock. ВзятиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°.
  • Unlock. ОсвобоТдСниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°.
  • (синтСтичСскиС) ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΈ послСднСС дСйствиС Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅.
  • ДСйствия ΠΏΠΎ запуску Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠ»ΠΈ обнаруТСния остановки ΠΏΠΎΡ‚ΠΎΠΊΠ°.
  • Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ дСйствия. Π­Ρ‚ΠΎ дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹ снаруТи Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, взаимодСйствия с внСшним ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ.
  • Thread divergence actions. ДСйствия ΠΏΠΎΡ‚ΠΎΠΊΠ°, находящСгося Π² бСсконСчном Ρ†ΠΈΠΊΠ»Π΅ Π±Π΅Π· синхронизаций, Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈΠ»ΠΈ Π²Π½Π΅ΡˆΠ½ΠΈΡ… дСйствий.

Program order

Program order (Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹) β€” ΠΎΠ±Ρ‰ΠΈΠΉ порядок ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π³ΠΎ дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ порядок, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ всС дСйствия с соотвСтствии с сСмантикой intra-thread semantic ΠΏΠΎΡ‚ΠΎΠΊΠ°.

ДСйствия Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ sequentially consistent (Π»ΡƒΡ‡ΡˆΠ΅ Ρ‚ΠΎΠΆΠ΅ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ), Ссли всС дСйствия Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² ΠΎΠ±Ρ‰Π΅ΠΌ порядкС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ соотвСтствуСт program order, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²ΠΈΠ΄ΠΈΡ‚ послСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, записанноС Ρ‚ΡƒΠ΄Π° Π΄ΠΎ этого Π² соотвСтствии с порядком выполнСния.

Если Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅Ρ‚ состояния Π³ΠΎΠ½ΠΊΠΈ, Ρ‚ΠΎ всС запуски ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄ΡƒΡ‚ sequentially consistent.

Synchronization order

Synchronization order (порядок синхронизации, Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ) β€” ΠΎΠ±Ρ‰ΠΈΠΉ порядок всСх дСйствий ΠΏΠΎ синхронизации Π² Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ДСйствия ΠΏΠΎ синхронизации вводят связь synchronized-with (синхронизировано с):

  • ДСйствиС освобоТдСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° synchronizes-with всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия ΠΏΠΎ Π²Π·ΡΡ‚ΠΈΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ этого ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°.
  • ΠŸΡ€ΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ значСния
    volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ synchronizes-with всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ чтСния этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π»ΡŽΠ±Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ.
  • ДСйствиС запуска ΠΏΠΎΡ‚ΠΎΠΊΠ° synchronizes-with с ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ дСйствиСм Π²Π½ΡƒΡ‚Ρ€ΠΈ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.
  • ΠŸΡ€ΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (0, false, null) ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ synchronizes-with с ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ дСйствиСм ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.
  • ПослСднСС дСйствиС Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ synchronizes-with с Π»ΡŽΠ±Ρ‹ΠΌ дСйствиСм Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ.
  • Если ΠΏΠΎΡ‚ΠΎΠΊ 1 ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ 2, Ρ‚ΠΎ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠ° 2 synchronizes-with с любой Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Π³Π΄Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ (ΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠΆΠ΅) провСряСт, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ 2 Π±Ρ‹Π» ΠΏΡ€Π΅Ρ€Π²Π°Π½ (
    InterruptedException,
    Thread.interrupted,
    Thread.isInterrupted).

Happens-before

Happens-before («выполняСтся ΠΏΡ€Π΅ΠΆΠ΄Π΅Β» ΠΈΠ»ΠΈ Β«ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ-Π΄ΠΎΒ») β€” ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ порядка ΠΌΠ΅ΠΆΠ΄Ρƒ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ. Оно ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ вторая ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ измСнСния ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΈ Ρ‡Ρ‚ΠΎ пСрвая ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‚ΠΎΡ€ΠΎΠΉ. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π² Java, ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ΠΌ чтСния.

Happens-before Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚:

  • ОсвобоТСниС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° happens-before любого ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ взятия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ этого ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°.
  • ΠŸΡ€ΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
    volatile полю happens-before любого ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ чтСния значСния этого поля.
  • Запуск ΠΏΠΎΡ‚ΠΎΠΊΠ° happens-before Π»ΡŽΠ±Ρ‹Ρ… дСйствий Π² Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅.
  • ВсС дСйствия Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° happens-before любого ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ
    join() Π½Π°Π΄ этим ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ.
  • Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для любого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° happens-before Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… дСйствий ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π Π°Π±ΠΎΡ‚Π° с final полями

ВсС
final поля Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π»ΠΈΠ±ΠΎ конструкциями ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π»ΠΈΠ±ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ конструктора. НС стоит Π²Π½ΡƒΡ‚Ρ€ΠΈ конструкторов ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ. ΠŸΠΎΡ‚ΠΎΠΊ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ конструктора. Π’Π°ΠΊ ΠΊΠ°ΠΊ
final полям присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Ρ‚ΠΎ просто Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ конструкторов ΠΈ Π±Π»ΠΎΠΊΠΎΠ² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ.

Однако
final поля ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Ρ‡Π΅Ρ€Π΅Π· Java Reflection API, Ρ‡Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, дСсСриализаторы. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π½Π΅ ΠΎΡ‚Π΄Π°Π²Π°ΠΉΡ‚Π΅ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ ΠΈ Π½Π΅ Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
final поля Π΄ΠΎ Π΅Π³ΠΎ обновлСния ΠΈ всё Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ.

Word tearing

НСкоторыС процСссоры Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚ Π² ΠžΠ—Π£, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ word tearing. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ массив Π±Π°ΠΉΡ‚. Один ΠΏΠΎΡ‚ΠΎΠΊ записываСт ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π±Π°ΠΉΡ‚, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ пытаСтся Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² рядом стоящий Π±Π°ΠΉΡ‚. Но Ссли процСссор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ†Π΅Π»ΠΎΠ΅ машинноС слово, Ρ‚ΠΎ запись рядом стоящСго Π±Π°ΠΉΡ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎΠΉ. Если просто ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ машинноС слово, ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚ ΠΈ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, Ρ‚ΠΎ ΠΌΡ‹ помСшаСм Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ записи Ρ€Π°Π·Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ Π² ΠΎΠ΄Π½ΠΎΠΌ массивС всё ΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ синхронизациСй. На сколько я знаю, Π² x86 Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π΅Ρ‚, Π½ΠΎ всё Ρ€Π°Π²Π½ΠΎ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° это Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, здСсь Π½ΡƒΠΆΠ½Π° синхронизация.


ΠŸΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ:

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Java для Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Java (JVM)

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ большС ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π²Π΅Ρ‰Π΅ΠΉ

Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ΡΡŒ Π² BETSOL, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Π²Π°Ρ‚ΡŒ ΠΎ послСдних тСхнологичСских тСндСнциях, Π»ΡƒΡ‡ΡˆΠΈΡ… отраслСвых ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°Ρ… ΠΈ тСстах.

Бпасибо Π·Π° подписку.

Π§Ρ‚ΠΎ-Ρ‚ΠΎ пошло Π½Π΅ Ρ‚Π°ΠΊ.

ПослСднСС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅: 11 дСкабря 2020 Π³., Π°Π²Ρ‚ΠΎΡ€: Umme Kulsum

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Java — это постоянная Π·Π°Π΄Π°Ρ‡Π° ΠΈ Π½Π°Π²Ρ‹ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠ²ΠΎΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ настроСнныС прилоТСния, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.По сути, это процСсс выдСлСния Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ удалСния Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π‘ΡƒΠ΄ΡŒΡ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΌΡƒ ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΡŽ!

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ обсудим Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ Java (JVM), ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, инструмСнты ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° памяти, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ использования памяти ΠΈ дСйствия ΠΏΠΎ сборкС мусора (GC).

Как Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, сущСствуСт мноТСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², инструмСнтов ΠΈ совСтов для настоящСй ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Java (JVM)

JVM — это абстрактная Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ машина, которая позволяСт ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρƒ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Java.БущСствуСт Ρ‚Ρ€ΠΈ понятия JVM: спСцификация , (Π³Π΄Π΅ ΡƒΠΊΠ°Π·Π°Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° JVM. Но рСализация Π±Ρ‹Π»Π° прСдоставлСна ​​Sun ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ компаниями), рСализация (извСстная ΠΊΠ°ΠΊ (JRE) Java Runtime Environment) ΠΈ экзСмпляр (послС написаниС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Java, для запуска класса Java создаСтся экзСмпляр JVM).

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Java Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΊΠΎΠ΄, провСряСт ΠΊΠΎΠ΄, выполняСт ΠΊΠΎΠ΄, управляСт ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ (это Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы (ОБ), ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Java, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ сТатиС ΠΊΡƒΡ‡ΠΈ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² мусора) ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, прСдоставляСт срСду выполнСния. .

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° памяти Java (JVM)

ΠŸΠ°ΠΌΡΡ‚ΡŒ

JVM дСлится Π½Π° нСсколько частСй: ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ, ΠΏΠ°ΠΌΡΡ‚ΡŒ Π±Π΅Π· ΠΊΡƒΡ‡ΠΈ ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π΅.

Рис. 1.1, источник https://www.yourkit.com/docs/kb/sizes.jsp

ΠšΡƒΡ‡Π° памяти

ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ — это ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ выдСляСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ для всСх экзСмпляров ΠΈ массивов классов java. ΠšΡƒΡ‡Π° создаСтся ΠΏΡ€ΠΈ запускС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Java ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒΡΡ Π² Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния. Π Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° –Xms VM. ΠšΡƒΡ‡Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ фиксированный ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π² зависимости ΠΎΡ‚ стратСгии сборки мусора. ΠœΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° –Xmx. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ Ρ€Π°Π²Π΅Π½ 64 ΠœΠ‘.

ΠŸΠ°ΠΌΡΡ‚ΡŒ Π±Π΅Π· ΠΊΡƒΡ‡ΠΈ

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Java ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΎΡ‚Π»ΠΈΡ‡Π½ΡƒΡŽ ΠΎΡ‚ ΠΊΡƒΡ‡ΠΈ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π±Π΅Π· ΠΊΡƒΡ‡ΠΈ. Он создаСтся ΠΏΡ€ΠΈ запускС JVM ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ структуры для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΡƒΠ» констант Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»Π΅ΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΠ΄ для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ конструкторов, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ строки.По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ памяти Π±Π΅Π· ΠΊΡƒΡ‡ΠΈ составляСт 64 ΠœΠ‘. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° –XX: MaxPermSize VM.

Другая ΠΏΠ°ΠΌΡΡ‚ΡŒ

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Java ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ это пространство для хранСния самого ΠΊΠΎΠ΄Π° JVM, Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… структур JVM, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π°Π³Π΅Π½Ρ‚Π° ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°, Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ‚. Π”.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° памяти ΠΊΡƒΡ‡ΠΈ Java (JVM)

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° рис. 1.2 http://www.journaldev.com/2856/java-jvm-memory-model-memory-management-in-java

ΠšΡƒΡ‡Π° JVM физичСски Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° Π΄Π²Π΅ части (ΠΈΠ»ΠΈ поколСния): ΠΏΠΈΡ‚ΠΎΠΌΠ½ΠΈΠΊ (ΠΈΠ»ΠΈ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ пространство / ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ ) ΠΈ староС пространство (ΠΈΠ»ΠΈ староС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ ).

Ясли — это Ρ‡Π°ΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ, зарСзСрвированная для размСщСния Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Когда дСтская заполняСтся, мусор собираСтся ΠΏΡƒΡ‚Π΅ΠΌ запуска ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ , Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ достаточно Π΄ΠΎΠ»Π³ΠΎ ΠΆΠΈΠ»ΠΈ Π² дСтской, ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°ΡŽΡ‚ΡΡ (ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ) Π² староС пространство, освобоТдая, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΈΡ‚ΠΎΠΌΠ½ΠΈΠΊ для размСщСния большСго количСства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π­Ρ‚Π° сборка мусора называСтся Minor GC . Ясли Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° Ρ‚Ρ€ΠΈ части — Eden Memory ΠΈ Π΄Π²Π΅ Survivor Memory .

Π’Π°ΠΆΠ½Ρ‹Π΅ свСдСния ΠΎ дСтской ΠΊΠΎΠΌΠ½Π°Ρ‚Π΅:

  • Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ вновь созданных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² находится Π² пространствС Eden Memory
  • Когда пространство Π­Π΄Π΅ΠΌΠ° заполняСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, выполняСтся ΠœΠ°Π»Ρ‹ΠΉ сборщик мусора, ΠΈ всС Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ Π² ΠΆΠΈΠ²Ρ‹Ρ… пространств
  • Minor GC Ρ‚Π°ΠΊΠΆΠ΅ провСряСт Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΈΡ… Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ мСсто Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΡ…. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ Π² ΠΆΠΈΠ²Ρ‹Ρ… ячССк всСгда пусто
  • ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»ΠΎΠ² сборки мусора, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² пространство памяти старого поколСния.ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это дСлаСтся ΠΏΡƒΡ‚Π΅ΠΌ установки ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ значСния возраста ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠΈΡ‚ΠΎΠΌΠ½ΠΈΠΊΠ°, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ½ΠΈ станут подходящими для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΊ старому поколСнию

Когда староС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ заполняСтся, Ρ‚Π°ΠΌ собираСтся мусор, ΠΈ этот процСсс называСтся старой сборкой. ΠŸΠ°ΠΌΡΡ‚ΡŒ старого поколСния содСрТит ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠΌΠΈ ΠΈ Π²Ρ‹ΠΆΠΈΠ»ΠΈ послС ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ†ΠΈΠΊΠ»ΠΎΠ² Minor GC. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ сборка мусора выполняСтся Π² памяти старого поколСния, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°. Π‘Π±ΠΎΡ€ΠΊΠ° мусора старого поколСния называСтся Major GC ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° создания дСтской Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ ΠΈ Π½Π΅Π΄ΠΎΠ»Π³ΠΎΠ²Π΅Ρ‡Π½Ρ‹. Молодая коллСкция ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ быстро Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅Π΄Π°Π²Π½ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Ρ‰Π΅ ΠΆΠΈΠ²Ρ‹, ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈΡ… подальшС ΠΎΡ‚ дСтской. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, молодая коллСкция освобоТдаСт Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ объСм памяти Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС, Ρ‡Π΅ΠΌ старая коллСкция ΠΈΠ»ΠΈ сборка мусора для ΠΊΡƒΡ‡ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ поколСния (ΠΊΡƒΡ‡Π° Π±Π΅Π· ΠΏΠΈΡ‚ΠΎΠΌΠ½ΠΈΠΊΠ°).

ПослСдниС выпуски Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠΈΡ‚ΠΎΠΌΠ½ΠΈΠΊΠ°, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ , Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ , ΠΈ ΠΎΠ½Π° Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π°.ΠžΠ±Π»Π°ΡΡ‚ΡŒ хранСния содСрТит самыС Π½Π΅Π΄Π°Π²Π½ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΏΠΈΡ‚ΠΎΠΌΠ½ΠΈΠΊΠ΅ ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ‚ сборкС мусора Π΄ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния. Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ запуском ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ.

МодСли памяти Java

ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ (Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ Π½Π° Metaspace с Java 8)

Permanent Generation ΠΈΠ»ΠΈ Β«Perm GenΒ» содСрТит ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ прилоТСния, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ JVM для описания классов ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.Perm Gen заполняСтся JVM Π²ΠΎ врСмя выполнСния Π½Π° основС классов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Perm Gen Ρ‚Π°ΠΊΠΆΠ΅ содСрТит классы ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Java SE. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Perm Gen ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ мусором ΠΏΡ€ΠΈ ΠΏΠΎΠ»Π½ΠΎΠΉ сборкС мусора.

Metaspace

Π’ Java 8 Π½Π΅Ρ‚ Perm Gen, Π° это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ большС Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с пространством Β«java.lang.OutOfMemoryError: PermGenΒ». Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Perm Gen, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится Π² ΠΊΡƒΡ‡Π΅ Java, Metaspace Π½Π΅ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΊΡƒΡ‡ΠΈ. Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… класса Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ выдСляСтся ΠΈΠ· собствСнной памяти.Metaspace ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ автоматичСски ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ свой Ρ€Π°Π·ΠΌΠ΅Ρ€ (Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ прСдоставляСт базовая ОБ), Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Perm Gen всСгда ΠΈΠΌΠ΅Π΅Ρ‚ фиксированный ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€. Для установки Ρ€Π°Π·ΠΌΠ΅Ρ€Π° мСтапространства ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π° Π½ΠΎΠ²Ρ‹Ρ… Ρ„Π»Π°Π³Π°: Β« -XX: MetaspaceSize Β» ΠΈ Β« -XX: MaxMetaspaceSize Β». Π’Π΅ΠΌΠ°, лСТащая Π² основС Metaspace, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ врСмя ΠΆΠΈΠ·Π½ΠΈ классов ΠΈ ΠΈΡ… ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… соотвСтствуСт Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΎΠ² классов. Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΏΠΎΠΊΠ° ΠΆΠΈΠ² Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ классов, ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ ΠΆΠΈΠ²Ρ‹ΠΌΠΈ Π² мСтапространствС ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ освобоТдСны.

Кэш кода

Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Java Π·Π°ΠΏΡƒΡ‰Π΅Π½Π°, ΠΎΠ½Π° выполняСт ΠΊΠΎΠ΄ ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. На ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ клиСнтский компилятор (компилятор C1) для компиляции ΠΊΠΎΠ΄Π° с инструмСнтариСм. Π”Π°Π½Π½Ρ‹Π΅ профилирования ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ (компилятор C2) для компилятора сСрвСра, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΊΠΎΠ΄ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. ΠœΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Π°Ρ компиляция Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Java 7, Π½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² Java 8.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Just-In-Time (JIT) сохраняСт скомпилированный ΠΊΠΎΠ΄ Π² области, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ кСшСм ΠΊΠΎΠ΄Π°.Π­Ρ‚ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΊΡƒΡ‡Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранится скомпилированный ΠΊΠΎΠ΄. Π­Ρ‚Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ очищаСтся, Ссли Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ сборщиком мусора.

НСкоторыС ΠΈΠ· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ компилятор Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, Π±Ρ‹Π»ΠΈ Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Π² Java 8, ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² Java 7, являСтся ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° кэша ΠΊΠΎΠ΄Π° Π΄ΠΎ Ρ‚Π°ΠΊΠΎΠΉ стСпСни, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ достиг.

ΠžΠ±Π»Π°ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

Method Area являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ пространства Perm Gen ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния структуры классов (постоянных Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΈ статичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…) ΠΈ ΠΊΠΎΠ΄Π° для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ конструкторов.

ΠŸΡƒΠ» памяти

ΠŸΡƒΠ»Ρ‹ памяти ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌΠΈ памяти JVM для создания ΠΏΡƒΠ»Π° нСизмСняСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠŸΡƒΠ» памяти ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ Heap ΠΈΠ»ΠΈ Perm Gen, Π² зависимости ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ диспСтчСра памяти JVM.

ΠŸΡƒΠ» констант Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния

ΠŸΡƒΠ» констант Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния — это прСдставлСниС ΠΏΡƒΠ»Π° констант Π² классС Π²ΠΎ врСмя выполнСния для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса. Он содСрТит константы Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΈ статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса. ΠŸΡƒΠ» констант Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ области ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

Π‘Ρ‚Π΅ΠΊ памяти Java

БтСковая ΠΏΠ°ΠΌΡΡ‚ΡŒ Java ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠ°.Они содСрТат ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ значСния для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ ссылки Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΊΡƒΡ‡Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ссылаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄.

ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ памяти Java Heap

Java прСдоставляСт мноТСство ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΉ памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для установки Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² памяти ΠΈ ΠΈΡ… ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ. НСкоторыС ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΉ памяти:

.

.

ΠšΠΎΠΌΠΌΡƒΡ‚Π°Ρ‚ΠΎΡ€ VM ОписаниС ΠΊΠΎΠΌΠΌΡƒΡ‚Π°Ρ‚ΠΎΡ€Π° VM
Xms Для установки Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ ΠΏΡ€ΠΈ запускС JVM
-Xmx Для установки максимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ
-Xmn Для установки Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния, ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ пространство отводится старому поколСнию
-XX: PermGen Для установки Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° постоянной памяти поколСния
-XX: MaxPermGen Для установки максимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Perm Gen
-XX: ΠšΠΎΡΡ„Ρ„ΠΈΡ†ΠΈΠ΅Π½Ρ‚ выТиваСмости Для обСспСчСния ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ пространства Eden, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния составляСт 10 ΠΌ, Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ VM Ρ€Π°Π²Π΅Π½ –XX: SurvivorRatio = 2, Ρ‚ΠΎΠ³Π΄Π° 5 ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ для пространства Eden ΠΈ 2. По 5 ΠΌ для ΠΎΠ±ΠΎΠΈΡ… мСст для Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΡ…. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ — 8
-XX: NewRatio Для обСспСчСния ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² старого / Π½ΠΎΠ²ΠΎΠ³ΠΎ поколСния. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ — 2

Π’Π°Π±Π»ΠΈΡ†Π° 1.1

Π‘Π±ΠΎΡ€ΠΊΠ° мусора

Π‘Π±ΠΎΡ€ΠΊΠ° мусора — это процСсс освобоТдСния мСста Π² ΠΊΡƒΡ‡Π΅ для размСщСния Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Одна ΠΈΠ· Π»ΡƒΡ‡ΡˆΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Java — автоматичСская сборка мусора. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора — это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π°Ρ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, которая просматриваСт всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² памяти ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ссылаСтся какая-Π»ΠΈΠ±ΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.ВсС эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅Ρ‚ ссылок, ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ, Π° пространство освобоТдаСтся для выдСлСния Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ. Один ΠΈΠ· основных способов сборки мусора состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… этапов:

  • ΠœΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° : это ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ шаг, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ сборщик мусора опрСдСляСт, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π° ΠΊΠ°ΠΊΠΈΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ.
  • ΠžΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ : Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора удаляСт Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ освобоТдаСт свободноС пространство для выдСлСния Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ
  • Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ с ΡƒΠΏΠ»ΠΎΡ‚Π½Π΅Π½ΠΈΠ΅ΠΌ : Для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ послС удалСния Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² всС ΡƒΡ†Π΅Π»Π΅Π²ΡˆΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ вмСстС. Π­Ρ‚ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ выдСлСния памяти Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ

Mark and Sweep МодСль сборки мусора

JVM ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ модСль сборки мусора mark and sweep для выполнСния сборки мусора всСй ΠΊΡƒΡ‡ΠΈ. Π‘Π±ΠΎΡ€ΠΊΠ° мусора с ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ ΠΈ очисткой состоит ΠΈΠ· Π΄Π²ΡƒΡ… Ρ„Π°Π·: Ρ„Π°Π·Ρ‹ ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΈ Ρ„Π°Π·Ρ‹ очистки.

Π’ΠΎ врСмя Ρ„Π°Π·Ρ‹ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠΈ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, доступныС ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Java, собствСнных ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Ρ… источников, ΠΏΠΎΠΌΠ΅Ρ‡Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΆΠΈΠ²Ρ‹Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, доступныС ΠΈΠ· этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ Ρ‚. Π”.Π­Ρ‚ΠΎΡ‚ процСсс ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ всС Π΅Ρ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ мусором.

Π’ΠΎ врСмя Ρ„Π°Π·Ρ‹ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚ΠΊΠΈ ΠΊΡƒΡ‡Π° просматриваСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΆΠΈΠ²Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Π­Ρ‚ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² свободный список ΠΈ становятся доступными для размСщСния Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π’ΠΈΠΏΡ‹ сборки мусора Java

БущСствуСт ΠΏΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ² Ρ‚ΠΈΠΏΠΎΠ² сборки мусора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½Π°ΡˆΠΈΡ… прилоТСниях. Нам просто Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ JVM, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ сборки мусора для прилоТСния.

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ GC (-XX: + UseSerialGC) : ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ GC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ простой ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ mark-sweep-compact для сборки мусора ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ ΠΈ старого ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Minor ΠΈ Major GC

Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ сборщика ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅:

-XX: + UseSerialGC

ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик мусора (-XX: + UseParallelGC) : ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик мусора Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик мусора, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ N ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для сборки мусора ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния, Π³Π΄Π΅ N — количСство ядСр ЦП Π² систСмС. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° –XX: ParallelGCThreads = n JVM.Π­Ρ‚ΠΎ ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€ JVM ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² JDK 8

.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик мусора, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅:

-XX: + UseParallelGC

Π‘Ρ‚Π°Ρ€Ρ‹ΠΉ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик мусора (-XX: + UseParallelOldGC) : Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик мусора, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для сборки мусора ΠΊΠ°ΠΊ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊ ΠΈ старого поколСния

Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ OLDGC, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅:

-XX: + UseParallelOldGC

ΠšΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ сканирования ΠΌΠ΅Ρ‚ΠΎΠΊ (CMS) (-XX: + UseConcMarkSweepGC) : CMS Ρ‚Π°ΠΊΠΆΠ΅ называСтся сборщиком ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΎΠ² с Π½ΠΈΠ·ΠΊΠΎΠΉ ΠΏΠ°ΡƒΠ·ΠΎΠΉ. Он занимаСтся сборкой мусора для старого поколСния. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ CMS пытаСтся ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΡƒΠ·Ρ‹ ΠΈΠ·-Π·Π° сборки мусора, выполняя Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ сборкС мусора ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… прилоТСния. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ CMS Π½Π° ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΌ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик. Π­Ρ‚ΠΎΡ‚ сборщик мусора ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π³Π΄Π΅ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ сСбС Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°ΡƒΠ·Ρ‹. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² сборщикС CMS, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ –XX: ParallelCMSThreads = n JVM option

Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ CMS Collector ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅:

-XX: + UseConcMarkSweepGC

Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора G1 (-XX: + UseG1GC) : Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора сначала ΠΈΠ»ΠΈ G1 доступСн Π² Java 7, ΠΈ Π΅Π³ΠΎ долгосрочная Ρ†Π΅Π»ΡŒ — Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ сборщик CMS.Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ G1 — это ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ постСпСнно ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ сборщик мусора с ΠΌΠ°Π»ΠΎΠΉ ΠΏΠ°ΡƒΠ·ΠΎΠΉ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ сборщик мусора Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ сборщики, ΠΈ Π½Π΅Ρ‚ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ пространства ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ ΠΈ старого поколСния. Он Π΄Π΅Π»ΠΈΡ‚ пространство ΠΊΡƒΡ‡ΠΈ Π½Π° нСсколько областСй ΠΊΡƒΡ‡ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Когда вызываСтся сборщик мусора, ΠΎΠ½ сначала собираСт ΠΎΠ±Π»Π°ΡΡ‚ΡŒ с мСньшим объСмом ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, «сначала мусор».

Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€Π° G1 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅:

-XX: + Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ G1GC

G1 планируСтся Π² качСствС долгосрочной Π·Π°ΠΌΠ΅Π½Ρ‹ для Concurrent Mark-Sweep Collector (CMS).Бравнивая G1 с CMS, Π΅ΡΡ‚ΡŒ различия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ G1 Π»ΡƒΡ‡ΡˆΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ. Одно ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ G1 — это ΡƒΠΏΠ»ΠΎΡ‚Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€. G1 достаточно сТимаСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ использования Π΄Π΅Ρ‚Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… списков свободных мСст для распрСдСлСния, ΠΈ вмСсто этого полагаСтся Π½Π° Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ части сборщика ΠΈ Π² основном устраняСт ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, G1 ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ прСдсказуСмыС ΠΏΠ°ΡƒΠ·Ρ‹ ΠΏΡ€ΠΈ сборкС мусора, Ρ‡Π΅ΠΌ сборщик CMS, ΠΈ позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹Π΅ Ρ†Π΅Π»ΠΈ ΠΏΠ°ΡƒΠ·Ρ‹.

Π’ Java 8 сборщик G1 поставляСтся с ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, извСстной ΠΊΠ°ΠΊ String Deduplication .Он позволяСт GC ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ нСсколько экзСмпляров Π² ΠΊΡƒΡ‡Π΅, ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΈ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ массив char [], Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠΎΠΏΠΈΠΉ Π² ΠΊΡƒΡ‡Π΅. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ -XX: + UseStringDeduplication JVM Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚.

G1 — это сборщик мусора ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² JDK 9.

Π§Π΅ΠΌΠΎΠ΄Π°Π½

Π‘ΠΎΠ»Π΅Π΅ 50% ΠΊΡƒΡ‡ΠΈ Java занято ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ размСщСния ΠΈΠ»ΠΈ продвиТСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ различаСтся.

ΠΠ΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°ΡƒΠ·Ρ‹ сборки ΠΈΠ»ΠΈ уплотнСния мусора (ΠΎΡ‚ 0,5 Π΄ΠΎ 1 сСкунды)

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ использования памяти ΠΈ активности Π“Π₯

НСхватка памяти часто являСтся ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ зависания ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Java. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ влияниС сборки мусора Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° ΠΈ использованиС памяти, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Однако ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° использования памяти ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ сборки мусора нСдостаточно, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эти Π΄Π²Π° элСмСнта сами ΠΏΠΎ сСбС Π½Π΅ говорят Π½Π°ΠΌ, влияСт Π»ΠΈ сборка мусора Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° прилоТСния.Волько приостановка сборки мусора Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ влияСт Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ°, ΠΈ сборщик мусора Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ соотнСсти приостановки, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Π΅ сборкой мусора, со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° прилоТСния. Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этого, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  • ИспользованиС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡƒΠ»ΠΎΠ² памяти (Eden, Survivor ΠΈ староС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅). НСхватка памяти — главная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½ΠΎΠΉ активности сборщика мусора
  • Если ΠΎΠ±Ρ‰Π΅Π΅ использованиС памяти постоянно увСличиваСтся, нСсмотря Π½Π° сборку мусора, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти, которая Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠ΅ памяти .Π’ этом случаС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π°Π½Π°Π»ΠΈΠ· ΠΊΡƒΡ‡ΠΈ памяти
  • ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния прСдоставляСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ скорости ΠΎΡ‚Ρ‚ΠΎΠΊΠ° (ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ распрСдСлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²). Π§Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ число, Ρ‚Π΅ΠΌ большС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² размСщаСтся. Π‘ΠΎΠ»ΡŒΡˆΠΎΠ΅ количСство ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Ρ… ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° ΠΈ растущСго ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ поколСния (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ большС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ с количСством ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²)
  • Если использованиС старого поколСния сильно колСблСтся, Π½Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡΡΡŒ послС сборки мусора, Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±Π΅Π· надобности ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠ· ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния Π² староС. Π­Ρ‚ΠΎΠΌΡƒ Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹: ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ слишком ΠΌΠ°Π»ΠΎ, высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΎΡ‚Ρ‚ΠΎΠΊΠ° ΠΈΠ»ΠΈ слишком ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ памяти.
  • Высокая Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ сборщика мусора ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ сказываСтся Π½Π° использовании ЦП. Однако Ρ‚ΠΎΠ»ΡŒΠΊΠΎ приостановки (остановки событий) ΠΈΠΌΠ΅ΡŽΡ‚ прямоС влияниС Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ°. Π’ΠΎΠΏΡ€Π΅ΠΊΠΈ распространСнному мнСнию, приостановка Π½Π΅ ограничиваСтся ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΌΠΈ сборщиками мусора. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ приостановки Π² зависимости ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° прилоТСния
  • .

jstat

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° jstat ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ встроСнныС инструмСнты Π² Java HotSpot VM для прСдоставлСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠΈ рСсурсов Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.Π­Ρ‚ΠΎΡ‚ инструмСнт ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ диагностикС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈ, Π² частности, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, связанных с ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ ΠΈ сборкой мусора. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° jstat Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ запуска Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ с ΠΊΠ°ΠΊΠΈΠΌΠΈ-Π»ΠΈΠ±ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. ВстроСнныС инструмСнты Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС Java HotSpot Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π­Ρ‚Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ JDK для всСх ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° jstat ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ (VMID) для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ процСсса.

ИспользованиС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ jstat с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ gc для опрСдСлСния использования памяти ΠΊΡƒΡ‡ΠΈ JVM.

/ bin / jstat –gc

Рис 1.3

S0C ВСкущая Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π³ΠΎΡΡ мСста 0 (ΠšΠ‘)
S1C ВСкущая Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΆΠΈΠ²ΡˆΠ΅Π³ΠΎ пространства 1 (ΠšΠ‘)
S0U ИспользованиС свободного мСста 0 (ΠšΠ‘)
S1U ИспользованиС помСщСния для Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΡ… 1 (ΠšΠ‘)
EC ВСкущая Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ пространства Eden (ΠšΠ‘)
Π•Π‘ ИспользованиС пространства Eden (ΠšΠ‘)
OC ВСкущая Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ старого пространства (ΠšΠ‘)
ОУ ИспользованиС старого пространства (ΠšΠ‘)
MC Π•ΠΌΠΊΠΎΡΡ‚ΡŒ Metasapce (ΠšΠ‘)
MU ИспользованиС Metaspace (ΠšΠ‘)
CCSC Π•ΠΌΠΊΠΎΡΡ‚ΡŒ сТатого класса (ΠšΠ‘)
CCSU Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ сТатоС пространство классов (ΠšΠ‘)
YGC ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ событий сборки мусора ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния
YGCT ВрСмя сборки мусора ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния
FGC ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ событий ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ GC
FGCT ВрСмя ΠΏΠΎΠ»Π½ΠΎΠΉ сборки мусора
GCT ΠžΠ±Ρ‰Π΅Π΅ врСмя сборки мусора

Π’Π°Π±Π»ΠΈΡ†Π° 1. 2

jmap

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° jmap Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ статистику, ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, для Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Π° ядра. JDK 8 прСдставил Java Mission Control, Java Flight Recorder ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ jcmd для диагностики ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с JVM ΠΈ прилоТСниями Java. РСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ jcmd вмСсто ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ jmap для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΉ диагностики ΠΈ сниТСния Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ –heap ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для получСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΊΡƒΡ‡Π΅ Java:

  • Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ, относящаяся ΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ GC, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ имя Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° GC (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ GC) ΠΈ Π΄Π΅Ρ‚Π°Π»ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ GC).
  • ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΊΡƒΡ‡ΠΈ, которая ΠΌΠΎΠ³Π»Π° Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π° ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈΠ»ΠΈ Π²Ρ‹Π±Ρ€Π°Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машиной Π² зависимости ΠΎΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΠ°ΡˆΠΈΠ½Ρ‹.
  • Π‘Π²ΠΎΠ΄ΠΊΠ° ΠΏΠΎ использованию ΠΊΡƒΡ‡ΠΈ: для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ поколСния (ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ) срСдство Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΠ±Ρ‰ΡƒΡŽ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Если ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΊΠ°ΠΊ Π½Π°Π±ΠΎΡ€ пространств (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅), Ρ‚ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ сводка ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ памяти для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ пространства.

/ bin / jmap –heap

Рис 1.4

смд

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° jcmd ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ запросов диагностичСских ΠΊΠΎΠΌΠ°Π½Π΄ Π² JVM, Π³Π΄Π΅ эти запросы ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ для управлСния записями ΠΏΠΎΠ»Π΅Ρ‚Π° Java, устранСния Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ ΠΈ диагностики ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ JVM ΠΈ Java. Он Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Java, ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ эффСктивныС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ использовались для запуска JVM.

Π”Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ (Π΄Π°ΠΌΠΏ hprof) ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

jcmd GC.heap_dump имя_Ρ„Π°ΠΉΠ»Π° =

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° использованию

jmap –dump: file =

Но рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ jcmd .

Π΄ΠΆΠ°Ρ‚

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ jhat прСдоставляСт ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ срСдства для просмотра Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΌ снимкС ΠΊΡƒΡ‡ΠΈ. Π­Ρ‚ΠΎΡ‚ инструмСнт замСняСт инструмСнт Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΡƒΡ‡ΠΈ (HAT). Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ, созданный jcmd ).Π­Ρ‚Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ . Π­Ρ‚ΠΎΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для описания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½, Π½ΠΎ остаСтся Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ благодаря ссылкам Ρ‡Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΈΠ· ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π°. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли нСпрСднамСрСнная статичСская ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ остаСтся послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½, Ссли Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΎΡ‚ своСго ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½, ΠΈΠ»ΠΈ Ссли ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½.НСпрСднамСрСнноС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ — это эквивалСнт ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти Π² языкС Java.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ jhat с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

jhat

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° считываСт Ρ„Π°ΠΉΠ» . hprof ΠΈ запускаСт сСрвСр Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ 7000.

Рис 1.5

Когда ΠΌΡ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ сСрвСру ΠΏΠΎ http: // localhost: 7000, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ стандартный запрос ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ язык ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… запросов (OQL). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ отобраТаСтся запрос «Π’сС классы».На этой страницС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ всС классы, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² ΠΊΡƒΡ‡Π΅, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ классов ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹. Π­Ρ‚ΠΎΡ‚ список отсортирован ΠΏΠΎ ΠΏΠΎΠ»Π½ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ класса ΠΈ Ρ€Π°Π·Π±ΠΈΡ‚ ΠΏΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌ. Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ имя класса, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ запросу класса. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ этого запроса Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ классы ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹. ΠšΠ»Π°ΡΡΡ‹ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ классы, ΠΏΠΎΠ»Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с Ρ‚Π°ΠΊΠΈΡ… прСфиксов, ΠΊΠ°ΠΊ java, sun ΠΈΠ»ΠΈ javax.swing. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, запрос класса ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ классС. Бюда входят Π΅Π³ΠΎ супСркласс, Π»ΡŽΠ±Ρ‹Π΅ подклассы, Ρ‡Π»Π΅Π½Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… экзСмпляра ΠΈ Ρ‡Π»Π΅Π½Ρ‹ статичСских Π΄Π°Π½Π½Ρ‹Ρ….На этой страницС Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΈΠ· классов, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ ссылки, ΠΈΠ»ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ запросу экзСмпляра. Запрос экзСмпляра ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ всС экзСмпляры Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса.

HPROF

HPROF — это инструмСнт для профилирования ΠΊΡƒΡ‡ΠΈ ΠΈ ЦП, поставляСмый с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ выпуском JDK. Π­Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° с динамичСской ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΎΠΉ (DLL), которая взаимодСйствуСт с JVM с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ интСрфСйса Java Virtual Machine Tool (JVMTI). Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ записываСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ профилирования Π»ΠΈΠ±ΠΎ Π² Ρ„Π°ΠΉΠ», Π»ΠΈΠ±ΠΎ Π² сокСт Π² ASCII ΠΈΠ»ΠΈ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅.Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ HPROF ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ использованиС ЦП, статистику распрСдСлСния ΠΊΡƒΡ‡ΠΈ ΠΈ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΠΈ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎ ΠΏΠΎΠ»Π½Ρ‹Ρ… Π΄Π°ΠΌΠΏΠ°Ρ… ΠΊΡƒΡ‡ΠΈ ΠΈ состояниях всСх ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠ² ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС Java (JVM). Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния диагностики ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ HPROF ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ инструмСнт HPROF, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ:

java –agentlib: hprof ToBeProfiledClass

java –agentlib: hprof = heap = sites ToBeProfiledClass

Π’ зависимости ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ профилирования HPROF инструктируСт JVM ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ событиям. Π—Π°Ρ‚Π΅ΠΌ инструмСнт ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ событиях Π² ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ информация ΠΎ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΡƒΡ‡ΠΈ записываСтся Π² Ρ„Π°ΠΉΠ» java.hprof.txt (Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ASCII) Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°

javac –J-agentlib: hprof = heap = sites Hello.java

ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для получСния профиля распрСдСлСния ΠΊΡƒΡ‡ΠΈ. Π’Π°ΠΆΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ ΠΊΡƒΡ‡ΠΈ являСтся объСм распрСдСлСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ происходит Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… частях ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ heap = dump .Π’Ρ‹Ρ…ΠΎΠ΄

javac –J-agentlib: hprof = heap = dump Hello.java

состоит ΠΈΠ· ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ сборщиком мусора, ΠΈ записи для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Java Π² ΠΊΡƒΡ‡Π΅, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΈΠ· ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π°.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ HPROF ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± использовании ЦП ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Для получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² профиля Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ использования ЦП ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

javac –J-agentlib: hprof = cpu = samples Hello. java

АгСнт HPROF пСриодичСски провСряСт стСк всСх Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для записи Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ частых Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… трассировок стСка.

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ инструмСнты, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ VisualVM, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Π½Π°ΠΌ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± использовании памяти, сборках мусора, Π΄Π°ΠΌΠΏΠ°Ρ… ΠΊΡƒΡ‡ΠΈ, ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ЦП ΠΈ памяти ΠΈ Ρ‚. Π”. Π’ Ρ„ΠΎΡ€ΠΌΠ΅ графичСского интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

VisualVM

VisualVM — это инструмСнт, созданный Π½Π° основС ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ NetBeans, Π° Π΅Π³ΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° являСтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. VisualVM позволяСт Π½Π°ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ прилоТСниях Java, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° JVM, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ локальная ΠΈΠ»ΠΈ удалСнная систСма.Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструмСнтов Java Development Kit (JDK), Π° всС Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… прилоТСниях Java ΠΌΠΎΠΆΠ½ΠΎ быстро ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ для Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΈ для ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ обСспСчСнии JVM Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Java ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² локальной систСмС. VisualVM ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ ЦП, Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ памяти, Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сборку мусора, Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ошибки ΠΊΡƒΡ‡ΠΈ, Π΄Π΅Π»Π°Ρ‚ΡŒ снимки ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚ΠΎΠ² JMX

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΡ€Ρ‚Ρ‹ JMX, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ систСмныС свойства ΠΏΡ€ΠΈ запускС прилоТСния Java:

  • -Π”ΠΊΠΎΠΌ.sun.management.jmxremote
  • -Dcom.sun.management.jmxremote.port = <ΠŸΠΎΡ€Ρ‚>
  • -Dcom.sun.management.jmxremote.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ VisualVM для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ машинС ΠΈ просмотра Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ЦП, Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ памяти, ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ Ρ‚. Π”. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°ΠΌΠΏΡ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ Π΄Π°ΠΌΠΏΡ‹ памяти Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ машинС ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ JMX.

На рис. 1.6 ΠΏΠΎΠΊΠ°Π·Π°Π½ список ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… систСмах. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ систСмС, Ρ‰Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ Β«Π£Π΄Π°Π»Π΅Π½Π½Ρ‹ΠΉΒ» ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ имя хоста, Π° Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ настройки» ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΏΠΎΡ€Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ использовался ΠΏΡ€ΠΈ запускС прилоТСния Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅. Когда Π² локальном ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ пСрСчислСны прилоТСния, Π΄Π²Π°ΠΆΠ΄Ρ‹ Ρ‰Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ свСдСния ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

Рис 1,6

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ с ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΌΠΈ свСдСниями ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ: ΠžΠ±Π·ΠΎΡ€, ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€, ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΠΈ БэмплСр.

Π’ΠΊΠ»Π°Π΄ΠΊΠ° Overview содСрТит ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Основной класс, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ JVM, PID, систСмныС свойства ΠΈ Π»ΡŽΠ±Ρ‹Π΅ сохранСнныС Π΄Π°Π½Π½Ρ‹Π΅, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π΄Π°ΠΌΠΏΡ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ»ΠΈ Π΄Π°ΠΌΠΏΡ‹ ΠΊΡƒΡ‡ΠΈ, доступны Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ ΠΎΠ±Π·ΠΎΡ€Π°.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Π°Ρ Π²ΠΊΠ»Π°Π΄ΠΊΠ° — это Π²ΠΊΠ»Π°Π΄ΠΊΠ° ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ . На этой Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ отобраТаСтся использованиС ЦП ΠΈ памяти ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π’ этом прСдставлСнии Π΅ΡΡ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠ°.

Рис 1,7

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ использованиС ЦП ΠΈ ЦП сборщика мусора. Ось X ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² зависимости ΠΎΡ‚ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π° использования.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊ Π² ΠΏΡ€Π°Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ пространство ΠΊΡƒΡ‡ΠΈ ΠΈ пространство Perm Gen ΠΈΠ»ΠΈ Metaspace. Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ памяти, сколько ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ сколько доступно для использования.Π­Ρ‚ΠΎΡ‚ Π³Ρ€Π°Ρ„ΠΈΠΊ особСнно ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ошибки java.lang.OutOfMemoryError: пространства ΠΊΡƒΡ‡ΠΈ Java. Когда ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ выполняСт Π·Π°Π΄Π°Π½ΠΈΠ΅ с интСнсивным использованиСм памяти, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ ΠΊΡƒΡ‡Π° (обозначСнная синим Ρ†Π²Π΅Ρ‚ΠΎΠΌ Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅) всСгда Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ мСньшС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ (прСдставлСнной ΠΎΡ€Π°Π½ΠΆΠ΅Π²Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅). Когда Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΊΡƒΡ‡ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ, ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π² систСмС большС Π½Π΅Ρ‚ мСста для выдСлСния / Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ, Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ ΠΊΡƒΡ‡Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ошибки ΠΊΡƒΡ‡ΠΈ.Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΡƒΡ‡Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, взяв Β«Π”Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈΒ». ΠŸΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибки Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹:

-XX: + HeapDumpOnOutOfMemoryError –XX: HeapDumpPath = [ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ]

Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» . hprof ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ.

Рис 1.8

На рис. 1.8 ΠΏΠΎΠΊΠ°Π·Π°Π½ Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. На Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ сводки отобраТаСтся нСкоторая основная информация, такая ΠΊΠ°ΠΊ ΠΎΠ±Ρ‰Π΅Π΅ количСство классов, ΠΎΠ±Ρ‰Π΅Π΅ количСство экзСмпляров, Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΈ классов, ΠΊΠΎΡ€Π½ΠΈ сборки мусора ΠΈ свСдСния ΠΎ срСдС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ выполняСтся ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.Анализ Π½Π° рис. 1.8 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ΡΡ большС всСго ΠΈ Π³Π΄Π΅ это распрСдСлСниС происходит. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ мноТСство Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² своСм конструкторС ΠΈΠ»ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅ΠΉ. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ области ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΊΠ°ΠΊ извСстно, Π² производствСнных условиях Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. Под Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ эти мСста Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ большС, Π½ΠΎ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Ρ‚ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² самом ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. ВысокоС использованиС памяти являСтся ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ сбора мусора.Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Π΅ ограничСния Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ просто ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ JVM. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ Π½Π΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ использованиС просто ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ расти. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Ρ‹ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ с использованиСм Π΄Π°ΠΌΠΏΠΎΠ² ΠΊΡƒΡ‡ΠΈ для выявлСния ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти ΠΈ выявлСния ΠΏΠΎΠΆΠΈΡ€Π°Ρ‚Π΅Π»Π΅ΠΉ памяти.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½, Π½ΠΎ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΌΡ‹ заботимся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ± ΡƒΡ‚Π΅Ρ‡ΠΊΠ°Ρ… памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ растут ΠΈΠ»ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ памяти.Випичная ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти — это ΡƒΡ‚Π΅Ρ‡ΠΊΠ°, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° создаСтся ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ, Π½ΠΎ Π½Π΅ выполняСтся сборщиком мусора. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ нСсколько Π΄Π°ΠΌΠΏΠΎΠ² ΠΊΡƒΡ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π°ΠΌΠΏΠΎΠ² Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΉ. КаТдоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Java ΠΈΠΌΠ΅Π΅Ρ‚ большоС количСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² String, , char [], ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… стандартных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Java. ЀактичСски, String ΠΈ char [] ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ наибольшСС количСство экзСмпляров, Π½ΠΎ ΠΈΡ… Π°Π½Π°Π»ΠΈΠ· Π½ΠΈ ΠΊ Ρ‡Π΅ΠΌΡƒ Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚. Π”Π°ΠΆΠ΅ Ссли Π±Ρ‹ Ρƒ нас происходила ΡƒΡ‚Π΅Ρ‡ΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² String, скорСС всСго, это Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π° Π½ΠΈΡ… ссылаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, сосрСдоточСниС внимания Π½Π° классах нашСго прилоТСния даст Π±ΠΎΠ»Π΅Π΅ быстрыС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

Π•ΡΡ‚ΡŒ нСсколько случаСв, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ провСсти Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ·.

  • Анализ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΉ Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π» ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅ памяти
  • НашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ памяти, Π½ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ явной ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти, ΠΈ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄
  • ΠœΡ‹ Π½Π΅ смогли провСсти Π°Π½Π°Π»ΠΈΠ· Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΉ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ растСт слишком быстро ΠΈ JVM Π΄Π°Π΅Ρ‚ сбой

Π’ΠΎ всСх Ρ‚Ρ€Π΅Ρ… случаях основной ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ, скорСС всСго, являСтся ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находятся Π² ΠΊΠΎΡ€Π½Π΅ большСго Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².Π­Ρ‚ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ сборку мусора для мноТСства Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π΄Π΅Ρ€Π΅Π²Π΅. Π’ случаС ошибки Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти Π²ΠΏΠΎΠ»Π½Π΅ вСроятно, Ρ‡Ρ‚ΠΎ горстка ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² прСпятствуСт освобоТдСнию большого количСства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‚Π΅ΠΌ самым вызывая ΠΎΡˆΠΈΠ±ΠΊΡƒ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти. Π Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ часто являСтся большой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ для Π°Π½Π°Π»ΠΈΠ·Π° памяти. Для создания Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ трСбуСтся сама ΠΏΠ°ΠΌΡΡ‚ΡŒ. Если Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ находится Π½Π° ΠΏΡ€Π΅Π΄Π΅Π»Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ доступно ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ (32-разрядныС JVM Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ 3,5 Π“Π‘), Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Java (JVM) ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ приостановит Ρ€Π°Π±ΠΎΡ‚Ρƒ JVM. Быстрый поиск ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сборку мусора Ρ†Π΅Π»ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², прСвращаСтся Π² ΠΏΡ€Π΅ΡΠ»ΠΎΠ²ΡƒΡ‚ΡƒΡŽ ΠΈΠ³ΠΎΠ»ΠΊΡƒ Π² стогС сСна.

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Ρ‚Π°ΠΊΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ Dynatrace, ΠΌΠΎΠ³ΡƒΡ‚ автоматичСски ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Для этого Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π΄ΠΎΠΌΠΈΠ½Π°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ исходит ΠΈΠ· Ρ‚Π΅ΠΎΡ€ΠΈΠΈ Π³Ρ€Π°Ρ„ΠΎΠ². Π­Ρ‚ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΌΠ΅Ρ‚ΡŒ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΊΠΎΡ€Π΅Π½ΡŒ Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Помимо вычислСния ΠΊΠΎΡ€Π½Π΅ΠΉ Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², инструмСнт Π°Π½Π°Π»ΠΈΠ·Π° памяти вычисляСт, сколько памяти Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ.Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ освобоТдСниС большого объСма памяти — Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Π² памяти.

Рис 1.9

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ доступным Π³Ρ€Π°Ρ„ΠΈΠΊΠ°ΠΌ (рис. 1.7) для прилоТСния Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Β«ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€Β», ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊ классов, располоТСнный Π² Π½ΠΈΠΆΠ½Π΅ΠΌ Π»Π΅Π²ΠΎΠΌ ΡƒΠ³Π»Ρƒ. На этом Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ отобраТаСтся ΠΎΠ±Ρ‰Π΅Π΅ количСство классов, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π° Π½Π° послСднСм Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ отобраТаСтся количСство Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этих Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π»ΠΈ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ слишком ΠΌΠ½ΠΎΠ³ΠΎ рСсурсов процСссора ΠΈΠ»ΠΈ памяти.

Π’Ρ€Π΅Ρ‚ΡŒΡ Π²ΠΊΠ»Π°Π΄ΠΊΠ° — это Π²ΠΊΠ»Π°Π΄ΠΊΠ° Threads .

Рис. 1.10

На Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ прилоТСния ΠΌΠ΅Π½ΡΡŽΡ‚ состояниС ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‚ΡΡ. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ врСмя, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ состоянии, ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ ΠΈΠ»ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. Если Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π΄Π°ΠΌΠΏ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ½ΠΎΠΏΠΊΠΈ Β«Π”Π°ΠΌΠΏ ΠΏΠΎΡ‚ΠΎΠΊΠ°Β» Π²Π²Π΅Ρ€Ρ…Ρƒ.

ЧСтвСртая Π²ΠΊΠ»Π°Π΄ΠΊΠ° — это Π²ΠΊΠ»Π°Π΄ΠΊΠ° Sampler .Когда ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ эту Π²ΠΊΠ»Π°Π΄ΠΊΡƒ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ, ΠΎΠ½Π° Π½Π΅ содСрТит Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΈΠ΄ΠΎΠ² Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ / профилирования. НачнСм с Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ процСссора. ПослС наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ Β«CPUΒ» Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ CPU ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

Рис. 1.11

Из рис. 1.11 Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ doRun () Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 54,8% процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ getNextEvent () ΠΈ readAvailableBlocking () — это Π΄Π²Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡŽΡ‚ большС процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Π²Ρ‹Π±ΠΎΡ€ΠΊΠ° — это Π²Ρ‹Π±ΠΎΡ€ΠΊΠ° ΠΈΠ· памяти. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½ΠΎ Π²ΠΎ врСмя Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π΄ΠΎ получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Из рис. 1.12 ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ массивы Object , int, ΠΈ char .

Π’ ΠΎΠ±ΠΎΠΈΡ… Ρ‚ΠΈΠΏΠ°Ρ… Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ для дальнСйшСго использования Π² Ρ„Π°ΠΉΠ». НапримСр, ΠΎΠ±Ρ€Π°Π·Ρ†Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ€Π°Ρ‚ΡŒ нСсколько Ρ€Π°Π· Ρ‡Π΅Ρ€Π΅Π· Ρ€Π°Π²Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ мСньшС ЦП ΠΈ памяти.НаконСц, Π·Π°Π΄Π°Ρ‡Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° — ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ эти области ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΊΠΎΠ΄.

Настройка сборки мусора Java

Настройка сборки мусора Java Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ послСдним Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ для увСличСния пропускной способности прилоТСния, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ·-Π·Π° Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ GC, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρ‹ прилоТСния.

Если ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ java.lang.OutOfMemoryError: PermGen space , ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ пространство памяти Perm Gen, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ JVM –XX: PermGen ΠΈ –XX: MaxPermGen .ΠœΡ‹ Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌ этой ошибки Π² случаС Java 8 ΠΈ Π²Ρ‹ΡˆΠ΅. Если ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΏΠΎΠ»Π½Ρ‹ΠΌ сборщиком мусора, Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ объСм памяти старого поколСния. Π’ Ρ†Π΅Π»ΠΎΠΌ настройка сборки мусора Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ усилий ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΈ для этого Π½Π΅Ρ‚ ТСсткого ΠΏΡ€Π°Π²ΠΈΠ»Π°. Нам Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΈ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π»ΡƒΡ‡ΡˆΠΈΠΉ, подходящий для нашСго прилоТСния.

НСкоторыС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:

  • ΠžΡ‚Π±ΠΎΡ€ ΠΏΡ€ΠΎΠ± / ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния
  • Настройка сСрвСра ΠΈ JVM
  • ΠŸΡ€Π°Π²ΠΎΠ΅ ΠΆΠ΅Π»Π΅Π·ΠΎ ΠΈ ОБ
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π² соотвСтствии с ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ прилоТСния ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ (Π»Π΅Π³Ρ‡Π΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ!)
  • ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ использованиС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Java (с ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ JVM)
  • -XX: + UseParallelGC, Ссли Π΅ΡΡ‚ΡŒ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Ρ‹

Π•Ρ‰Π΅ нСсколько ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… совСтов, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ:

  • Если Ρƒ нас Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°ΡƒΠ·Π°ΠΌΠΈ, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ JVM
  • ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС памяти

  • Установка для –Xms ΠΈ –Xmx ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ значСния
  • ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΠΉΡ‚Π΅ объСм памяти ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ увСличСния количСства процСссоров, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ выдСлСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ распараллСлСны
  • НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Perm Gen
  • ΠœΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ использованиС синхронизаций
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, Ссли это приносит ΠΏΠΎΠ»ΡŒΠ·Ρƒ, ΠΈ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΎ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходах ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Π² Ρ€Π°Π·Π½Ρ‹Ρ… срСдах.
  • Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π±Π»ΠΈΠ·ΠΊΠΎ ΠΊ мСсту фактичСского использования. Π­Ρ‚ΠΎ основная концСпция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ склонны ΡƒΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈΠ· Π²ΠΈΠ΄Ρƒ.
  • JSP

  • ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ сСрвлСтов
  • StringBuilder вмСсто строкового concat
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ ΠΈ ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². (Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ вмСсто Long)
  • По возмоТности ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈ ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ создания Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²
  • equals () стоит Π΄ΠΎΡ€ΠΎΠ³ΠΎ, Ссли ΠΌΡ‹ провСряСм ΠΏΡƒΡΡ‚ΡƒΡŽ строку.ВмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ свойство Π΄Π»ΠΈΠ½Ρ‹.
  • Β«==Β» быстрСС, Ρ‡Π΅ΠΌ equals ()
  • n + = 5 быстрСС, Ρ‡Π΅ΠΌ n = n + 5. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС гСнСрируСтся мСньшС Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠ΄ΠΎΠ²
  • ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π΅ΡΠΊΠΈ ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒ сСансы Π³ΠΈΠ±Π΅Ρ€Π½Π°Ρ†ΠΈΠΈ
  • Π’Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ массовыС обновлСния ΠΈ удалСния

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² для GC

Π–ΡƒΡ€Π½Π°Π» сборщика мусора ΠΈΠ»ΠΈ gc.log — это тСкстовый Ρ„Π°ΠΉΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранятся всС события очистки памяти JVM: MinorGC, MajorGC e FullGC.

ЗапуститС JVM с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ Π½ΠΈΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ gc.ΠΆΡƒΡ€Π½Π°Π»:

Π΄ΠΎ Π―Π²Ρ‹ 8

XX: + PrintGCDetails -Xloggc: /app/tmp/myapp-gc.log

с Π―Π²Ρ‹ 9

Xlog: gc *: file = / app / tmp / myapp-gc.log

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html

https://en.wikipedia.org/wiki/Java_virtual_machine

https://www.javatpoint.com/internal-details-of-jvm

https: // dzone.ru / article / java-performance-tuning

http://www.journaldev.com/2856/java-jvm-memory-model-memory-management-in-java

https://www.yourkit.com/docs/kb/sizes.jsp

https://www.infoq.com/articles/Java-PERMGEN-Removed

http://blog.andresteingress.com/2016/10/19/java-codecache

https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/toc.html

https://javaperformance.wordpress. com/2017/02/05/java-heap-memory-usage-using-jmap-and-jstat-command/

ΠœΡ‹ надССмся, Ρ‡Ρ‚ΠΎ эта ΡΡ‚Π°Ρ‚ΡŒΡ (Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Java для Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Java) оказалась ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ.Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, сообщитС Π½Π°ΠΌ ΠΎΠ± этом Π² коммСнтариях Π½ΠΈΠΆΠ΅!

ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с нашим Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π±Π»ΠΎΠ³ΠΎΠΌ: DevOps с использованиСм Jenkins, Docker ΠΈ Kubernetes, Начало Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Sikuli для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ тСстирования, Автоматизация, связанная с DevOps, ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ здСсь.

Π­Ρ‚Ρƒ ΡΡ‚Π°Ρ‚ΡŒΡŽ написали Акшай А. ΠΈ АбхидТит Аркалгуд.

БвязанныС

Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ JVM, JRE ΠΈ JDK

Если Ρƒ вас Π΅ΡΡ‚ΡŒ нСсколько Π»Π΅Ρ‚ ΠΎΠΏΡ‹Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² экосистСмС Java, ΠΈ Π²Ρ‹ заинтСрСсованы Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ этим ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ с сообщСством (ΠΈ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ дСньги Π·Π° свою Ρ€Π°Π±ΠΎΡ‚Ρƒ), посмотритС Π½Π° страницу Β«ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ для нас».Π’Π°ΡˆΠ΅ Π·Π΄ΠΎΡ€ΠΎΠ²ΡŒΠ΅. Π•Π²Π³Π΅Π½ΠΈΠΉ

1. ΠžΠ±Π·ΠΎΡ€

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ обсудим различия ΠΌΠ΅ΠΆΠ΄Ρƒ JVM, JRE ΠΈ JDK, рассмотрСв ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈ способы использования.

2. JVM

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Java (JVM) — это рСализация Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, которая выполняСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Java.

JVM сначала ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ сохраняСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ классС Π² области памяти. НаконСц, ΠΎΠ½ выполняСт Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, сгСнСрированный компилятором java.

Π­Ρ‚ΠΎ абстрактная Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ машина со своим собствСнным Π½Π°Π±ΠΎΡ€ΠΎΠΌ инструкций, которая управляСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ областями памяти Π²ΠΎ врСмя выполнСния.

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ JVM:

  • ΠŸΠΎΠ³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΈ класса
  • ΠžΠ±Π»Π°ΡΡ‚ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния
  • Execution Engine

2.1. ΠŸΠΎΠ³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΈ класса

ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ JVM Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΈ связываниС Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°. Π—Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΈ классов ΡΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ с этими Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ.

Π£ нас Π΅ΡΡ‚ΡŒ подробная ΡΡ‚Π°Ρ‚ΡŒΡ, посвящСнная Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°ΠΌ классов.

2.2. ΠžΠ±Π»Π°ΡΡ‚ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния

JVM опрСдСляСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ области памяти для выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Java. Они ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²ΠΎ врСмя выполнСния ΠΈ извСстны ΠΊΠ°ΠΊ области Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния. НСкоторыС ΠΈΠ· этих областСй ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ запускС JVM ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· JVM, Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ создании ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Рассмотрим эти области ΠΏΠΎ порядку:

ΠžΠ±Π»Π°ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

По сути, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° области хранСния скомпилированного ΠΊΠΎΠ΄Π°.Π’ Π½Π΅ΠΌ хранятся Ρ‚Π°ΠΊΠΈΠ΅ структуры, ΠΊΠ°ΠΊ ΠΏΡƒΠ» констант Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»Π΅ΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ конструкторов, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° классов. JVM Ρ…Ρ€Π°Π½ΠΈΡ‚ эту структуру для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса.

ΠžΠ±Π»Π°ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‚Π°ΠΊΠΆΠ΅ извСстная ΠΊΠ°ΠΊ постоянноС пространство Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ (PermGen), создаСтся ΠΏΡ€ΠΈ запускС JVM. ΠŸΠ°ΠΌΡΡ‚ΡŒ для этой области Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΉ. ВсС ΠΏΠΎΡ‚ΠΎΠΊΠΈ JVM совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ эту ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти.

ΠžΠ±Π»Π°ΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ

JVM выдСляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ для всСх экзСмпляров классов ΠΈ массивов ΠΈΠ· этой области.

Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора (GC) освобоТдаСт Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². По сути, сборщик мусора ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρ€ΠΈ Ρ„Π°Π·Ρ‹ для освобоТдСния памяти ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π° ΠΈΠΌΠ΅Π½Π½ΠΎ. Π΄Π²Π° второстСпСнных сборщика мусора ΠΈ ΠΎΠ΄ΠΈΠ½ основной сборщик мусора.

ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… частСй:

  • Eden Space — это Ρ‡Π°ΡΡ‚ΡŒ пространства Young Generation. Когда ΠΌΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, JVM выдСляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠ· этого пространства
  • Survivor Space — это Ρ‚ΠΎΠΆΠ΅ Ρ‡Π°ΡΡ‚ΡŒ пространства Young Generation. ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ Π²Ρ‹ΠΆΠΈΠ²ΡˆΠ΅Π³ΠΎ содСрТит ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ»ΠΈ второстСпСнныС Ρ„Π°Π·Ρ‹ GC GC
  • .

  • Π°Ρ€Π΅Π½Π΄ΡƒΠ΅ΠΌΠΎΠ΅ пространство — это Ρ‚Π°ΠΊΠΆΠ΅ извСстно ΠΊΠ°ΠΊ пространство старого поколСния.Π’ Π½Π΅ΠΌ хранятся Π΄Π°Π²Π½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ²ΡˆΠΈΠ΅ΡΡ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρ‹ Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Young Generation устанавливаСтся ΠΏΠΎΡ€ΠΎΠ³, ΠΈ ΠΊΠΎΠ³Π΄Π° этот ΠΏΠΎΡ€ΠΎΠ³ достигаСтся, эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² постоянноС пространство.

JVM создаСт ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ ΠΏΡ€ΠΈ запускС. ВсС ΠΏΠΎΡ‚ΠΎΠΊΠΈ JVM Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ эту ΠΎΠ±Π»Π°ΡΡ‚ΡŒ. ΠŸΠ°ΠΌΡΡ‚ΡŒ для области ΠΊΡƒΡ‡ΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΉ.

ΠŸΠ»ΠΎΡ‰Π°Π΄ΡŒ стСка

Π₯Ρ€Π°Π½ΠΈΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅ Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ², ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ„Ρ€Π΅ΠΉΠΌΠ΅ хранятся Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, частичныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².JVM создаСт ΠΎΠ±Π»Π°ΡΡ‚ΡŒ стСка всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° создаСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Π­Ρ‚Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ являСтся частной для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

КаТдая запись Π² стСкС называСтся ΠΊΠ°Π΄Ρ€ΠΎΠΌ стСка ΠΈΠ»ΠΈ записью Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌ состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… частСй:

  • Массив Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… — содСрТит всС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°
  • Π‘Ρ‚Π΅ΠΊ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² — ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ рабочая ΠΎΠ±Π»Π°ΡΡ‚ΡŒ для хранСния ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² вычислСний
  • Π”Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π΄Ρ€Π° — ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для хранСния частичных Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ ссылки Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Exception , которая прСдоставляСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π±Π»ΠΎΠΊΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° Π² случаС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

ΠŸΠ°ΠΌΡΡ‚ΡŒ для стСка JVM Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΉ.

РСгистры ПК

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ JVM ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ рСгистр ПК, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранится адрСс выполняСмой Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ инструкции. Если тСкущая выполняСмая инструкция являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ собствСнного ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‚ΠΎΠ³Π΄Π° это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ.

Π‘Ρ‚Π΅ΠΊΠΈ собствСнных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²

БобствСнныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ — это ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, написанныС Π½Π° языках, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΡ‚ Java.

JVM прСдоставляСт возмоТности для Π²Ρ‹Π·ΠΎΠ²Π° этих собствСнных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π‘Ρ‚Π΅ΠΊΠΈ собствСнных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ извСстны ΠΊΠ°ΠΊ «стСки CΒ».Они хранят ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ собствСнном ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅. Когда собствСнныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹, ΠΎΠ½ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ стСк собствСнных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для отслСТивания своСго состояния.

JVM создаСт эти стСки всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° создаСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎΡ‚ΠΎΠΊΠΈ JVM Π½Π΅ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ эту ΠΎΠ±Π»Π°ΡΡ‚ΡŒ.

2.3. Π”Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ исполнСния

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ выполнСния выполняСт инструкции, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΈΠΌΠ΅ΡŽΡ‰ΡƒΡŽΡΡ Π² областях памяти. Он состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… частСй:

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊ

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΈ классов Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ выполняСт Π΅Π³ΠΎ построчно. Π­Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ довольно ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ΅. НСдостатком ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся нСсколько Ρ€Π°Π·, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· трСбуСтся новая интСрпрСтация.

Однако JVM ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ JIT-компилятор для смягчСния этого нСдостатка.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Just-In-Time (JIT)

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€

JIT ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ часто Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π²ΠΎ врСмя выполнСния. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ½ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Java.

JVM автоматичСски отслСТиваСт, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ.Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ становится ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΌ для JIT-компиляции, ΠΎΠ½ планируСтся для компиляции Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ извСстСн ΠΊΠ°ΠΊ горячий ΠΌΠ΅Ρ‚ΠΎΠ΄. Π­Ρ‚Π° компиляция Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ происходит Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ JVM.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΎΠ½ Π½Π΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ПослС компиляции Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстрСС.

Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора

Java заботится ΠΎΠ± ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сборки мусора. Π­Ρ‚ΠΎ процСсс просмотра памяти ΠΊΡƒΡ‡ΠΈ, опрСдСлСния Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π° ΠΊΠ°ΠΊΠΈΠ΅ Π½Π΅Ρ‚, ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, удалСния Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

GC — это ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π΅ΠΌΠΎΠ½Π°. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ явно с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмы . gc () , ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΈ JVM Ρ€Π΅ΡˆΠΈΡ‚, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ сборщик мусора.

2.4. БобствСнный интСрфСйс Java

Он дСйствуСт ΠΊΠ°ΠΊ интСрфСйс ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠ΄ΠΎΠΌ Java ΠΈ собствСнными (C / C ++) Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ.

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ситуации, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сама ΠΏΠΎ сСбС Java Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ потрСбностям вашСго прилоТСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, рСализация ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎ-зависимой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ этих случаях ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ JNI, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ Π² JVM. И Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, ΠΎΠ½ позволяСт собствСнным ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, выполняСмый Π² JVM.

2,5. БобствСнныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

Π­Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ собствСнных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

3. JRE

Π‘Ρ€Π΅Π΄Π° выполнСния Java (JRE) — это Π½Π°Π±ΠΎΡ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для запуска ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Java.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ JRE Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚:

  • РСализация Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Java (JVM)
  • ΠšΠ»Π°ΡΡΡ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Java
  • Π€Π°ΠΉΠ»Ρ‹ свойств

ΠœΡ‹ обсуТдали JVM Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ сосрСдоточимся Π½Π° основных классах ΠΈ Ρ„Π°ΠΉΠ»Π°Ρ… ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ.

3.1. ΠšΠ»Π°ΡΡΡ‹ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ

ΠœΡ‹ Π½Π°ΠΉΠ΄Π΅ΠΌ классы Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² jre / lib / . Π­Ρ‚ΠΎΡ‚ ΠΏΡƒΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ извСстСн ΠΊΠ°ΠΊ ΠΏΡƒΡ‚ΡŒ ΠΊ классам Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚:

  • ΠšΠ»Π°ΡΡΡ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π² rt.jar
  • ΠšΠ»Π°ΡΡΡ‹ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² i18n.jar
  • ΠšΠ»Π°ΡΡΡ‹ прСобразования символов Π² charsets.jar
  • ΠŸΡ€ΠΎΡ‡ΠΈΠ΅

Bootstrap ClassLoader Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ эти классы ΠΏΡ€ΠΈ запускС JVM.

3.2. ΠšΠ»Π°ΡΡΡ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΉΡ‚ΠΈ классы Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π² jre / lib / extn / , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ дСйствуСт ΠΊΠ°ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Java. Π­Ρ‚ΠΎΡ‚ ΠΏΡƒΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ извСстСн ΠΊΠ°ΠΊ ΠΏΡƒΡ‚ΡŒ ΠΊ классам Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ.

Он содСрТит Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния JavaFX Π² jfxrt.jar ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ Π»ΠΎΠΊΠ°Π»ΠΈ для ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² java.text ΠΈ java.util Π² localedata.jar . ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ собствСнныС Π±Π°Π½ΠΊΠΈ.

3.3. Настройки свойств

ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°

Java ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эти настройки свойств для поддСрТания своСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π’ зависимости ΠΎΡ‚ ΠΈΡ… использования ΠΎΠ½ΠΈ располоТСны Π² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠ°ΠΏΠΊΠ°Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ / jre / lib / . К Π½ΠΈΠΌ относятся:

  • ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ калСндаря Π² calendar.properties
  • ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Π² logging.properties
  • Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² net.properties
  • Бвойства развСртывания Π² / jre / lib / deploy /
  • Бвойства управлСния Π² / jre / lib / management /

3. 4. ΠŸΡ€ΠΎΡ‡ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹

Помимо Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ классов, JRE Ρ‚Π°ΠΊΠΆΠ΅ содСрТит Ρ„Π°ΠΉΠ»Ρ‹ для Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ:

  • Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒΡŽ Π² jre / lib / security
  • ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ для размСщСния классов ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ для Π°ΠΏΠΏΠ»Π΅Ρ‚ΠΎΠ² Π² jre / lib / applet
  • Π€Π°ΠΉΠ»Ρ‹, связанныС со ΡˆΡ€ΠΈΡ„Ρ‚Π°ΠΌΠΈ Π² jre / lib / fonts ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅

4. JDK

Java Development Kit (JDK) прСдоставляСт срСду ΠΈ инструмСнты для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, компиляции, ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Java.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ JDK Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚:

ΠœΡ‹ обсуТдали JRE Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ сосрСдоточимся Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… инструмСнтах Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ классифицируСм эти инструмСнты Π² зависимости ΠΎΡ‚ ΠΈΡ… использования:

4.1. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ инструмСнты

Π­Ρ‚ΠΈ инструмСнты Π·Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ основу JDK ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для создания ΠΈ построСния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Java. Π‘Ρ€Π΅Π΄ΠΈ этих инструмСнтов ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΉΡ‚ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ для компиляции, ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, архивирования, создания Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Javadoc ΠΈ Ρ‚. Π”.

Бюда входят:

  • javac — считываСт опрСдСлСния классов ΠΈ интСрфСйсов ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ… Π² Ρ„Π°ΠΉΠ»Ρ‹ классов
  • java — запускаСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Java
  • javadoc — Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ HTML-страницы Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ API ΠΈΠ· исходных Ρ„Π°ΠΉΠ»ΠΎΠ² Java
  • apt — Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈ выполняСт ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ Π½Π° основС Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² Π½Π°Π±ΠΎΡ€Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… исходных Ρ„Π°ΠΉΠ»ΠΎΠ²
  • appletviewer — позволяСт Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Java-Π°ΠΏΠΏΠ»Π΅Ρ‚Ρ‹ Π±Π΅Π· Π²Π΅Π±-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°
  • jar — ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Java-Π°ΠΏΠΏΠ»Π΅Ρ‚Ρ‹ ΠΈΠ»ΠΈ прилоТСния Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ Π°Ρ€Ρ…ΠΈΠ²
  • jdb — инструмСнт ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для поиска ΠΈ исправлСния ошибок Π² прилоТСниях Java
  • javah — создаСт Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ C ΠΈ исходныС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· класса Java
  • javap — Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹ классов ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ полях, конструкторах ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ…, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² Ρ„Π°ΠΉΠ»Π΅ класса
  • extcheck — ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ вСрсий ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ Π°Ρ€Ρ…ΠΈΠ²Π° Java (JAR) ΠΈ установлСнными Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ JAR Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ

4.

2. БрСдства бСзопасности

Бюда входят инструмСнты управлСния ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΠΈ сСртификатами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для управлСния Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Java.

Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Java — это ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для сСртификатов Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ сСртификатов ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ½ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ прилоТСниями Π½Π° основС Java для ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ, Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ обслуТивания ΠΏΠΎ HTTPS.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ бСзопасности Π² нашСй систСмС ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… этих ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Π² производствСнной срСдС.К Π½ΠΈΠΌ относятся:

  • keytool — ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π² ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ записями Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ криптографичСскими ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΠΈ сСртификатами
  • jarsigner — создаСт Ρ„Π°ΠΉΠ»Ρ‹ JAR с Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ подписью, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ
  • policytool — позволяСт Π½Π°ΠΌ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ внСшнСй ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ бСзопасности установки.

НСкоторыС инструмСнты бСзопасности Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π² ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ Π±ΠΈΠ»Π΅Ρ‚Π°ΠΌΠΈ Kerberos.

Kerberos — это ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» сСтСвой Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° основС Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΡƒΠ·Π»Π°ΠΌ, ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΡΡ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΠΎ Π½Π΅Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΉ сСти, бСзопасно ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ свою Π»ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ:

  • kinit — , ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для получСния ΠΈ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² Π²Ρ‹Π΄Π°Ρ‡ΠΈ Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² Kerberos
  • ktab — управляСт ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ
  • klist — ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ записи Π² локальном кэшС ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ

4.3. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Π˜Π½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ — это процСсс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прилоТСния, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π³ΠΎ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ языкам ΠΈ Ρ€Π΅Π³ΠΈΠΎΠ½Π°ΠΌ Π±Π΅Π· ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

Для этой Ρ†Π΅Π»ΠΈ JDK прСдоставляСт native2ascii. Π­Ρ‚ΠΎΡ‚ инструмСнт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ» с символами, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌΠΈ JRE, Π² Ρ„Π°ΠΉΠ»Ρ‹, Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π² escape-ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ASCII ΠΈΠ»ΠΈ Unicode.

4.4. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² (RMI)

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ RMI ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π½ΡƒΡŽ связь ΠΌΠ΅ΠΆΠ΄Ρƒ прилоТСниями Java, Ρ‚Π΅ΠΌ самым прСдоставляя возмоТности для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ распрСдСлСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

RMI позволяСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΌΡƒ Π² ΠΎΠ΄Π½ΠΎΠΉ JVM, Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ JVM.Π­Ρ‚ΠΈ инструмСнты Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚:

  • rmic — Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ классы-Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ, скСлСты ΠΈ связки для ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Java (JRMP) ΠΈΠ»ΠΈ мСТсфСрного ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π° (IIOP).
  • rmiregistry — создаСт ΠΈ запускаСт рССстр ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²
  • rmid — s запускаСт Π΄Π΅ΠΌΠΎΠ½ систСмы Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ позволяСт Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС Java
  • .

  • serialver — Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ UID сСрийной вСрсии для ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… классов

4.

5. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Java IDL ΠΈ RMI-IIOP

Π―Π·Ρ‹ΠΊ опрСдСлСния интСрфСйса Java (IDL) добавляСт Π² ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ Java Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ‰Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π±Ρ€ΠΎΠΊΠ΅Ρ€Π° запросов (CORBA).

Π­Ρ‚ΠΈ инструмСнты ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ распрСдСлСнным Π²Π΅Π±-прилоТСниям Java Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌΠΈ сСтСвыми слуТбами с использованиСм стандартной отраслСвой Π³Ρ€ΡƒΠΏΠΏΡ‹ управлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ (OMG) — IDL.

Аналогично, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Internet InterORB (IIOP).

RMI-IIOP, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ RMI ΠΏΠΎΠ²Π΅Ρ€Ρ… IIOP, позволяСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСрвСры ΠΈ прилоТСния CORBA Ρ‡Π΅Ρ€Π΅Π· RMI API.Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ обСспСчиваСтся соСдинСниС ΠΌΠ΅ΠΆΠ΄Ρƒ двумя прилоТСниями, написанными Π½Π° любом CORBA-совмСстимом языкС, Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Internet InterORB (IIOP).

Π­Ρ‚ΠΈ инструмСнты Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚:

  • tnameserv — врСмСнная слуТба имСнования, которая прСдоставляСт Π΄Ρ€Π΅Π²ΠΎΠ²ΠΈΠ΄Π½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ для ссылок Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹
  • idlj — ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ IDL-to-Java для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ привязок Java для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° IDL
  • orbd — позволяСт ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ постоянныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π° сСрвСрС Π² срСдС CORBA
  • servertool — прСдоставляСт интСрфСйс ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки для рСгистрации ΠΈΠ»ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ рСгистрации постоянного сСрвСра с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ORB Daemon ( orbd ), запуска ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ постоянного сСрвСра, зарСгистрированного Π² ORB Daemon, ΠΈ Ρ‚. Π”.

4.6. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ развСртывания Java

Π­Ρ‚ΠΈ инструмСнты ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π² Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π°ΠΏΠΏΠ»Π΅Ρ‚ΠΎΠ² Java Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅. Π’ ΠΈΡ… числС:

  • pack200 — ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ» JAR Π² Ρ„Π°ΠΉΠ» pack200 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ компрСссора Java gzip
  • unpack200 — ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ» pack200 Π² Ρ„Π°ΠΉΠ» JAR

4.7. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ модуля Java

JDK прСдоставляСт Π½Π°ΠΌ HTML-ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π΅Ρ€ . ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вмСстС с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ Java.

Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Java устанавливаСт связь ΠΌΠ΅ΠΆΠ΄Ρƒ популярными Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°ΠΌΠΈ ΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ Java. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ этого соСдинСния Π°ΠΏΠΏΠ»Π΅Ρ‚Ρ‹ Π½Π° Π²Π΅Π±-сайтС ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, htmlconverter — это ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° для прСобразования HTML-страницы, содСрТащСй Π°ΠΏΠΏΠ»Π΅Ρ‚Ρ‹, Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ модуля Java.

4.8. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ Java Web Start

JDK приносит Ρ‡Π΅Π»ΡŽΡΡ‚Π΅ΠΉ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ вмСстС с Java Web Start.

Π­Ρ‚ΠΎΡ‚ инструмСнт позволяСт Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ прилоТСния Java ΠΎΠ΄Π½ΠΈΠΌ Ρ‰Π΅Π»Ρ‡ΠΊΠΎΠΌ ΠΌΡ‹ΡˆΠΈ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅Ρ‚ нСобходимости Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ процСсс установки.

4.9. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΈ управлСния

Π­Ρ‚ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ инструмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ JVM ΠΈ потрСблСния рСсурсов. Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ…::

  • jconsole — прСдоставляСт Π³Ρ€Π°Ρ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ консоль, которая позволяСт ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ прилоТСниями Java.
  • jps — пСрСчисляСт оснащСнныС JVM Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΉ систСмС
  • jstat — отслСТиваСт статистику JVM
  • jstatd — отслСТиваСт созданиС ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… JVM

4.

10. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ для поиска ΠΈ устранСния нСисправностСй

Π­Ρ‚ΠΎ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ инструмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для устранСния Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ. :

  • информация — Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ процСсса Java
  • jmap — ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ ΠΊΠ°Ρ€Ρ‚Ρ‹ памяти ΠΎΠ±Ρ‰ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ»ΠΈ Π΄Π΅Ρ‚Π°Π»ΠΈ памяти ΠΊΡƒΡ‡ΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ процСсса
  • jsadebugd — ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ процСссу Java ΠΈ дСйствуСт ΠΊΠ°ΠΊ сСрвСр ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ
  • jstack — ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ трассировку стСка Java ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Java для Π΄Π°Π½Π½ΠΎΠ³ΠΎ процСсса Java

5.Π’Ρ‹Π²ΠΎΠ΄

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ основноС Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ JVM, JRE ΠΈ JDK Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΈΡ… использовании.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ описали, ΠΊΠ°ΠΊ JVM прСдставляСт собой Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ‚Π½ΡƒΡŽ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ, которая фактичСски выполняСт Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Java.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ объяснили, ΠΊΠ°ΠΊ просто Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ прилоТСния Java, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ JRE.

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΌΡ‹ поняли, ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Java-прилоТСния, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ JDK.

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя Π½Π° ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ инструмСнтов ΠΈ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ этих ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

МодСль памяти

Java (JVM) — Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² Java

ПониманиС ΠΌΠΎΠ΄Π΅Π»ΠΈ памяти JVM , Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Java ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Java Garbage Collection . БСгодня ΠΌΡ‹ рассмотрим ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² Java, Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ части памяти JVM ΠΈ способы отслСТивания ΠΈ настройки сборки мусора.

МодСль памяти Java (JVM)

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π²Ρ‹ΡˆΠ΅, ΠΏΠ°ΠΌΡΡ‚ΡŒ JVM Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ части.Π’ Ρ†Π΅Π»ΠΎΠΌ, ΠΏΠ°ΠΌΡΡ‚ΡŒ JVM Heap физичСски Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° Π΄Π²Π΅ части — ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния ΠΈ старого поколСния .

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² Java — МолодоС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅

МолодоС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ — это мСсто, Π³Π΄Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ всС Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Когда ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ, выполняСтся сборка мусора. Π­Ρ‚Π° сборка мусора называСтся Minor GC . МолодоС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΎ Π½Π° Ρ‚Ρ€ΠΈ части — Eden Memory ΠΈ Π΄Π²Π΅ Survivor Memory .

Π’Π°ΠΆΠ½Ρ‹Π΅ свСдСния ΠΎ пространствах ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния:

  • Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ вновь созданных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² находится Π² пространствС памяти Π­Π΄Π΅ΠΌΠ°.
  • Когда пространство Π­Π΄Π΅ΠΌΠ° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, выполняСтся ΠœΠ°Π»Ρ‹ΠΉ сборщик мусора, ΠΈ всС Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ Π² ΠΆΠΈΠ²Ρ‹Ρ….
  • Minor GC Ρ‚Π°ΠΊΠΆΠ΅ провСряСт Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΈΡ… Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ мСсто Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΡ…. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΎΠ΄Π½ΠΎ ΠΈΠ· ячССк Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΡ… всСгда пусто.
  • ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ»ΠΈΡΡŒ послС ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ†ΠΈΠΊΠ»ΠΎΠ² сборки мусора, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти старого поколСния.ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это дСлаСтся ΠΏΡƒΡ‚Π΅ΠΌ установлСния ΠΏΠΎΡ€ΠΎΠ³Π° возраста ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ½ΠΈ смогут ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² Π‘Ρ‚Π°Ρ€ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² Java — староС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅

ΠŸΠ°ΠΌΡΡ‚ΡŒ старого поколСния содСрТит ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠΌΠΈ ΠΈ ΡƒΡ†Π΅Π»Π΅Π²ΡˆΠΈΠΌΠΈ послС ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ†ΠΈΠΊΠ»ΠΎΠ² Minor GC. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ сборка мусора выполняСтся Π² памяти старого поколСния, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½Π° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°. Π‘Π±ΠΎΡ€ΠΊΠ° мусора старого поколСния называСтся Major GC ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Stop the World Event

ВсС сборки мусора ΡΠ²Π»ΡΡŽΡ‚ΡΡ событиями Β«Stop the WorldΒ», ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π½Π΅Π΄ΠΎΠ»Π³ΠΎΠ²Π΅Ρ‡Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Minor GC Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ быстро, ΠΈ это Π½Π΅ влияСт Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Однако Major GC Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ провСряСт всС ΠΆΠΈΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. ΠšΡ€ΡƒΠΏΠ½Ρ‹ΠΉ сборщик мусора Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π° врСмя сборки мусора.ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ происходит ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΉ сборки мусора, Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅ ошибки Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°.

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сборщика мусора зависит ΠΎΡ‚ стратСгии, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ для сборки мусора. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ сборщик мусора, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ΠΎΠ² Π² Π²Ρ‹ΡΠΎΠΊΠΎΡ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… прилоТСниях.

МодСль памяти Java — постоянноС созданиС

ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ «постоянноС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅Β» содСрТит ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ прилоТСния, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ JVM для описания классов ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Perm Gen Π½Π΅ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ памяти Java Heap.

Perm Gen заполняСтся JVM Π²ΠΎ врСмя выполнСния Π½Π° основС классов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Perm Gen Ρ‚Π°ΠΊΠΆΠ΅ содСрТит классы ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Java SE. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Perm Gen ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ мусором ΠΏΡ€ΠΈ ΠΏΠΎΠ»Π½ΠΎΠΉ сборкС мусора.

МодСль памяти Java — ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²

ΠžΠ±Π»Π°ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ пространства Perm Gen ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния структуры классов (констант Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΈ статичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…) ΠΈ ΠΊΠΎΠ΄Π° для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ конструкторов.

МодСль памяти Java — ΠΏΡƒΠ» памяти

ΠŸΡƒΠ»Ρ‹ памяти ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌΠΈ памяти JVM для создания ΠΏΡƒΠ»Π° нСизмСняСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ссли рСализация ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ это.ΠŸΡƒΠ» строк — Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΏΡƒΠ»Π° памяти. ΠŸΡƒΠ» памяти ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ Heap ΠΈΠ»ΠΈ Perm Gen, Π² зависимости ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ диспСтчСра памяти JVM.

МодСль памяти Java — ΠŸΡƒΠ» констант Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния

ΠŸΡƒΠ» констант Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния — это прСдставлСниС ΠΏΡƒΠ»Π° констант Π² классС Π²ΠΎ врСмя выполнСния для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса. Он содСрТит константы Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΈ статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса. ΠŸΡƒΠ» констант Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ области ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

МодСль памяти Java — ΠΏΠ°ΠΌΡΡ‚ΡŒ стСка Java

ΠŸΠ°ΠΌΡΡ‚ΡŒ стСка Java ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠ°.Они содСрТат спСцифичСскиС для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅Π΄ΠΎΠ»Π³ΠΎΠ²Π΅Ρ‡Π½Ρ‹, ΠΈ ссылки Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΊΡƒΡ‡Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ссылаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ стСком ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΊΡƒΡ‡ΠΈ.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² Java — ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ памяти ΠΊΡƒΡ‡ΠΈ Java

Java прСдоставляСт мноТСство ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΉ памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для установки Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² памяти ΠΈ ΠΈΡ… ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ. НСкоторыС ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΉ памяти:

VM Switch VM Switch Description
-Xms Для установки Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ ΠΏΡ€ΠΈ запускС JVM
-Xmx Для установки максимального Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ.
-Xmn Для установки Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Молодого ПоколСния ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ пространство отводится Π‘Ρ‚Π°Ρ€ΠΎΠΌΡƒ ПоколСнию.
-XX: PermGen Для установки Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° памяти постоянного поколСния
-XX: MaxPermGen Для установки максимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Perm Gen
-X16o Survivor ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ пространства Eden ΠΈ Survivor Space, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли Ρ€Π°Π·ΠΌΠ΅Ρ€ Young Generation составляСт 10 ΠΌ, Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ VM Ρ€Π°Π²Π΅Π½ -XX: SurvivorRatio = 2, Ρ‚ΠΎ 5 ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ для Eden Space ΠΈ 2.По 5 ΠΌ для ΠΎΠ±ΠΎΠΈΡ… мСст для Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΡ…. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ — 8.
-XX: NewRatio Для обСспСчСния ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² старого / Π½ΠΎΠ²ΠΎΠ³ΠΎ поколСния. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ — 2.

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² достаточно, Π½ΠΎ Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, посСтитС ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ страницу ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² JVM.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² Java — Π‘Π±ΠΎΡ€ΠΊΠ° мусора Java

Π‘Π±ΠΎΡ€ΠΊΠ° мусора Java — это процСсс ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ удалСния Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· памяти ΠΈ освобоТдСния пространства, выдСляСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, созданным для Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.Одной ΠΈΠ· Π»ΡƒΡ‡ΡˆΠΈΡ… особСнностСй языка программирования Java являСтся автоматичСская сборка мусора , Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… языков программирования, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ C, Π³Π΄Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ освобоТдСниС памяти выполняСтся Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора — это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π°Ρ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, которая просматриваСт всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² памяти ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ссылаСтся какая-Π»ΠΈΠ±ΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ВсС эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅Ρ‚ ссылок, ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ, Π° пространство освобоТдаСтся для выдСлСния Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ.

Один ΠΈΠ· основных способов сборки мусора состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… шагов:

  1. ΠœΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° : Π­Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ шаг, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ сборщик мусора опрСдСляСт, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π° ΠΊΠ°ΠΊΠΈΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ.
  2. ΠžΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ : Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора удаляСт Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ освобоТдаСт свободноС пространство для выдСлСния Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ.
  3. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ с ΡƒΠΏΠ»ΠΎΡ‚Π½Π΅Π½ΠΈΠ΅ΠΌ : для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ послС удалСния Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² всС ΡƒΡ†Π΅Π»Π΅Π²ΡˆΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ вмСстС.Π­Ρ‚ΠΎ повысит ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ выдСлСния памяти Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ.

Π•ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с простым ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΈ ΠΈ удалСния.

  1. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, это нСэффСктивно, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ вновь созданных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² пСрСстанСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.
  2. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ†ΠΈΠΊΠ»ΠΎΠ² сборки мусора, скорСС всСго, Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Π² Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… Ρ†ΠΈΠΊΠ»Π°Ρ….

Π’Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Π΅ нСдостатки простого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Java Garbage Collection являСтся ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ΠΌ , ΠΈ Ρƒ нас Π΅ΡΡ‚ΡŒ мСст для ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния ΠΈ для старого поколСния Π² памяти ΠΊΡƒΡ‡ΠΈ.Π’Ρ‹ΡˆΠ΅ я ΡƒΠΆΠ΅ объяснял, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ поколСния Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π½Π° основС Minor GC ΠΈ Major GC.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² Java — Ρ‚ΠΈΠΏΡ‹ сборки мусора Java

БущСствуСт ΠΏΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ² Ρ‚ΠΈΠΏΠΎΠ² сборки мусора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½Π°ΡˆΠΈΡ… прилоТСниях. Нам просто Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ JVM, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ сборки мусора для прилоТСния. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΠ· Π½ΠΈΡ… ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

  1. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ GC (-XX: + UseSerialGC) : ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ GC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ простой ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ mark-sweep-compact для сборки мусора ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ ΠΈ старого ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΉ i.e Minor ΠΈ Major GC.Serial GC ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π½Π° клиСнтских ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ наши простыС Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Π΅ прилоТСния ΠΈ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ с мСньшим ЦП. Π­Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с нСбольшим объСмом памяти.
  2. ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик мусора (-XX: + UseParallelGC) : ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик мусора Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик мусора, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ N ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для сборки мусора ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния, Π³Π΄Π΅ N — количСство ядСр ЦП Π² систСмС. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° JVM -XX: ParallelGCThreads = n .ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик мусора Ρ‚Π°ΠΊΠΆΠ΅ называСтся сборщиком пропускной способности, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ нСсколько процСссоров для ускорСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ сборщика мусора. ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик мусора ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ для сборки мусора старого поколСния.
  3. ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ старый сборщик мусора (-XX: + UseParallelOldGC) : Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик мусора, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для сборки мусора ΠΊΠ°ΠΊ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊ ΠΈ старого поколСния.
  4. ΠšΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΌΠ΅Ρ‚ΠΎΠΊ (CMS) (-XX: + UseConcMarkSweepGC) : Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ CMS Ρ‚Π°ΠΊΠΆΠ΅ называСтся ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΌ сборщиком Π½ΠΈΠ·ΠΊΠΎΠΉ ΠΏΠ°ΡƒΠ·Ρ‹.Он занимаСтся сборкой мусора для Π‘Ρ‚Π°Ρ€ΠΎΠ³ΠΎ поколСния. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ CMS пытаСтся ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΡƒΠ·Ρ‹ ΠΈΠ·-Π·Π° сборки мусора, выполняя Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ сборкС мусора ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ прилоТСния. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ CMS Π² ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΌ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик. Π­Ρ‚ΠΎΡ‚ сборщик мусора ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π³Π΄Π΅ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ сСбС Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°ΡƒΠ·Ρ‹. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² сборщикС CMS, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ JVM -XX: ParallelCMSThreads = n .
  5. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора G1 (-XX: + UseG1GC) : Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора Garbage First ΠΈΠ»ΠΈ G1 доступСн Π² Java 7, ΠΈ Π΅Π³ΠΎ долгосрочная Ρ†Π΅Π»ΡŒ — Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ сборщик CMS. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ G1 — это ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ постСпСнно ΡƒΠΏΠ»ΠΎΡ‚Π½ΡΡŽΡ‰ΠΈΠΉΡΡ сборщик мусора с ΠΌΠ°Π»ΠΎΠΉ ΠΏΠ°ΡƒΠ·ΠΎΠΉ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ сборщик мусора Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ сборщики, ΠΈ Π½Π΅Ρ‚ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ пространства ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ ΠΈ старого ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΉ. Он Π΄Π΅Π»ΠΈΡ‚ пространство ΠΊΡƒΡ‡ΠΈ Π½Π° нСсколько областСй ΠΊΡƒΡ‡ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Когда вызываСтся сборщик мусора, ΠΎΠ½ сначала собираСт ΠΎΠ±Π»Π°ΡΡ‚ΡŒ с мСньшим объСмом ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, «сначала мусор».Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± этом Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Oracle ΠΏΠΎ сборщику мусора.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² Java — ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ сборки мусора Java

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку Java, Π° Ρ‚Π°ΠΊΠΆΠ΅ инструмСнты ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° дСйствий прилоТСния ΠΏΠΎ сбору мусора. Π’ ΠΌΠΎΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΎΠ΄Π½ΠΎ ΠΈΠ· дСмонстрационных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, прСдоставляСмых Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°ΠΌΠΈ Java SE.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° страницу Π·Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ Java SE ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ JDK 7 ΠΈ JavaFX Demos and Samples .Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ прилоТСния Java2Demo.jar , ΠΈ ΠΎΠ½ находится Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ jdk1.7.0_55 / demo / jfc / Java2D . Однако это Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ шаг, ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° GC для любого Java-прилоТСния.

Команда, использованная ΠΌΠ½ΠΎΠΉ для запуска дСмонстрационного прилоТСния:

  pankaj @ Pankaj: ~ / Downloads / jdk1.7.0_55 / demo / jfc / Java2D $ java -Xmx120m -Xms30m -Xmn10m -XX: PermSize = 20m -XX : MaxPermSize = 20 ΠΌ -XX: + UseSerialGC -jar Java2Demo.jar
  
jstat

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ инструмСнт ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки jstat для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° памяти JVM ΠΈ дСйствий ΠΏΠΎ сборкС мусора.Он поставляСтся со стандартным JDK, поэтому Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ.

Для выполнСния jstat Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса прилоТСния, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ps -eaf | ΠΊΠΎΠΌΠ°Π½Π΄Π° grep java .

  pankaj @ Pankaj: ~ $ ps -eaf | grep Java2Demo.jar
  501 9582 11579 0 21:48 ttys000 0: 21.66 / usr / bin / java -Xmx120m -Xms30m -Xmn10m -XX: PermSize = 20m -XX: MaxPermSize = 20m -XX: + UseG1GC -jar Java2Demo.jar
  501 14073 14045 0 21:48 ttys002 0:00.00 grep Java2Demo.jar
  

Π˜Ρ‚Π°ΠΊ, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса для ΠΌΠΎΠ΅Π³ΠΎ java-прилоТСния — 9582. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ jstat , ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

  pankaj @ Pankaj: ~ $ jstat -gc 9582 1000
 S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
1024,0 1024,0 0,0 0,0 8192,0 7933,3 42108,0 23401,3 20480,0 19990,9 157 0,274 40 1,381 1,654
1024,0 1024,0 0,0 0,0 8192,0 8026,5 42108.0 23401,3 20480,0 19990,9 157 0,274 40 1,381 1,654
1024,0 1024,0 0,0 0,0 8192,0 8030,0 42108,0 23401,3 20480,0 19990,9 157 0,274 40 1,381 1,654
1024,0 1024,0 0,0 0,0 8192,0 8122,2 42108,0 23401,3 20480,0 19990,9 157 0,274 40 1,381 1,654
1024,0 1024,0 0,0 0,0 8192,0 8171,2 42108,0 23401,3 20480,0 19990,9 157 0,274 40 1,381 1,654
1024,0 1024,0 48,7 0,0 8192,0 106,7 42108,0 23401.3 20480,0 19990,9 158 0,275 40 1,381 1,656
1024,0 1024,0 48,7 0,0 8192,0 145,8 42108,0 23401,3 20480,0 19990,9 158 0,275 40 1,381 1,656
  

ПослСдний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ для jstat — это Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ, поэтому ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ памяти ΠΈ сборкС мусора ΠΊΠ°ΠΆΠ΄ΡƒΡŽ сСкунду.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ столбСц ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ.

  • S0C ΠΈ S1C : Π² этом столбцС отобраТаСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ областСй Survivor0 ΠΈ Survivor1 Π² ΠšΠ‘.
  • S0U ΠΈ S1U : Π² этом столбцС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ использованиС областСй Survivor0 ΠΈ Survivor1 Π² ΠšΠ‘. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ Π² ΠΆΠΈΠ²Ρ‹Ρ… областСй всС врСмя пуста.
  • EC ΠΈ EU : эти столбцы ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ использованиС пространства Eden Π² ΠšΠ‘. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ EU увСличиваСтся, ΠΈ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ пСрСсСкаСт EC, вызываСтся Minor GC, Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ EU ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ.
  • OC ΠΈ OU : эти столбцы ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ использованиС старого поколСния Π² ΠšΠ‘.
  • PC ΠΈ PU : Π² этих столбцах отобраТаСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ использованиС Perm Gen Π² ΠšΠ‘.
  • YGC ΠΈ YGCT : столбСц YGC ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ количСство событий GC, ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π΄ΡˆΠΈΡ… Π² ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΌ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΈ. Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† YGCT ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ суммарноС врСмя ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π“Π₯ для ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° ΠΎΠ½ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ строкС, Π³Π΄Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ EU опускаСтся ΠΈΠ·-Π·Π° Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ GC.
  • FGC ΠΈ FGCT : столбСц FGC ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ количСство ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π΄ΡˆΠΈΡ… событий Full GC.Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† FGCT ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ суммарноС врСмя для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π“Π₯. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ врСмя ΠΏΠΎΠ»Π½ΠΎΠΉ сборки мусора слишком Π²Π΅Π»ΠΈΠΊΠΎ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ сборки мусора ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния.
  • GCT : Π² этом столбцС отобраТаСтся ΠΎΠ±Ρ‰Π΅Π΅ суммарноС врСмя для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π“Π₯. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ это сумма Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ столбцов YGCT ΠΈ FGCT.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ jstat Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… сСрвСрах, Π³Π΄Π΅ Ρƒ нас Π½Π΅Ρ‚ графичСского интСрфСйса. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ сумма S0C, S1C ΠΈ EC составляСт 10 ΠΌ, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΎΠΏΡ†ΠΈΠΈ JVM -Xmn10m .

Java VisualVM с Visual GC

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ сборщиком мусора Π² графичСском интСрфСйсС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ инструмСнт jvisualvm . Java VisualVM Ρ‚Π°ΠΊΠΆΠ΅ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ JDK, поэтому Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.

ΠŸΡ€ΠΎΡΡ‚ΠΎ запуститС ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ jvisualvm Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Java VisualVM. ПослС запуска Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ Visual GC ΠΈΠ· мСню Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ — <ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½ΠΈΠΆΠ΅.

ПослС установки Visual GC просто ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π»Π΅Π²ΠΎΠΌ столбцС ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Ρ€Π°Π·Π΄Π΅Π» Visual GC .Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ памяти JVM ΠΈ Π΄Π΅Ρ‚Π°Π»ΠΈ сборки мусора, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½ΠΈΠΆΠ΅.

Настройка сборки мусора Java

Настройка сборки мусора Java Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ послСднСй ΠΎΠΏΡ†ΠΈΠ΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для увСличСния пропускной способности вашСго прилоТСния, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ·-Π·Π° увСличСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ сборки мусора, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ прилоТСния.

Если Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ ошибки java.lang.OutOfMemoryError: PermGen space Π² ΠΆΡƒΡ€Π½Π°Π»Π°Ρ…, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ объСм памяти Perm Gen с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² -XX: PermGen ΠΈ -XX: MaxPermGen JVM.Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ -XX: + CMSClassUnloadingEnabled ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сборщика мусора CMS.

Если Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΏΠΎΠ»Π½Ρ‹ΠΌ сборщиком мусора, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ объСм памяти старого поколСния.

ΠžΠ±Ρ‰Π°Ρ настройка сборки мусора Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ усилий ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΈ для этого Π½Π΅Ρ‚ ТСсткого ΠΏΡ€Π°Π²ΠΈΠ»Π°. Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΈ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠΈΠΉ, подходящий для вашСго прилоТСния.

Π­Ρ‚ΠΎ всС, Ρ‡Ρ‚ΠΎ касаСтся ΠΌΠΎΠ΄Π΅Π»ΠΈ памяти Java, управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² Java ΠΈ сборки мусора. НадСюсь, это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ JVM ΠΈ процСсс сборки мусора.

10 Π±Π°Π»Π»ΠΎΠ² ΠΎ Java Heap Space ΠΈΠ»ΠΈ Java Heap Memory

10 Π±Π°Π»Π»ΠΎΠ² ΠΎ памяти ΠΊΡƒΡ‡ΠΈ Java
Когда я Π½Π°Ρ‡ΠΈΠ½Π°Π» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Java, я Π½Π΅ Π·Π½Π°Π», Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ java heap ΠΈΠ»ΠΈ пространство ΠΊΡƒΡ‡ΠΈ Π² Java, я Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π½Π°Π», Π³Π΄Π΅ создаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Java, ΠΊΠΎΠ³Π΄Π° я Π½Π°Ρ‡Π°Π» Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, я столкнулся с ошибкой java.lang.OutOfMemoryError Π² Tomcat я понял, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΊΡƒΡ‡Π° Π² Java ΠΈΠ»ΠΈ Java Heap Space. Π’Π°ΠΊΠΎΠ΅ случаСтся с Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎΠΌ программистов, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ΡƒΡ‡ΠΈΡ‚ΡŒ язык Π»Π΅Π³ΠΊΠΎ, Π½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ основы слоТно, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ сущСствуСт Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСсса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΡƒΡ‡ΠΈΠ» Π±Ρ‹ вас всСм основам программирования, Π΅Π³ΠΎ ΠΎΠΏΡ‹Ρ‚Ρƒ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅, Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ сСкрСт программирования.

Для Java-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π·Π½Π°Π½ΠΈΠ΅ ΠΊΡƒΡ‡ΠΈ Π² Java, установка Ρ€Π°Π·ΠΌΠ΅Ρ€Π° пространства ΠΊΡƒΡ‡ΠΈ Java, Ρ€Π°Π±ΠΎΡ‚Π° с пространством ΠΊΡƒΡ‡ΠΈ Java OutOfMemoryError, Π°Π½Π°Π»ΠΈΠ· Π΄Π°ΠΌΠΏΠΎΠ² ΠΊΡƒΡ‡ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Ρ‹. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Β«ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ JavaΒ» ΠΎΡ‚ Π§Π°Ρ€Π»ΠΈ Π₯Π°Π½Ρ‚Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΡƒΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Java, ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΌΠΈ инструмСнтами для получСния Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π΅Π³ΠΎ для формирования ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Ρ… областСй.

Π­Ρ‚ΠΎ руководство ΠΏΠΎ Java Heap ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ для ΠΌΠΎΠΈΡ… Π±Ρ€Π°Ρ‚ΡŒΠ΅Π²-Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ»ΠΎΡ…ΠΎ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΠΈΠ·ΡƒΡ‡Π°ΡŽΡ‚ Π΅Π³ΠΎ. Блишком большая Ρ€Π°Π·Π½ΠΈΡ†Π°, Ссли Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ основы ΠΈ Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ Π² основС, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ создан Π² ΠΊΡƒΡ‡Π΅, Π²Ρ‹ Π½Π΅ смоТСтС ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ OutOfMemoryError Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π² ΠΊΡƒΡ‡Π΅.

Π― ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΊΡƒΡ‡Π΅ Π² Java, Π½ΠΎ Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹, рСбята, внСсли свой Π²ΠΊΠ»Π°Π΄ ΠΈ подСлились своими знаниями ΠΎ ΠΊΡƒΡ‡Π΅ Π² Java Π½Π° Π±Π»Π°Π³ΠΎ всСх.

ΠšΡΡ‚Π°Ρ‚ΠΈ, Ссли Π²Ρ‹ Π·Π°ΠΏΡƒΡ‚Π°Π»ΠΈΡΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΡƒΡ‡Π΅ΠΉ ΠΈ стСком, Π³Π΄Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ваши Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΡƒΡ‡Π΅ΠΉ ΠΈ стСковой ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² Java.

И, Ссли Π²Ρ‹ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ настроСны ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ свои ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ Π½Π°Π²Ρ‹ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с JVM ΠΈ ΠΈΠ·ΡƒΡ‡Π°Π΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ сбор ΠΈ Π°Π½Π°Π»ΠΈΠ· Π΄Π°ΠΌΠΏΠΎΠ² ΠΊΡƒΡ‡ΠΈ, Ρ‚ΠΎ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π²Π°ΠΌ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΊ курсу Java Application Performance and Memory Management Π½Π° Udemy.

Π­Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Ρ… курсов для программистов Π½Π° Java, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎΠ± ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ устранСниС ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти Π² Java.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ пространство ΠΊΡƒΡ‡ΠΈ Π² Java?

ΠŸΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Java Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Java ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‡Π°ΡΡ‚ΡŒ памяти ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Java ΠΈΠ»ΠΈ JVM ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту ΠΏΠ°ΠΌΡΡ‚ΡŒ для всСх своих Π½ΡƒΠΆΠ΄, ΠΈ Ρ‡Π°ΡΡ‚ΡŒ этой памяти являСтся ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΊΡƒΡ‡ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² java.

ΠšΡƒΡ‡Π° Π² Java ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ располагаСтся Π²Π½ΠΈΠ·Ρƒ адрСсного пространства ΠΈ пСрСмСщаСтся Π²Π²Π΅Ρ€Ρ….всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ способом, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ выдСляСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠ· ΠΊΡƒΡ‡ΠΈ, ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΠΌΠΈΡ€Π°Π΅Ρ‚ ΠΈΠ»ΠΈ сборщик мусора, ΠΏΠ°ΠΌΡΡ‚ΡŒ возвращаСтся Π² пространство ΠΊΡƒΡ‡ΠΈ Π² Java, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ сборкС мусора, посмотритС, ΠΊΠ°ΠΊ сборка мусора Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Π―Π²Π°.

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ Π² Java

Π Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Java составляСт 128 ΠœΠ‘ Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ 32-Π±ΠΈΡ‚Π½Ρ‹Ρ… JVM Sun, Π½ΠΎ ΠΎΠ½ сильно Π²Π°Ρ€ΡŒΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ‚ JVM ΠΊ JVM, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€. ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ для 32-разрядной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Solaris (SPARC Platform Edition) составляСт -Xms = 3670K ΠΈ -Xmx = 64M, Π° значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² 64-разрядных систСмах Π±Ρ‹Π»ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° 30%.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ сборщик мусора с пропускной ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒΡŽ Π² Java 1.5, ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ JVM ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ЀизичСская ΠΏΠ°ΠΌΡΡ‚ΡŒ / 4, Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ЀизичСская ΠΏΠ°ΠΌΡΡ‚ΡŒ / 16. Π”Ρ€ΡƒΠ³ΠΎΠΉ способ Π½Π°ΠΉΡ‚ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ JVM ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ — Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΊΡƒΡ‡ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JConsole, которая доступна Π² JDK 1.5 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… вСрсиях, Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ VMSummary Π²Ρ‹ смоТСтС ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ.

ΠšΡΡ‚Π°Ρ‚ΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ java Π² зависимости ΠΎΡ‚ потрСбностСй вашСго прилоТСния, ΠΈ я всСгда Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ это, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ использования Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΊΡƒΡ‡ΠΈ JVM ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.Ссли вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Π΅Π»ΠΈΠΊΠΎ ΠΈ создано ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² JVM -Xms ΠΈ -Xmx. Xms ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ, Π° -Xmx ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ Π² Java.

Π•ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ -Xmn, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½ΠΎΠ²ΠΎΠ³ΠΎ поколСния Java Heap Space. ЕдинствСнноС, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ Π² Java динамичСски, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Java Heap Size ΠΏΡ€ΠΈ запускС JVM. Π― подСлился Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ JVM, связанными с пространством ΠΊΡƒΡ‡ΠΈ Java ΠΈ сборкой мусора, Π² ΠΌΠΎΠ΅ΠΌ сообщСнии. 10 ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² JVM, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ программист Java, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ ΠΈΡ… ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ.

ОбновлСниС:

Π§Ρ‚ΠΎ касаСтся Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Java, ΠΈΠ· обновлСния Java 6 18 ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ измСнСния Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ JVM вычисляСт Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π° 32- ΠΈ 64-разрядных ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… ΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ JVM ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра:

1) ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ пространство ΠΊΡƒΡ‡ΠΈ ΠΈ максимальноС пространство ΠΊΡƒΡ‡ΠΈ большС для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

2) МаксимальноС пространство ΠΊΡƒΡ‡ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ составляСт 1/2 физичСской памяти Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π΄ΠΎ 192 Π±Π°ΠΉΡ‚ ΠΈ 1/4 физичСской памяти для Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π΄ΠΎ 1 Π“Π‘. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для ΠΌΠ°ΡˆΠΈΠ½Ρ‹ с объСмом памяти 1 Π“Π‘ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ составляСт 256 ΠœΠ‘ 2.ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ создаст достаточно ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для заполнСния Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ пространства ΠΊΡƒΡ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ мСньшС, Π½ΠΎ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 8 ΠœΠ‘ ΠΈΠ»ΠΈ 1/64 части физичСской памяти Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π΄ΠΎ 1 Π“Π‘.

3) для Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Java Server ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ составляСт 1 Π“Π‘ для 4 Π“Π‘ физичСской памяти Π½Π° 32-разрядной JVM. для 64-Π±ΠΈΡ‚Π½ΠΎΠΉ JVM это 32 Π“Π‘ для физичСской памяти 128 Π“Π‘. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ Ρ‚ΠΎΠΌ, сколько памяти Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² 32-Π±ΠΈΡ‚Π½ΠΎΠΉ ΠΈ 64-Π±ΠΈΡ‚Π½ΠΎΠΉ JVM Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Windows 8, Linux ΠΈΠ»ΠΈ Solaris см. Π—Π΄Π΅ΡΡŒ.

ΠšΡƒΡ‡Π° Java ΠΈ сборка мусора

Как ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΡƒΡ‡ΠΈ, Π° сборка мусора — это процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ удаляСт ΠΌΠ΅Ρ€Ρ‚Π²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· пространства ΠΊΡƒΡ‡ΠΈ Java ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΊΡƒΡ‡Ρƒ Π² Java. Π Π°Π΄ΠΈ сборки мусора ΠΊΡƒΡ‡Π° Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° Ρ‚Ρ€ΠΈ основных Ρ€Π΅Π³ΠΈΠΎΠ½Π°: Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅, староС ΠΈΠ»ΠΈ постоянноС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ ΠΈ пСрмскоС пространство.

НовоС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ ΠΊΡƒΡ‡ΠΈ Java — это Ρ‡Π°ΡΡ‚ΡŒ памяти ΠΊΡƒΡ‡ΠΈ Java, Π³Π΄Π΅ хранится вновь созданный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’ Ρ…ΠΎΠ΄Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±Ρ‹Π»ΠΈ созданы ΠΈ ΡƒΠΌΠ΅Ρ€Π»ΠΈ, Π½ΠΎ ΠΎΠ½ΠΈ ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ ΠΆΠΈΠ²Ρ‹ΠΌΠΈ, ΠΈ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² староС ΠΈΠ»ΠΈ постоянноС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ сборщика мусора Java Π½Π° Major ΠΈΠ»ΠΈ полная сборка мусора.ΠŸΠ΅Ρ€ΠΌΡΠΊΠΎΠ΅ пространство Java Heap — это мСсто, Π³Π΄Π΅ JVM Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ классах ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ…, ΠΏΡƒΠ»Π΅ строк ΠΈ дСталях уровня класса.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ мою ΡΡ‚Π°Ρ‚ΡŒΡŽ Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ сборка мусора Π² Java для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΊΡƒΡ‡Π΅ Π² Java ΠΈ сборкС мусора.

OutOfMemoryError Π² ΠΊΡƒΡ‡Π΅ Java

Когда JVM запускаСтся, пространство ΠΊΡƒΡ‡ΠΈ JVM Ρ€Π°Π²Π½ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ ΠΊΡƒΡ‡ΠΈ, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ -Xms, ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ выполнСния прилоТСния создаСтся большС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π° пространство ΠΊΡƒΡ‡ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ для размСщСния Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².JVM Ρ‚Π°ΠΊΠΆΠ΅ пСриодичСски запускаСт сборщик мусора, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΎΡ‚ ΠΌΠ΅Ρ€Ρ‚Π²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

JVM Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ ΠΊΡƒΡ‡Ρƒ Π² Java Π³Π΄Π΅-Ρ‚ΠΎ рядом с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΊΡƒΡ‡ΠΈ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ -Xmx, ΠΈ Ссли для создания Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΠΊΡƒΡ‡Π΅ java большС Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ памяти, JVM Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ java.lang.OutOfMemoryError ΠΈ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠΌΠΈΡ€Π°Π΅Ρ‚.

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ OutOfMemoryError НСт мСста Π² Java Heap, JVM пытаСтся Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сборщик мусора, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ любоС доступноС пространство, Π½ΠΎ Π΄Π°ΠΆΠ΅ послС этого Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ свободного мСста Π² Heap Π² Java ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ OutOfMemoryError.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° вашСго прилоТСния, Ρ‚.Π΅. ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π²Ρ‹ создаСтС, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚, сколько памяти ΠΈ Ρ‚. Π”., Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΊΡƒΡ‡ΠΈ для устранСния ошибки OutOfMemoryError Π² Java.

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ± ошибкС Β«java.lang.OutOfMemoryError: пространство ΠΊΡƒΡ‡ΠΈ JavaΒ» ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΡƒΡ‡Π° Java Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ достаточного пространства ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π° дальшС, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ сообщСниС ΠΎΠ± ошибкС Β«java.lang.OutOfMemoryError: пространство PermGen spaceΒ» появляСтся, ΠΊΠΎΠ³Π΄Π° постоянноС созданиС ΠΊΡƒΡ‡ΠΈ Java full, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ смоТСт Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ класс ΠΈΠ»ΠΈ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строку.

И, Ссли Π²Ρ‹ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ настроСны ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ свои ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ Π½Π°Π²Ρ‹ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с JVM ΠΈ ΠΈΠ·ΡƒΡ‡Π°Π΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ сбор ΠΈ Π°Π½Π°Π»ΠΈΠ· Π΄Π°ΠΌΠΏΠΎΠ² ΠΊΡƒΡ‡ΠΈ, Ρ‚ΠΎ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π²Π°ΠΌ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΊ курсу Java Application Performance and Memory Management Π½Π° Udemy.

Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ пространство ΠΊΡƒΡ‡ΠΈ Java Π½Π° Maven ΠΈ ANT

Нам часто Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ Maven ΠΈΠ»ΠΈ ANT, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ количСство классов увСличиваСтся, инструмСнт сборки Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ большС памяти для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ сборки ΠΈ часто Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ OutOfMemoryError, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² ΠΈΠ»ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ JVM.ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ см. Мой пост Как ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ Java для Ant ΠΈΠ»ΠΈ Maven

Π”Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ Java

Π”Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ Java — это снимок памяти ΠΊΡƒΡ‡ΠΈ Java Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для Π°Π½Π°Π»ΠΈΠ·Π° ΠΈΠ»ΠΈ устранСния любой ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти Π² Java ΠΈΠ»ΠΈ любой ошибки java.lang.OutOfMemoryError. Π’ JDK Π΅ΡΡ‚ΡŒ инструмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π²Π°ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ, ΠΈ Π΅ΡΡ‚ΡŒ инструмСнт для Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΡƒΡ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ java.

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Β«jmapΒ» для получСния Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ java, это создаст Ρ„Π°ΠΉΠ» Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Β«jhat — Java Heap Analysis ToolΒ» для Π°Π½Π°Π»ΠΈΠ·Π° этих Π΄Π°ΠΌΠΏΠΎΠ² ΠΊΡƒΡ‡ΠΈ.Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ слСдуСт ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ «ПолноС руководство ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ JavaΒ» Π‘ΠΊΠΎΡ‚Ρ‚Π° ΠžΡƒΠΊΡΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ настройкС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Java. Π­Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΊΠ½ΠΈΠ³ ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Java, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ любой ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Java-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ.

10 Π±Π°Π»Π»ΠΎΠ² ΠΎ Java Heap Space

1. ΠŸΠ°ΠΌΡΡ‚ΡŒ Java Heap — это Ρ‡Π°ΡΡ‚ΡŒ памяти, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ JVM ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой.

2. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΎΠ½ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ Heap Π² Java.

3. ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΊΡƒΡ‡ΠΈ Java Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΎ Π½Π° Ρ‚Ρ€ΠΈ области ΠΈΠ»ΠΈ поколСния для сбора мусора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ «НовоС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅Β», Β«Π‘Ρ‚Π°Ρ€ΠΎΠ΅ ΠΈΠ»ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅Β» ΠΈΠ»ΠΈ Β«ΠŸΠ΅Ρ€ΠΌΡΠΊΠΎΠ΅ пространство».ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½Π°Ρ гСнСрация — это сборщик мусора Π²ΠΎ врСмя ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ gc Π² JVM горячСй Ρ‚ΠΎΡ‡ΠΊΠΈ.

4. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ пространства ΠΊΡƒΡ‡ΠΈ Java с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки JVM -Xms, -Xmx ΠΈ -Xmn. Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ слово Β«MΒ» ΠΈΠ»ΠΈ Β«GΒ» послС указания Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Mega ΠΈΠ»ΠΈ Gig. Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ java Ρ€Π°Π²Π½Ρ‹ΠΌ 258 ΠœΠ‘, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ java -Xmx256m HelloWorld.

5. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ JConsole ΠΈΠ»ΠΈ Runtime.maxMemory (), Runtime.totalMemory (), Runtime.freeMemory () для запроса ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ ΠΊΡƒΡ‡ΠΈ Π² Java.Π‘ΠΌ. Мой пост Как Π½Π°ΠΉΡ‚ΠΈ использованиС памяти Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Java для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

6. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Β«jmapΒ» для получСния Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ Π² Java ΠΈ Β«jhatΒ» для Π°Π½Π°Π»ΠΈΠ·Π° этого Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ.

7. ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΊΡƒΡ‡ΠΈ Java отличаСтся ΠΎΡ‚ стСка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

8. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора Java ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° освобоТдСниС памяти ΠΎΡ‚ ΠΌΠ΅Ρ€Ρ‚Π²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Π² пространство ΠΊΡƒΡ‡ΠΈ Java.

9. НС ΠΏΠ°Π½ΠΈΠΊΡƒΠΉΡ‚Π΅, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ java.lang.OutOfMemoryError, ΠΈΠ½ΠΎΠ³Π΄Π° просто вопрос увСличСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ, Π½ΠΎ Ссли это повторяСтся, Ρ‚ΠΎ ΠΈΡ‰ΠΈΡ‚Π΅ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ памяти Π² Java.

10. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ срСдство профилирования ΠΈ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ пространство ΠΊΡƒΡ‡ΠΈ Java ΠΈ сколько памяти Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

УстранСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² прилоТСниях Java

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Π²Ρ‹Π²ΠΎΠ΄Ρ‹

  • УстранСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слоТной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ инструмСнтов ΠΌΠΎΠ³ΡƒΡ‚ сущСствСнно ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ процСсс.
  • Java HotSpot JVM ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ‚ΠΈΠΏΠ°Ρ… сообщСний OutOfMemoryError, ΠΈ Π²Π°ΠΆΠ½ΠΎ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ эти сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ Π½Π°Π±ΠΎΡ€ инструмСнтов диагностики ΠΈ устранСния Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ Π² нашСм Π½Π°Π±ΠΎΡ€Π΅ инструмСнтов для диагностики ΠΈ устранСния этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.
  • Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ спСктр диагностичСских инструмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ ΠΏΡ€ΠΈ устранСнии ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Π² Ρ‚ΠΎΠΌ числС:
    • ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ JVM HeapDumpOnOutOfMemoryError ΠΈ PrintClassHistogram
    • Eclipse MAT
    • Java VisualVM
    • JConsole
    • Π΄ΠΆΠ°Ρ‚
    • YourKit
    • jmap
    • jcmd
    • Java Flight Recorder ΠΈ Java Mission Control
    • Π–ΡƒΡ€Π½Π°Π»Ρ‹ Π“Π₯
    • Π½Π΅ Π±ΠΎΠ»Π΅Π΅
    • БрСдства обнаруТСния ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ встроСнной памяти, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ dbx, libumem, valgrind, purify ΠΈ Ρ‚. Π”.

Для процСсса Java сущСствуСт нСсколько ΠΏΡƒΠ»ΠΎΠ² ΠΈΠ»ΠΈ пространств памяти — ΠΊΡƒΡ‡Π° Java, Metaspace, PermGen (Π² вСрсиях Π΄ΠΎ Java 8) ΠΈ собствСнная ΠΊΡƒΡ‡Π°.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· этих ΠΏΡƒΠ»ΠΎΠ² памяти ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ со своим собствСнным Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π°Π½ΠΎΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ростом памяти, Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния ΠΈΠ»ΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΠ°ΠΌΠΈ памяти, всС ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π² Ρ„ΠΎΡ€ΠΌΠ΅ OutOfMemoryError для этих пространств.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ попытаСмся ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ эти сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… OutOfMemoryError, ΠΊΠ°ΠΊΠΈΠ΅ диагностичСскиС Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ для диагностики ΠΈ устранСния этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ исслСдуСм Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ инструмСнты для сбора этих Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΡ… Π°Π½Π°Π»ΠΈΠ·Π° для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ.Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ основноС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ удСляСтся способам Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ прСдотвращСния этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² производствСнных срСдах.

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ OutOfMemoryError, сообщаСмоС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машиной Java HotSpot, Π΄Π°Π΅Ρ‚ Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ объСм памяти истощаСтся. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассмотрим эти Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ сообщСния OutOfMemoryError, разбСрСмся с Π½ΠΈΠΌΠΈ ΠΈ исслСдуСм ΠΈΡ… вСроятныС ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ способы ΠΈΡ… устранСния ΠΈ устранСния.

OutOfMemoryError: пространство ΠΊΡƒΡ‡ΠΈ Java

  Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ "main" java.lang.OutOfMemoryError: пространство ΠΊΡƒΡ‡ΠΈ Java
Π² java.util.Arrays.copyOfRange (нСизвСстный источник)
Π² java.lang.String.  (НСизвСстный источник)
Π² java.io.BufferedReader.readLine (НСизвСстный источник)
Π² java.io.BufferedReader.readLine (НСизвСстный источник)
Π² com.abc.ABCParser.dump (ABCParser.java:23)
Π² com.abc.ABCParser.mainABCParser.java:59)  

Π­Ρ‚ΠΎ сообщСниС ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρƒ JVM Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ свободного мСста Π² ΠΊΡƒΡ‡Π΅ Java, ΠΈ ΠΎΠ½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.НаиболСС частой ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Ρ‚Π°ΠΊΠΈΡ… ошибок являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ Java нСдостаточСн для размСщСния ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° ΠΆΠΈΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Один простой способ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, достаточно Π»ΠΈ Π²Π΅Π»ΠΈΠΊΠ° ΠΊΡƒΡ‡Π° Java, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ всС ΠΆΠΈΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² JVM, — это ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»Ρ‹ GC.

  688995.775: [ΠŸΠΎΠ»Π½Ρ‹ΠΉ GC [PSYoungGen: 46400K-> 0K (471552K)] [ParOldGen: 1002121K-> 304673K (1036288K)] 1048
521K-> 304673K (1507840K) [PSPermGen: 253230K-> 253230K (1048576K)], 0,3402350 сСкунд] [Times: user = 1.48
sys = 0,00, real = 0,34 сСкунды]
  

Из ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ записи Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ послС Full GC Π·Π°Π½ΡΡ‚ΠΎΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ сниТаСтся с 1 Π“Π‘ (1048521 ΠšΠ‘) Π΄ΠΎ 305 ΠœΠ‘ (304673 ΠšΠ‘), Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ 1,5 Π“Π‘ (1507840 ΠšΠ‘), Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ для ΠΊΡƒΡ‡ΠΈ, достаточно Π²Π΅Π»ΠΈΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ GC:

  20,343: [ΠŸΠΎΠ»Π½Ρ‹ΠΉ GC (эргономика) [PSYoungGen: 12799K-> 12799K (14848K)] [ParOldGen: 33905K-> 33905K (34304K)] 46705K-> 46705K (49152K), [Metaspace: 2921K-> 2921K] (1056768K) ​​(1056768K) , 0.4595734 сСкунды] [ВрСмя: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ = 1,17, систСмноС = 0,00, Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ = 0,46 сСкунды]
......  нСсколько ΠΏΠΎΠ»Π½Ρ‹Ρ… сборщиков мусора  ......
22.640: [ΠŸΠΎΠ»Π½Ρ‹ΠΉ GC (эргономика) [PSYoungGen: 12799K-> 12799K (14848K)] [ParOldGen: 33911K-> 33911K (34304K)] 46711K-> 46711K (49152K), [Metaspace: 2921K-> 2921K (1056768K) 0,4648764 сСкунды] [ВрСмя: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ = 1,11, систСмный = 0,00, Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ = 0,46 сСкунды]
23.108: [ΠŸΠΎΠ»Π½Ρ‹ΠΉ GC (эргономика) [PSYoungGen: 12799K-> 12799K (14848K)] [ParOldGen: 33913K-> 33913K (34304K)] 46713K-> 46713K (49152K), [Metaspace: 2921K-> 2921K (1056768K)] , 0.4380009 сСкунд] [ВрСмя: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ = 1,05, систСмноС = 0,00, Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ = 0,44 сСкунды]
23,550: [ΠŸΠΎΠ»Π½Ρ‹ΠΉ GC (эргономика) [PSYoungGen: 12799K-> 12799K (14848K)] [ParOldGen: 33914K-> 33914K (34304K)] 46714K-> 46714K (49152K), [Metaspace: 2921K-> 2921K (1056768K)] , 0,4767477 сСкунд] [ВрСмя: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ = 1,15, систСмноС = 0,00, Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ = 0,48 сСкунды]
24.029: [ΠŸΠΎΠ»Π½Ρ‹ΠΉ GC (эргономика) [PSYoungGen: 12799K-> 12799K (14848K)] [ParOldGen: 33915K-> 33915K (34304K)] 46715K-> 46715K (49152K), [Metaspace: 2921K-> 2921K (1056768K)] , 0,41 сСкунд] [Times: user = 1.12 sys = 0.00, real = 0.42 secs] Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Β«mainΒ» java.lang.OutOfMemoryError: ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ ΠΏΡ€Π΅Π΄Π΅Π» Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов GC Π½Π° oom.main (oom.java:15)  

Будя ΠΏΠΎ частотС сообщСний Β«ΠŸΠΎΠ»Π½Ρ‹ΠΉ сборщик мусора» Π² Π΄Π°ΠΌΠΏΠ΅, ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ нСсколько подряд ΠΈΠ΄ΡƒΡ‰ΠΈΡ… ΠΏΠΎΠ»Π½Ρ‹Ρ… сборщиков мусора ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ пространство Π² ΠΊΡƒΡ‡Π΅ Java, Π½ΠΎ ΠΊΡƒΡ‡Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°, ΠΈ сборщики мусора Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ мСсто. Π­Ρ‚ΠΈ частыС ΠΏΠΎΠ»Π½Ρ‹Π΅ сборщики мусора Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ прилоТСния, замСдляя Π΅Π³ΠΎ сканированиС. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ прСдполагаСтся, Ρ‡Ρ‚ΠΎ трСбования прилоТСния ΠΊ ΠΊΡƒΡ‡Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ Java.Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этих ΠΏΠΎΠ»Π½Ρ‹Ρ… GC ΠΈ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ OutOfMemoryError. Π Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ Java ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° -Xmx JVM:

java –Xmx1024m –Xms1024m ВСст

OutOfMemoryError Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ памяти Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π£Ρ‚Π΅Ρ‡ΠΊΠΈ памяти часто ΠΎΡ‡Π΅Π½ΡŒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ, особСнно ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Π΅ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти. Как ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти происходит, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΊΡƒΡ‡Π΅, прСдотвращая ΠΈΡ… сборку мусора.Π­Ρ‚ΠΈ Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ расти Π² ΠΊΡƒΡ‡Π΅, Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ заполняя всС пространство ΠΊΡƒΡ‡ΠΈ Java, вызывая частыС сборки мусора ΠΈ, Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅, Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с OutOfMemoryError.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ всСгда рСкомСндуСтся Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»Π° GC, Π΄Π°ΠΆΠ΅ Π² производствСнных срСдах, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΈ устранСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ ΠΈΡ… возникновСния. Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ рСгистрации Π“Π₯ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  -XX: + PrintGCDetails
-XX: + PrintGCTimeStamps
-XX: + PrintGCDateStamps
-Xloggc: <Ρ„Π°ΠΉΠ» ΠΆΡƒΡ€Π½Π°Π»Π° gc>  

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ шагом Π² ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти являСтся отслСТиваниС активности прилоТСния.Live-set — это количСство ΠΊΡƒΡ‡ΠΈ Java, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ послС ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ GC. Если live-set увСличиваСтся с Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄Π°ΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ достигло ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ состояния ΠΈ находится ΠΏΠΎΠ΄ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ, это ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ памяти. ИспользованиС ΠΊΡƒΡ‡ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструмСнтов, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Java VisualVM, Java Mission Control ΠΈ JConsole, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΈΠ· ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² GC.

ΠšΡƒΡ‡Π° Java: сбор диагностичСских Π΄Π°Π½Π½Ρ‹Ρ…

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊΠΈΠ΅ диагностичСскиС Π΄Π°Π½Π½Ρ‹Π΅ слСдуСт ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ для устранСния ошибок OutOfMemoryErrors Π² ΠΊΡƒΡ‡Π΅ Java, Π° Ρ‚Π°ΠΊΠΆΠ΅ инструмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ диагностичСскиС Π΄Π°Π½Π½Ρ‹Π΅.

ΠžΡ‚Π²Π°Π»Ρ‹ ΠΊΡƒΡ‡ΠΈ

Π”Π°ΠΌΠΏΡ‹ ΠΊΡƒΡ‡ΠΈ — это самыС Π²Π°ΠΆΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ устранСнии ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти. Π”Π°ΠΌΠΏΡ‹ ΠΊΡƒΡ‡ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ jcmd, jmap, JConsole ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° JVM HeapDumpOnOutOfMemoryError, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

  • jcmd <ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса / основной класс> GC.heap_dump filename = heapdump.dmp
  • jmap -dump: format = b, file = snapshot.jmap pid
  • Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° JConsole с использованиСм Mbean HotSpotDiagnostic
  • -XX: + HeapDumpOnOutOfMemoryError
  java -XX: + PrintGCDetails -XX: + PrintGCTimeStamps -Xmx20m -XX: + HeapDumpOnOutOfMemoryError oom
0.402: [GC (сбой выдСлСния) [PSYoungGen: 5564K-> 489K (6144K)] 5564K-> 3944K (19968K), 0,0196154 сСкунды] [Times: user = 0,05 sys = 0,00, real = 0,02 сСкунды]
0,435: [GC (сбой выдСлСния) [PSYoungGen: 6000K-> 496K (6144K)] 9456K-> 8729K (19968K), 0,0257773 сСкунды] [Times: user = 0,05 sys = 0,00, real = 0,03 сСкунды]
0,469: [GC (сбой выдСлСния) [PSYoungGen: 5760K-> 512K (6144K)] 13994K-> 13965K (19968K), 0,0282133 сСкунды] [Times: user = 0,05 sys = 0,00, real = 0,03 сСкунды]
0,499: [Полная сборка мусора (эргономика) [PSYoungGen: 512K-> 0K (6144K)] [ParOldGen: 13453K-> 12173K (13824K)] 13965K-
> 12173K (19968K), [мСтапространство: 2922K-> 2922K (1056768K)], 0.6941054 с] [ВрСмя: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ = 1,45, систСмноС = 0,00, Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ = 0,69 с] 1,205: [Полная сборка мусора (эргономика) [PSYoungGen: 5632K-> 2559K (6144K)] [ParOldGen: 12173K-> 13369K (13824K)] 17805K-
> 15929K (19968K), [Metaspace: 2922K-> 2922K (1056768K)], 0,3933345 сСкунд] [Times: user = 0,69 sys = 0,00, real = 0,39 сСкунды]
1.606: [Полная GC (эргономика) [PSYoungGen: 4773K-> 4743K (6144K)] [ParOldGen: 13369K-> 13369K (13824K)] 18143K-
> 18113K (19968K), [Metaspace: 2922K-> 2922K (1056768K)], 0,3009828 сСкунд] [Times: user = 0.72 sys = 0,00, real = 0,30 сСкунды]
1.911: [ΠŸΠΎΠ»Π½Ρ‹ΠΉ GC (сбой выдСлСния) [PSYoungGen: 4743K-> 4743K (6144K)] [ParOldGen: 13369K-> 13357K (13824K)] 18113K-
> 18101K (19968K), [Metaspace: 2922K-> 2922K (1056768K)], 0,6486744 сСкунды] [Times: user = 1,43 sys = 0,00, real = 0,65 сСкунды]
java.lang.OutOfMemoryError: пространство ΠΊΡƒΡ‡ΠΈ Java
Π’Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΊΡƒΡ‡ΠΈ Π² java_pid26504.hprof ...
Π‘ΠΎΠ·Π΄Π°Π½ Ρ„Π°ΠΉΠ» Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ [30451751 Π±Π°ΠΉΡ‚ Π·Π° 0,510 сСкунды] Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ "main" java.lang.OutOfMemoryError: ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΊΡƒΡ‡ΠΈ Java

 Π² java.util.Arrays.copyOf (Arrays.java:3210)
 Π² java.util.Arrays.copyOf (Arrays.java:3181)
 Π² java.util.ArrayList.grow (ArrayList.java:261)
 Π² java.util.ArrayList.ensureExplicitCapacity (ArrayList.java:235)
 Π² java.util.ArrayList.ensureCapacityInternal (ArrayList.java:227)
 Π² java.util.ArrayList.add (ArrayList.java:458)
 Π² oom.main (oom.java:14)
  

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик мусора ΠΌΠΎΠΆΠ΅Ρ‚ постоянно ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ мСсто Π² ΠΊΡƒΡ‡Π΅, вызывая частыС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ»Π½Ρ‹Π΅ сборщики мусора, Π΄Π°ΠΆΠ΅ Ссли Π²Ρ‹Π³ΠΎΠ΄Π° ΠΎΡ‚ этих усилий Π½Π΅Π²Π΅Π»ΠΈΠΊΠ°, Π° ΠΊΡƒΡ‡Π° ΠΏΠΎΡ‡Ρ‚ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°.Π­Ρ‚ΠΎ влияСт Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ прилоТСния ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ систСмы Π² исходноС состояниС. Π­Ρ‚ΠΎΠΉ ситуации ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, настроив значСния для -XX: GCTimeLimit ΠΈ -XX: GCHeapFreeLimit .

GCTimeLimit устанавливаСт Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΠΏΡ€Π΅Π΄Π΅Π» Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ GC ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π°Ρ… ΠΎΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π•Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 98%. УмСньшСниС этого значСния сокращаСт допустимоС количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½ΠΎ Π½Π° сборку мусора. GCHeapFreeLimit устанавливаСт Π½ΠΈΠΆΠ½ΠΈΠΉ ΠΏΡ€Π΅Π΄Π΅Π» объСма пространства, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ свободСн послС сборки мусора, прСдставлСнный ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ ΠΎΡ‚ максимальной ΠΊΡƒΡ‡ΠΈ.Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ — 2%. Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ этого значСния ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сборщики мусора Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ большС мСста Π² ΠΊΡƒΡ‡Π΅. OutOfMemoryError выдаСтся послС ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ GC, Ссли ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ 5 ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… GC (ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ второстСпСнными ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΌΠΈ) Π½Π΅ смогли ΡƒΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ GC Π½ΠΈΠΆΠ΅ GCTimeLimit ΠΈ Π½Π΅ смогли ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ пространство GCHeapFreeLimit .

НапримСр, установка GCHeapFreeLimit Π½Π° 8 ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ сборщику мусора Π½Π΅ Π·Π°ΡΡ‚Ρ€ΡΡ‚ΡŒ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΠΎΠ»Π½Ρ‹Ρ… сборщиков мусора, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ 8% ΠΊΡƒΡ‡ΠΈ ΠΈ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ GCTimeLimit 5 Ρ€Π°Π· подряд. GC.

Гистограммы ΠΊΡƒΡ‡ΠΈ

Иногда Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ быстро Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ растСт Π² нашСй ΠΊΡƒΡ‡Π΅, минуя Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ сбора ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°ΠΌΠΏΠΎΠ² ΠΊΡƒΡ‡ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструмСнтов Π°Π½Π°Π»ΠΈΠ·Π° памяти. Гистограммы ΠΊΡƒΡ‡ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π°Ρ‚ΡŒ Π½Π°ΠΌ быстроС прСдставлСниС ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² нашСй ΠΊΡƒΡ‡Π΅, ΠΈ сравнСниС этих гистограмм ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ Π½Π°ΠΉΡ‚ΠΈ Π»ΡƒΡ‡ΡˆΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ Π² нашСй ΠΊΡƒΡ‡Π΅ Java.

  • -XX: + PrintClassHistogram ΠΈ Control + Break
  • jcmd <ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса / основной класс> GC.class_histogram filename = Myheaphistogram
  • jmap -histo pid
  • jmap -histo core_file

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ экзСмпляры String, Double, Integer ΠΈ Object [] Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ большС всСго мСста Π² ΠΊΡƒΡ‡Π΅ Java ΠΈ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈΡ… число растСт, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ памяти:

Java Записи ΠΏΠΎΠ»Π΅Ρ‚ΠΎΠ²

Flight Recordings с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ статистикой ΠΊΡƒΡ‡ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ ΠΏΡ€ΠΈ устранСнии ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти, показывая Π½Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΡƒΡ‡ΠΈ ΠΈ основныС источники Π² ΠΊΡƒΡ‡Π΅ с Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ статистику ΠΊΡƒΡ‡ΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Java Mission Control ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ «Бтатистику ΠΊΡƒΡ‡ΠΈΒ», пСрСйдя Π² «Окно-> ДиспСтчСр шаблонов записи ΠΏΠΎΠ»Π΅Ρ‚Π°Β», ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

Или ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Ρ„Π°ΠΉΠ»Ρ‹ .jfc, установив для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° heap-statistics-enabled Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true.

  
     true 
     everyChunk 
  

Записи ΠΏΠΎΠ»Π΅Ρ‚Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ созданы Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… способов:

  • ΠžΠΏΡ†ΠΈΠΈ Π±ΠΎΡ€Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ рСгистратора JVM, e.Π³Ρ€Π°ΠΌΠΌ.

-XX: + UnlockCommercialFeatures -XX: + FlightRecorder
-XX: StartFlightRecording = Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° = 20 с, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ = 60 с, имя = MyRecording,

имя_Ρ„Π°ΠΉΠ»Π° = C: \ TEMP \ myrecording.jfr, настройки = ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ

  • ДиагностичСская ΠΊΠΎΠΌΠ°Π½Π΄Π° Java: jcmd

jcmd 7060 JFR.start name = Настройки MyRecording = Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° профиля = 20 сСкунд ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ = 2 ΠΌ имя Ρ„Π°ΠΉΠ»Π° = c: \ TEMP \ myrecording.jfr

«Записи ΠΏΠΎΠ»Π΅Ρ‚Π°Β» ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°ΡŽΡ‰ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π΄Π°ΠΌΠΏΡ‹ ΠΊΡƒΡ‡ΠΈ.

Java Heap: Π°Π½Π°Π»ΠΈΠ· диагностичСских Π΄Π°Π½Π½Ρ‹Ρ…

Анализ Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ

Π”Π°ΠΌΠΏΠΎΠ² ΠΊΡƒΡ‡ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… инструмСнтов:

  • Eclipse MAT — (Memory Analyzer Tool) — инструмСнт, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ сообщСством для Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°ΠΌΠΏΠΎΠ² ΠΊΡƒΡ‡ΠΈ. Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚:
    • ΠŸΠΎΠ΄ΠΎΠ·Ρ€Π΅Π²Π°Π΅ΠΌΡ‹Π΅ Π½Π° ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ: ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ ΠΏΠΎΠ΄ΠΎΠ·Ρ€Π΅Π²Π°Π΅ΠΌΡ‹Ρ… Π² ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅, ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‰ΠΈΡ… ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ большой объСм ΠΊΡƒΡ‡ΠΈ
    • Гистограммы: пСрСчисляСт количСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² классС, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅Π»ΠΊΡƒΡŽ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΠ΅ΠΌΡƒΡŽ ΠΊΡƒΡ‡Ρƒ, ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡƒΡŽ этими ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π° гистограммС ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π± ΠΈ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠ΄ΠΎΠ·Ρ€Π΅Π²Π°Π΅ΠΌ, ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°Ρ‚ΡŒ. Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ гистограммы ΠΈΠ· Π΄Π²ΡƒΡ… Π΄Π°ΠΌΠΏΠΎΠ² ΠΊΡƒΡ‡ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ Π² количСствС экзСмпляров для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ Π»ΡƒΡ‡ΡˆΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ Π² ΠΊΡƒΡ‡Π΅ Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠΎΡ€Π½ΠΈ, ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΊΡƒΡ‡Π΅.
    • НСдостиТимыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹: ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ MAT состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ позволяСт Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ нСдостиТимыС / ΠΌΠ΅Ρ€Ρ‚Π²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² своСм Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ Π½Π°Π±ΠΎΡ€Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².Если ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСдоступны ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ собраны Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ†ΠΈΠΊΠ»Π΅ сборки мусора, ΠΈ нас ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ достиТимыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρ‚ΠΎΠ³Π΄Π° эта функция ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½Π°.
    • Duplicate Classes: ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ классы, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ нСсколькими Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°ΠΌΠΈ классов.
    • ΠŸΡƒΡ‚ΡŒ ΠΊ корням сборщика мусора: ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ссылок Π½Π° ΠΊΠΎΡ€Π½ΠΈ сборщика мусора (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ самой JVM), ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ Π·Π° сохранСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΠΊΡƒΡ‡Π΅.
    • OQL: ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ язык ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… запросов для исслСдования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π΄Π°ΠΌΠΏΠ°Ρ… ΠΊΡƒΡ‡ΠΈ.Π•Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ OQL ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ написаниС слоТных запросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π³Π»ΡƒΠ±ΠΆΠ΅ ΠΊΠΎΠΏΠ°Ρ‚ΡŒΡΡ Π² Π΄Π°ΠΌΠΏΠ°Ρ… ΠΊΡƒΡ‡ΠΈ.
  • Java VisualVM — ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ инструмСнт для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, профилирования ΠΈ устранСния Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Java. Он доступСн ΠΊΠ°ΠΊ инструмСнт JDK, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ с GitHub. Одна ΠΈΠ· Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ — Π°Π½Π°Π»ΠΈΠ· Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°ΠΌΠΏΡ‹ ΠΊΡƒΡ‡ΠΈ отслСТиваСмого прилоТСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…. Из Π΄Π°ΠΌΠΏΠΎΠ² ΠΊΡƒΡ‡ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ гистограммы классов, экзСмпляры класса, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΉΡ‚ΠΈ ΠΊΠΎΡ€Π½ΠΈ сборки мусора ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… экзСмпляров.
  • Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

  • jhat (Π² нашСй ΠΏΠ°ΠΏΠΊΠ΅ / bin.) ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Π°Π½Π°Π»ΠΈΠ· Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ, просматривая ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Π΄Π°ΠΌΠΏΠ΅ ΠΊΡƒΡ‡ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ любого Π²Π΅Π±-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Π΅Π±-сСрвСр запускаСтся Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ 7000. jhat ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ спСктр ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… запросов ΠΈ язык ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… запросов (OQL) для исслСдования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π΄Π°ΠΌΠΏΠ°Ρ… ΠΊΡƒΡ‡ΠΈ.
  • Плагин

  • JOverflow для Java Mission Control — ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ»Π°Π³ΠΈΠ½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Java Mission Control Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ простой Π°Π½Π°Π»ΠΈΠ· Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ ΠΈ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ, Π³Π΄Π΅ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π° Π²ΠΏΡƒΡΡ‚ΡƒΡŽ.
  • Yourkit ΠšΠΎΠΌΠΌΠ΅Ρ€Ρ‡Π΅ΡΠΊΠΈΠΉ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Java с Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ всСми функциями, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ инструмСнтами. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, YourKit ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚:
    • ΠžΠ±Π»Π°ΡΡ‚ΡŒ достиТимости: ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ доступныС ΠΈ нСдостиТимыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² соотвСтствии с ΠΈΡ… ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ достиТимости, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ сильно достиТимыми, слабо / мягко достиТимыми ΠΈΠ»ΠΈ нСдоступными.
    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° памяти: ВмСсто возмоТностСй ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… запросов YourKit ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ встроСнных запросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² поисках Π°Π½Ρ‚ΠΈΡˆΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ.

Π― довольно часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Eclipse MAT ΠΈ ΡΡ‡ΠΈΡ‚Π°ΡŽ Π΅Π³ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ Π΄Π°ΠΌΠΏΠΎΠ² ΠΊΡƒΡ‡ΠΈ.

MAT ΠΎΠ±ΠΎΠ³Π°Ρ‰Π΅Π½ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΌΠΈ функциями, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ гистограммы ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сравнСния ΠΈΡ… с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ гистограммами. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ растСт Π² памяти ΠΈ сохраняСт максимальноС пространство Π² ΠΊΡƒΡ‡Π΅ Java. Одна ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ½Π΅ ΠΎΡ‡Π΅Π½ΡŒ нравятся, — это Β«ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ ΠΊ корням сборщика мусора», которая ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ слСды ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², отвСтствСнныС Π·Π° сохранСниС Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².НапримСр, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ссылок ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ThreadLocalDateFormat удСрТиваСтся Π² ΠΊΡƒΡ‡Π΅ ΠΏΠΎΠ»Π΅ΠΌ Β«Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ThreadLocalMap $ Entry. Пока запись ThreadLocalMap $ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½Π° ΠΈΠ· ThreadLocalMap, ThreadLocalDateFormat Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒΡΡ.

  weblogic.work.ExecuteThread @ 0x6996963a8 [ΠΠšΠ’Π˜Π’ΠΠ«Π™] ExecuteThread: '203' для ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ: 'weblogic.kernel.Default (самонастройка)' ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ занятости, ΠΏΠΎΡ‚ΠΎΠΊ | 1 | 176 | 40 | 10 536

'- threadLocals java.lang.ThreadLocal $ ThreadLocalMap @ 0x69c2b5fe0 | 1 | 24 | 40 | 7 560

'- Ρ‚Π°Π±Π»ΠΈΡ†Π° java.lang.ThreadLocal $ ThreadLocalMap $ Entry [256] @ 0x6a0de2e40 | 1 | 1,040 | 40 | 7 536

'- [116] java.lang.ThreadLocal $ ThreadLocalMap $ Entry @ 0x69c2ba050 | 1 | 32 | 40 | 1,088

'- Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ weblogic.utils.string.ThreadLocalDateFormat @ 0x69c23c418 | 1 | 40 | 40 | 1,056
  

ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΉΡ‚ΠΈ ΠΊΠΎΡ€Π½ΠΈ Π»ΡƒΡ‡ΡˆΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ Π² нашСй ΠΊΡƒΡ‡Π΅ ΠΈ Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΡ‚Π΅ΠΊΠ°Π΅Ρ‚ Π² памяти.

Java Mission Control

Java Mission Control находится Π² ΠΏΠ°ΠΏΠΊΠ΅ / bin JDK.Записи ΠΏΠΎΠ»Π΅Ρ‚Π°, собранныС с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ статистикой ΠΊΡƒΡ‡ΠΈ, ΠΌΠΎΠ³ΡƒΡ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π² устранСнии ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ статистику ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠŸΠ°ΠΌΡΡ‚ΡŒ-> Бтатистика ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’ этом прСдставлСнии отобраТаСтся гистограмма ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ ΠΊΡƒΡ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π°ΠΌ, Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ Π² ΠΊΡƒΡ‡Π΅, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€ΡΠΌΡƒΡŽ связь с ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°ΡŽΡ‰ΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.

OutOfMemoryError ΠΈΠ·-Π·Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ

Ошибка OutOfMemoryError Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½Ρ‹ΠΌ использованиСм Ρ„ΠΈΠ½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ².ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с Ρ„ΠΈΠ½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ finalize ()) ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ восстановлСниС Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΈΠΌΠΈ пространства. ΠŸΠΎΡ‚ΠΎΠΊ Ρ„ΠΈΠ½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ finalize () экзСмпляров, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ эти экзСмпляры ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ восстановлСны ΠΈ ΠΈΡ… пространство ΠΊΡƒΡ‡ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ освобоТдСно. Если ΠΏΠΎΡ‚ΠΎΠΊ Ρ„ΠΈΠ½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π½Π΅ успСваСт Π·Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ становятся доступными для Ρ„ΠΈΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Ρ„ΠΈΠ½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΌΠΎΠ³ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ finalize ()), JVM ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· строя с OutOfMemoryError, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡŽΡ‚ΡΡ. Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Ρ„ΠΈΠ½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π±Ρ‹Π»ΠΈ Π΄ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹ ΠΊ сбору.ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π½Π΅ заканчиваСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠ·-Π·Π° большого количСства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ инструмСнты для отслСТивания количСства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ:

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ JConsole ΠΊ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΌΡƒ процСссу ΠΈ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ количСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π½Π° страницС сводки Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ рисункС.

  D: \ tests \ GC_WeakReferences> jmap -finalizerinfo 29456
ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΊ процСссу с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ 29456, ΠΏΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅...
ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½. ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ компилятор сСрвСра.
ВСрсия JVM - 25.122-b08.
ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠΈ: 10
  

ΠŸΠΎΡ‡Ρ‚ΠΈ всС инструмСнты Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Ρ‹.

Π’Ρ‹Π²ΠΎΠ΄ ΠΈΠ· Java VisualVM

  Π”Π°Ρ‚Π° съСмки: ΠŸΡ‚, 6 января, 14:48:54 PST 2017
Π€Π°ΠΉΠ»: D: \ tests \ java_pid19908.hprof
Π Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°: 11.3 ΠœΠ‘
 
ВсСго Π±Π°ΠΉΡ‚: 10,359,516
ВсСго классов: 466
ВсСго экзСмпляров: 105 182
Π—Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΈ классов: 2
ΠšΠΎΡ€Π½ΠΈ GC: 419
ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠΈ: 2
  

java.lang.OutOfMemoryError: PermGen space

Как ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, PermGen Π±Ρ‹Π» ΡƒΠ΄Π°Π»Π΅Π½ Π² Java 8, поэтому, Ссли Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π½Π° Java 8 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ вСрсии, Π½Π΅ ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ этот Ρ€Π°Π·Π΄Π΅Π».

Π’ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ Java 7 PermGen (сокращСниС ΠΎΡ‚ «постоянная гСнСрация») использовался для хранСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ классов ΠΈ ΠΈΡ… ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ…. НСоТиданный рост PermGen ΠΈΠ»ΠΈ OutOfMemoryError Π² этом пространствС памяти ΠΎΠ·Π½Π°Ρ‡Π°Π», Ρ‡Ρ‚ΠΎ Π»ΠΈΠ±ΠΎ классы Π½Π΅ Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π»ΠΈΠ±ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ PermGen слишком ΠΌΠ°Π» для размСщСния всСх Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… классов ΠΈ ΠΈΡ… ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ….

Π§Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ PermGen соотвСтствуСт трСбованиям прилоТСния, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ использованиС ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ JVM:

–XX: PermSize = n –XX: MaxPermSize = m

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ OutOfMemoryError для MetaSpace:

java.lang.OutOfMemoryError: Metaspace

Начиная с Java 8, ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ класса хранятся Π² Metaspace. Metaspace Π½Π΅ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΊΡƒΡ‡ΠΈ Java ΠΈ выдСляСтся ΠΈΠ· собствСнной памяти.Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ объСмом встроСнной памяти, доступной Π½Π° машинС. Однако Ρ€Π°Π·ΠΌΠ΅Ρ€ мСтапространства ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° MaxMetaspaceSize .

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с ошибкой OutOfMemoryError для Metaspace, Ссли ΠΈ ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ использованиС достигнСт максимального ΠΏΡ€Π΅Π΄Π΅Π»Π°, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² MaxMetaspaceSize . Как ΠΈ Π² случаС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ пространствами, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связано с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Metaspace ΠΈΠ»ΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° классов / классов. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим инструмСнты диагностики, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для устранСния ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти Π² Metaspace.

java.lang.OutOfMemoryError: сТатоС пространство классов

Если UseCompressedClassesPointers Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ (Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ UseCompressedOops), Ρ‚ΠΎ для классов ΠΈ ΠΈΡ… ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ области собствСнной памяти. Π’ UseCompressedClassesPointers 64-Π±ΠΈΡ‚Π½Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ классов прСдставлСны 32-Π±ΠΈΡ‚Π½Ρ‹ΠΌΠΈ значСниями, ΠΈ эти сТатыС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ классов хранятся Π² сТатом пространствС классов. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π·ΠΌΠ΅Ρ€ сТатого пространства классов составляСт 1 Π“Π‘, ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CompressedClassSpaceSize.
MaxMetaspaceSize устанавливаСт Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΠΏΡ€Π΅Π΄Π΅Π» ΠΎΠ±Ρ‰Π΅Π³ΠΎ зафиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠ±Π΅ΠΈΡ… этих областСй — Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ пространства сТатого пространства класса ΠΈ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… класса.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² GC с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ UseCompressedClassesPointers. ЗарСгистрированныС ΠΈ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ пространства, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ для Metaspace, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½Π½ΠΎΠ΅ ΠΈ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ пространство для сТатого пространства класса.

  Metaspace использовано 2921K, Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ 4486K, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ 4864K, Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ 1056768K
  ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ пространство класса 288K, Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ 386K, Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ 512K, Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ 1048576K  

PermGen ΠΈ Metaspace: инструмСнты сбора ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ…

Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅

PermGen ΠΈ Metaspace ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Java Mission Control, Java VisualVM ΠΈ JConsole.Π–ΡƒΡ€Π½Π°Π»Ρ‹ GC ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ использованиС PermGen / Metaspace Π΄ΠΎ ΠΈ послС ΠΏΠΎΠ»Π½Ρ‹Ρ… GC, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»Π½Ρ‹Π΅ GC ΠΈΠ·-Π·Π° пСрСполнСния PermGen / Metaspace.

Π’Π°ΠΊΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ классы Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ этого ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚. Π—Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΡƒ классов ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ:

-XX: + TraceClassUnloading –XX: + TraceClassLoading

Π’Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ синдромС, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ прилоТСния Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ JVM ΠΎΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΊ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠ°Π³ΡƒΠ±Π½Ρ‹ΠΌ послСдствиям.Один ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² — -Xnoclassgc, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ JVM Π½Π΅ Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ классы Π²ΠΎ врСмя сборки мусора. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ большоС количСство классов ΠΈΠ»ΠΈ Π²ΠΎ врСмя выполнСния ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ классов становится нСдоступным, ΠΈ ΠΎΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½Π°Π±ΠΎΡ€ Π½ΠΎΠ²Ρ‹Ρ… классов, Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с –Xnoclassgc , Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ рискуСт достигаСт максимальной Смкости PermGen / Metaspace ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚Π΅Ρ€ΠΏΠΈΡ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ с OutOfMemoryError. Π˜Ρ‚Π°ΠΊ, Ссли Π²Ρ‹ Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹Π»Π° ΡƒΠΊΠ°Π·Π°Π½Π° эта опция, рСкомСндуСтся ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΅Π΅ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ сборщику мусора Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ классы всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ подходят для сбора.

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… классов ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΈΠΌΠΈ памяти ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Native Memory Tracker (NMT). ΠœΡ‹ обсудим этот инструмСнт ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½ΠΈΠΆΠ΅, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«OutOfMemoryError: собствСнная ΠΏΠ°ΠΌΡΡ‚ΡŒΒ».

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ для Concurrent MarkSweep Collector (CMS) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ классы Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Π»ΠΈΡΡŒ с ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ сбора Π΄Π°Π½Π½Ρ‹Ρ… CMS: –XX: + CMSClassUnloadingEnabled

Π’ Java 7 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого Ρ„Π»Π°Π³Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ — false, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² Java 8 ΠΎΠ½ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

jmap

Β«jmap –permstatΒ» прСдставляСт статистику Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° классов, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΈ классов, количСство классов, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… этими Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°ΠΌΠΈ классов, ΠΈ Ρ‚ΠΎ, ΠΆΠΈΠ²Ρ‹ Π»ΠΈ эти Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΈ классов. Он Ρ‚Π°ΠΊΠΆΠ΅ сообщаСт Π½Π°ΠΌ ΠΎΠ±Ρ‰Π΅Π΅ количСство ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… строк, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² PermGen, ΠΈ количСство Π±Π°ΠΉΡ‚ΠΎΠ², занятых Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ классами ΠΈ ΠΈΡ… ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Вся эта информация ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° для опрСдСлСния Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ PermGen. Π’ΠΎΡ‚ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† распСчатки, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰Π΅ΠΉ всю эту статистику.Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ сводку Π² послСднСй строкС списка.

  $ jmap -permstat 29620
ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΊ процСссу с ID 29620, ΠΏΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅ ...
ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½. ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ клиСнтский компилятор.
ВСрсия JVM - 24.85-b06.
12674 Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… строки, Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠ΅ 1082616 Π±Π°ΠΉΡ‚. поиск экзСмпляров Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° классов ..
 сдСлано. вычислСний Π½Π° статистику Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° .. Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ. ΠΏΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅ .. вычислСниС ТивучСсти ......................................... Π³ΠΎΡ‚ΠΎΠ²ΠΎ.
class_loader классы Π±Π°ΠΉΡ‚ΠΎΠ² parent_loader ΠΆΠΈΠ²Ρ‹? Ρ‚ΠΈΠΏ
 1846 5321080 null live <Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ>
0xd0bf3828 0 0 null live sun / Ρ€Π°Π·Π½ΠΎΠ΅ / Launcher $ ExtClassLoader @ 0xd8c98c78
0xd0d2f370 1904 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0c99280 1 1440 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0b71d90 0 0 0xd0b5b9c0 live java / util / ResourceBundle $ RBClassLoader @ 0xd8d042e8
0xd0d2f4c0 1904 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0b5bf98 1920 0xd0b5bf38 ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0c99248 1904 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0d2f488 1904 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0b5bf38 6 11832 0xd0b5b9c0 ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / Ρ€Π°Π·Π½ΠΎΠ΅ / MethodUtil @ 0xd8e8e560
0xd0d2f338 1904 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0d2f418 1904 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0d2f3a8 1904 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0b5b9c0 317 1397448 0xd0bf3828 live sun / misc / Launcher $ AppClassLoader @ 0xd8cb83d8
0xd0d2f300 1904 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0d2f3e0 1904 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0ec3968 1 1440 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0e0a248 1904 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0c99210 1904 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0d2f450 1904 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0d2f4f8 1904 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
0xd0e0a280 1904 null ΠΌΠ΅Ρ€Ρ‚Π²ΠΎΠ΅ солнцС / ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ / DelegatingClassLoader @ 0xd8c22f50
 
всСго = 22 2186 6746816 Н / Π” ΠΆΠΈΠ² = 4, ΠΌΠ΅Ρ€Ρ‚Π² = 18 Н / Π”
  

Начиная с Java 8, jmap –clstats Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°Ρ… классов ΠΈ ΠΈΡ… ТизнСспособности, Π½ΠΎ ΠΏΡ€ΠΈ этом отобраТаСтся количСство ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ классов, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Π² Metaspace вмСсто PermGen

.

  jmap -clstats 26240
ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΊ процСссу с ID 26240, ΠΏΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅...
ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½. ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ компилятор сСрвСра. ВСрсия JVM - 25.66-b00, поиск экзСмпляров Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° классов ..done. вычислСний Π½Π° статистику Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° .. Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ. поТалуйста, ΠΏΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅ .. вычислСниС ТивучСсти. Π°Π½Π°Π»ΠΈΠ· Тивости ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ ...
class_loader классы Π±Π°ΠΉΡ‚ΠΎΠ² parent_loader ΠΆΠΈΠ²Ρ‹? Ρ‚ΠΈΠΏ
 513 950353 null live 
0x0000000084e066d0 8 24416 0x0000000084e06740 live sun / misc / Launcher $ AppClassLoader @ 0x0000000016bef6a0
0x0000000084e06740 0 0 null live sun / misc / Launcher $ ExtClassLoader @ 0x0000000016befa48
0x0000000084ea18f0 0 0 0x0000000084e066d0 ΠΌΠ΅Ρ€Ρ‚Π²Ρ‹ΠΉ java / util / ResourceBundle $ RBClassLoader @ 0x0000000016c33930
 
всСго = 4521 974769 Н / Π” ΠΆΠΈΠ² = 3, ΠΌΠ΅Ρ€Ρ‚Π² = 1 Н / Π”
  

ΠžΡ‚Π²Π°Π»Ρ‹ ΠΊΡƒΡ‡ΠΈ

Как ΠΌΡ‹ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅, Eclipse MAT, jhat, Java VisualVM, JOverflow JMC plugin ΠΈ Yourkit — это Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· инструмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°ΠΌΠΏΡ‹ ΠΊΡƒΡ‡ΠΈ для Π°Π½Π°Π»ΠΈΠ·Π° OutOfMemoryErrors.Но Π΄Π°ΠΌΠΏΡ‹ ΠΊΡƒΡ‡ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ для устранСния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ PermGen ΠΈ Metaspace. Eclipse MAT ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΡ€ΠΈΡΡ‚Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Β«Π”ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Ρ‹ классов», которая ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π»ΡŽΠ±Ρ‹Π΅ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ нСсколько Ρ€Π°Π· Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ экзСмплярами Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° классов. НСкотороС ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ количСство ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ классов, Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°ΠΌΠΈ классов, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ Π΄ΠΈΠ·Π°ΠΉΠ½Π° прилоТСния. Но Ссли ΠΎΠ½ΠΈ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ расти, это Ρ‚Ρ€Π΅Π²ΠΎΠΆΠ½Ρ‹ΠΉ сигнал, ΠΈ это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ расслСдования. Π­Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто встрСчаСтся Π² прилоТСниях, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Ρ… Π½Π° сСрвСрС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠΌ экзСмплярС JVM ΠΈ Π½Π΅ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ нСсколько Ρ€Π°Π·.Если ΠΏΡ€ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Π΅ развСртывания прилоТСния Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ освобоТдСны всС ссылки Π½Π° созданныС ΠΈΠΌ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΈ классов, JVM Π½Π΅ смоТСт Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ классы, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ этими Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°ΠΌΠΈ классов, ΠΈ Π½ΠΎΠ²ΠΎΠ΅ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ прилоТСния Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ этих классов. с Π½ΠΎΠ²Ρ‹ΠΌ экзСмпляром Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° классов.

Π­Ρ‚ΠΎΡ‚ снимок ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ ΠΊΠΎΠΏΠΈΠΈ классов, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… JaxbClassLoader, ΠΈ это происходило ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ создавало Π½ΠΎΠ²Ρ‹Π΅ экзСмпляры JAXBContext для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ привязки классов XML ΠΊ Java.

jcmd

jcmd GC.class_stats прСдоставляСт Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… классов, позволяя Π½Π°ΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ пространство, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ классом Π² Metaspace, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

  jcmd 2752 GC.class_stats 2752:
ИндСкс Super InstBytes Аннотации KlassBytes CpAll MethodCount Π‘Π°ΠΉΡ‚-ΠΊΠΎΠ΄Ρ‹ MethodAll ROAll RWAll ВсСго ClassName
1 357 821632 536 0 352 2 13 616 184 1448 1632 java.lang.ref.WeakReference
2-1 295272 480 0 0 0 0 0 24 584 608 [Ljava.lang.Object;
3-1 214552 480 0 0 0 0 0 24 584 608 [К
4-1 120400 480 0 0 0 0 0 24 584 608 [B
5 35 78912 624 0 8712 94 4623 26032 12136 24312 36448 java.lang.String
6 35 67112 648 0 19384 130 4973 25536 16552 30792 47344 java.lang.Class
7 9 24680 560 0 384 1 10 496232 1432 1664 java.util.LinkedHashMap $ Entry
8 -1 13216 480 0 0 0 0 0 48 584 632 [Ljava.lang.String;
9 35 12032 560 0 1296 7 149 1520 880 2808 3688 java.util.HashMap $ Π£Π·Π΅Π»
10-1 8416 480 0 0 0 0 0 32 584 616 [Ljava.util.HashMap $ Node;
11-1 6512 480 0 0 0 0 0 24 584 608 [I
12 358 5688 720 0 5816 44 1696 8808 5920 10136 16056 java.lang.reflect.Field
13 319 4096 568 0 4464 55 3260 11496 7696 9664 17360 java.lang.Integer
14 357 3840 536 0584 3 56 496 344 1448 1792 java.lang.ref.SoftReference
15 35 3840 584 0 1424 8240 1432 1048 2712 3760 java.util.Hashtable $ Entry
16 35 2632 736 368 8512 74 2015 13512 8784 15592 24376 java.lang.Thread
17 35 2496 504 0 9016 42 2766 9392 6984 12736 19720 java.net.URL
18 35 2368 568 0 1344 8 223 1408 1024 2616 3640 java.util.concurrent.ConcurrentHashMap $ Π£Π·Π΅Π»
… …
577 35 0544 0 1736 3 136 616 640 2504 3144 sun.util.locale.provider.SPILocaleProviderAdapter $ 1
578 35 0 496 0 2736 8 482 1688 1328 3848 5176 sun.util.locale.provider.TimeZoneNameUtility
579 35 0528 0776 3 35 472424 1608 2032 вс.util.resources.LocaleData $ 1
580 442 0 608 0 1704 10290 1808 1176 3176 4352 sun.util.resources.OpenListResourceBundle
581 580 0 608 0760 5 70 7 1848 2312 sun.util.resources.TimeZoneNamesBundle
          1724488 357208 1536 1117792 7754 311937 1527952 1014880 2181776 3196656 Π˜Ρ‚ΠΎΠ³ΠΎ
            53,9% 11,2% 0,0% 35,0% - 9,8% 47,8% 31,7% 68,3% 100,0%
ИндСкс Super InstBytes Аннотации KlassBytes CpAll MethodCount Π‘Π°ΠΉΡ‚-ΠΊΠΎΠ΄Ρ‹ MethodAll ROAll RWAll ВсСго ClassName
  

Из этого Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… классов ( ClassName ), Π±Π°ΠΉΡ‚Ρ‹, занятыС ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ классом (K lassBytes ), Π±Π°ΠΉΡ‚Ρ‹, занятыС экзСмплярами ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса (InstBytes), количСство ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ классС ( MethodCount ), пространство, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°ΠΌΠΈ ( ByteCodes), ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² Java 8 эта диагностичСская ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ процСсс Java запускался с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ‑XX: + UnlockDiagnosticVMOptions.

  jcmd 33984 GC.class_stats 33984:
Для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ GC.class_stats трСбуСтся -XX: + UnlockDiagnosticVMOptions
  

-XX: + UnlockDiagnosticVMOption Π½Π΅ трСбуСтся Π² Java 9 для этой диагностичСской ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

НСкоторыС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ OutOfMemoryError для собствСнной памяти:
OutOfMemoryError ΠΈΠ·-Π·Π° Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ мСста ΠΏΠΎΠ΄ΠΊΠ°Ρ‡ΠΊΠΈ:

  # Π‘Ρ€Π΅Π΄Π° выполнСния Java ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»Π° Ρ„Π°Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ:
 
#
# Π―Π²Π°.lang.OutOfMemoryError: Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½ΠΎ 32756 Π±Π°ΠΉΡ‚ для ChunkPool :: allocate. НСт мСста для ΠΏΠΎΠ΄ΠΊΠ°Ρ‡ΠΊΠΈ?
#
# ВнутрСнняя ошибка (allocation.cpp: 166), pid = 2290, tid = 27 # Ошибка: ChunkPool :: allocate  

OutOfMemoryError ΠΈΠ·-Π·Π° Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти процСсса :

  # Π‘Ρ€Π΅Π΄Π° выполнСния Java ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»Π° Ρ„Π°Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ:
#
# java.lang.OutOfMemoryError: Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ собствСнный ΠΏΠΎΡ‚ΠΎΠΊ  

Π­Ρ‚ΠΈ ошибки ясно говорят Π½Π°ΠΌ, Ρ‡Ρ‚ΠΎ JVM Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠ· собствСнной памяти, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ сам процСсс потрСбляСт всю Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈΠ»ΠΈ Π² систСмС Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ процСссы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ³Π»ΠΎΡ‰Π°ΡŽΡ‚ родная ΠΏΠ°ΠΌΡΡ‚ΡŒ.ПослС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° использования собствСнной ΠΊΡƒΡ‡ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pmap (ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… инструмСнтов сопоставлСния собствСнной памяти) ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ настройки ΠΊΡƒΡ‡ΠΈ Java, количСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² стСка, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π±ΠΎΡ‚Ρ‹ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ достаточно мСста для собствСнной ΠΊΡƒΡ‡ΠΈ, Ссли ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ использованиС собствСнной ΠΊΡƒΡ‡ΠΈ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ растСт, ΠΈ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ сталкиваСмся с ошибкой OutOfMemoryError, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ собствСнной памяти.

Native Heap OutOfMemoryError с 64-Π±ΠΈΡ‚Π½ΠΎΠΉ JVM

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с 32-разрядной JVM ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ процСсса составляСт 4 Π“Π‘, поэтому Π±ΠΎΠ»Π΅Π΅ вСроятно, Ρ‡Ρ‚ΠΎ Ρƒ вас закончится внутрСнняя ΠΏΠ°ΠΌΡΡ‚ΡŒ с 32-разрядными процСссами Java.Однако ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с 64-Π±ΠΈΡ‚Π½ΠΎΠΉ JVM ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ доступ ΠΊ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ памяти, ΠΈ тСхничСски ΠΌΡ‹ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ закончится собствСнная ΠΊΡƒΡ‡Π°. Но Π½Π° самом Π΄Π΅Π»Π΅ это Π½Π΅ Ρ‚Π°ΠΊ, ΠΈ Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ошибки OutOfMemoryErrors собствСнной ΠΊΡƒΡ‡ΠΈ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ΠΈ Π² 64-Π±ΠΈΡ‚Π½ΠΎΠΉ JVM. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² 64-разрядной JVM ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° функция CompressedOops, ΠΈ рСализация этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ опрСдСляСт, Π³Π΄Π΅ Π² адрСсном пространствС Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π° ΠΊΡƒΡ‡Π° Java. ПолоТСниС ΠΊΡƒΡ‡ΠΈ Java ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ собствСнной памяти.Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠ°Ρ€Ρ‚Π° памяти ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Java Heap выдСляСтся Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Π΅ адрСса 8 Π“Π‘, оставляя ΠΎΠΊΠΎΠ»ΠΎ 4 Π“Π‘ пространства для собствСнной ΠΊΡƒΡ‡ΠΈ. Если это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ интСнсивно выдСляСт ΠΈΠ· собствСнной памяти ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ 4 Π“Π‘, ΠΎΠ½ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ OutOfMemoryError ΠΈΠ· собствСнной ΠΊΡƒΡ‡ΠΈ, Π΄Π°ΠΆΠ΅ Ссли Π² систСмС достаточно памяти.

  0000000100000000 8K r-x-- /sw/.es-base/sparc/pkg/jdk-1.7.0_60/bin/sparcv9/java
0000000100100000 8K rwx-- /sw/.es-base/sparc/pkg/jdk-1.7.0_60 / bin / sparcv9 / java
0000000100102000 56K rwx-- [ΠΊΡƒΡ‡Π°]
0000000100110000 2624K rwx-- [ΠΊΡƒΡ‡Π°] <--- собствСнная ΠΊΡƒΡ‡Π°
00000001FB000000 24576K rw --- [anon] <--- Java Heap начинаСтся здСсь
0000000200000000 1396736K rw --- [Π°Π½ΠΎΠ½]
0000000600000000 700416K rw --- [Π°Π½ΠΎΠ½]
  

Π­Ρ‚Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -XX: HeapBaseMinAddress = n, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ адрСс, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ ΠΊΡƒΡ‡Π° Java. Установка Π±ΠΎΠ»Π΅Π΅ высокого адрСса оставит большС мСста для собствСнной ΠΊΡƒΡ‡ΠΈ.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΎ диагностикС, устранСнии Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ ΠΈ ΠΎΠ±Ρ…ΠΎΠ΄Π΅ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ см. Π—Π΄Π΅ΡΡŒ:

БобствСнная ΠΊΡƒΡ‡Π°: срСдства диагностики

Π”Π°Π²Π°ΠΉΡ‚Π΅ взглянСм Π½Π° инструмСнты обнаруТСния ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ собствСнной памяти.

ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ собствСнной памяти

JVM ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠΎΡ‰Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Native Memory Tracking (NMT), ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для отслСТивания собствСнной памяти, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ JVM. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π²Π½Π΅ JVM ΠΈΠ»ΠΈ собствСнными Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ.Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° простых шага, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ использованиС собствСнной памяти JVM:

  • Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ процСсс с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ NMT. Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСн Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ «сводка» ΠΈΠ»ΠΈ «дСтализация»:
    • -XX: NativeMemoryTracking = сводка
    • -XX: NativeMemoryTracking = Π΄Π΅Ρ‚Π°Π»ΡŒ
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ jcmd для получСния свСдСний ΠΎΠ± использовании собствСнной памяти:
    • jcmd VM.native_memory

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π° NMT:

  d: \ tests> jcmd  VM.native_memory :
ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ собствСнной памяти:
Π˜Ρ‚ΠΎΠ³ΠΎ: Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 3431296 ΠšΠ‘, зафиксировано = 2132244 ΠšΠ‘
- Java Heap (Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 2017280 ΠšΠ‘, зафиксировано = 2017280 ΠšΠ‘)
            (mmap: Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 2017280 ΠšΠ‘, зафиксировано = 2017280 ΠšΠ‘)
- Класс (Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 1062088 ΠšΠ‘, зафиксировано = 10184 ΠšΠ‘)
            (классы β„–411)
            (malloc = 5320 ΠšΠ‘, # 190)
            (mmap: Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 1056768 ΠšΠ‘, зафиксировано = 4864 ΠšΠ‘)
- Π’Π΅ΠΌΠ° (Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 15423 ΠšΠ‘, зафиксировано = 15423 ΠšΠ‘)
            (ΠΏΠΎΡ‚ΠΎΠΊ # 16)
            (стСк: Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 15360 ΠšΠ‘, зафиксировано = 15360 ΠšΠ‘)
            (malloc = 45 ΠšΠ‘ # 81)
            (arena = 18KB # 30)
- Код (Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 249658 ΠšΠ‘, зафиксировано = 2594 ΠšΠ‘)
            (malloc = 58 ΠšΠ‘ # 348)
            (mmap: Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 249600 ΠšΠ‘, зафиксировано = 2536 ΠšΠ‘)
- GC (Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 79628 ΠšΠ‘, зафиксировано = 79544 ΠšΠ‘)
            (malloc = 5772 ΠšΠ‘ # 118)
            (mmap: Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 73856 ΠšΠ‘, зафиксировано = 73772 ΠšΠ‘)
- ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ (Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 138 ΠšΠ‘, зафиксировано = 138 ΠšΠ‘)
            (malloc = 8 ΠšΠ‘ # 41)
            (arena = 131KB # 3)
- Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ (Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 5380 ΠšΠ‘, зафиксировано = 5380 ΠšΠ‘)
            (malloc = 5316 ΠšΠ‘ # 1357)
            (mmap: Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 64 ΠšΠ‘, зафиксировано = 64 ΠšΠ‘)
- Π‘ΠΈΠΌΠ²ΠΎΠ» (Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 1367 ΠšΠ‘, зафиксировано = 1367 ΠšΠ‘)
            (malloc = 911 ΠšΠ‘ # 112)
            (arena = 456KB # 1)
- ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ собствСнной памяти (Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 118 ΠšΠ‘, зафиксировано = 118 ΠšΠ‘)
            (malloc = 66 ΠšΠ‘ # 1040)
            (Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π½Π° отслСТиваниС = 52 ΠšΠ‘)
- Arena Chunk (Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ = 217 ΠšΠ‘, зафиксировано = 217 ΠšΠ‘)
            (malloc = 217 ΠšΠ‘)
  

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ±ΠΎ всСх ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… jcmd для доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ NMT ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΡ… Π²Ρ‹Π²ΠΎΠ΄, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ здСсь.

БрСдства обнаруТСния ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ встроСнной памяти

Π’ случаС ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ собствСнной памяти, происходящих ΠΈΠ·Π²Π½Π΅ JVM, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° инструмСнты ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ собствСнной памяти для ΠΈΡ… обнаруТСния ΠΈ устранСния Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ. НативныС инструмСнты, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ dbx, libumem, valgrind, purify ΠΈ Ρ‚. Π”., ΠœΠΎΠ³ΡƒΡ‚ спасти нас ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с внСшними ΡƒΡ‚Π΅Ρ‡ΠΊΠ°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ памяти JVM.

Π‘Π²ΠΎΠ΄ΠΊΠ°

УстранСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ слоТным ΠΈ слоТным Π΄Π΅Π»ΠΎΠΌ, Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ инструмСнтов ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.Как ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, Java HotSpot JVM сообщаСт ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ°Ρ… сообщСний OutOfMemoryError, ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ эти сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ спСктр инструмСнтов диагностики ΠΈ устранСния Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ Π² нашСм Π½Π°Π±ΠΎΡ€Π΅ инструмСнтов для диагностики ΠΈ устранСния этих ошибок. ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Об Π°Π²Ρ‚ΠΎΡ€Π΅

ΠŸΡƒΠ½Π°ΠΌ ΠŸΠ°Ρ€Ρ…Π°Ρ€ , Π² настоящСС врСмя ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ ΠΏΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ JVM Π² Oracle, Π³Π΄Π΅ Π΅Π΅ основная ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ JVM JRockit ΠΈ HotSpot.Она Π»ΡŽΠ±ΠΈΡ‚ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΈ устранСниС Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ, ΠΈ всСгда сосрСдоточСна Π½Π° ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΈ удобства обслуТивания ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ JVM. Она Ρ€Π΅ΡˆΠΈΠ»Π° мноТСство слоТных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ со сборкой мусора Π² JVM HotSpot ΠΈ ΡƒΠ²Π»Π΅Ρ‡Π΅Π½Π° ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ΠΌ инструмСнтов ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ удобства обслуТивания ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ поиск ΠΈ устранСниС Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ, связанных со сборщиком мусора, Π² JVM. ΠŸΡ‹Ρ‚Π°ΡΡΡŒ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ ΠΈ сообщСству Java, ΠΎΠ½Π° дСлится своим ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ ΠΈ знаниями Π² Π±Π»ΠΎΠ³Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π΅Π΄Π΅Ρ‚ здСсь.

Monitor Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Java с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, APM ΠΈ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ²

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Java (JVM) динамичСски управляСт ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ для Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, гарантируя, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅. Но любой, ΠΊΡ‚ΠΎ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ сталкивался с ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ java.lang.OutOfMemoryError , Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ этот процСсс ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹ΠΌ - Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ большС памяти, Ρ‡Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ JVM. Или, ΠΊΠΎΠ³Π΄Π° JVM выполняСт сборку мусора для освобоТдСния памяти, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΏΠ°ΡƒΠ·Ρ‹ Π² активности прилоТСния, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ замСдлСнию Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π²Π°ΡˆΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.Π’ этом постС ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ JVM управляСт ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΊΡƒΡ‡ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сборок мусора, Π° Ρ‚Π°ΠΊΠΆΠ΅ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ ΠΆΡƒΡ€Π½Π°Π»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ JVM. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ рассмотрим ΠΊΠΎΡ€Ρ€Π΅Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ, трассировки ΠΈ ΠΆΡƒΡ€Π½Π°Π»Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ большС контСкста ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, связанных с Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΎΠΉ памяти, ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ, ΠΊΠ°ΠΊ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ оповСщСния для отслСТивания ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, связанных с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Datadog.

ΠŸΡ€ΠΈ запускС JVM Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ для ΠΊΡƒΡ‡ΠΈ, области памяти, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ JVM ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для хранСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΈ вашСго прилоТСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ.Π­Ρ‚ΠΎΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ настраиваСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π»Π°Π³Π° -Xms . JVM Π±ΡƒΠ΄Π΅Ρ‚ динамичСски Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΈΠ· ΠΊΡƒΡ‡ΠΈ, Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ максимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ (ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ объСм памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ JVM ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ для ΠΊΡƒΡ‡ΠΈ, настраиваСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π»Π°Π³Π° -Xmx ). JVM автоматичСски Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΊΡƒΡ‡ΠΈ Π² зависимости ΠΎΡ‚ Смкости рСсурсов физичСского хоста, Ссли Π²Ρ‹ Π½Π΅ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚Π΅ ΠΈΠ½ΠΎΠ΅. Если вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΡƒΡ‡Ρƒ максимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Π½ΠΎ Π΅ΠΌΡƒ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ трСбуСтся большС памяти, ΠΎΠ½ΠΎ сгСнСрируСт ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ OutOfMemoryError .

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ явно Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π»Π°Π³ΠΎΠ² -Xms ΠΈ -Xmx (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, -Xms 50m -Xmx 100g установит ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ 50 ΠœΠ‘ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ 100 Π“Π‘ ).

По ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ создаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, JVM динамичСски выдСляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠ· ΠΊΡƒΡ‡ΠΈ для хранСния этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΈ использованиС ΠΊΡƒΡ‡ΠΈ возрастаСт. На Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ Π²Ρ‹ΡˆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ срСднСС использованиС ΠΊΡƒΡ‡ΠΈ (каТдая синяя ΠΈΠ»ΠΈ зСлСная линия прСдставляСт экзСмпляр JVM) вмСстС с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ использованиСм ΠΊΡƒΡ‡ΠΈ (красным).JVM Ρ‚Π°ΠΊΠΆΠ΅ выполняСт сборку мусора, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ большС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚, пСриодичСски создавая ΠΏΡ€ΠΎΠ²Π°Π» Π² использовании ΠΊΡƒΡ‡ΠΈ. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ JVM Π±ΡƒΠ΄Π΅Ρ‚ достаточно памяти для выдСлСния вновь созданным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ.

Алгоритмы сборщика мусора

Π‘Π±ΠΎΡ€ΠΊΠ° мусора Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° для освобоТдСния памяти, Π½ΠΎ ΠΎΠ½Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ приостанавливаСт ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ с Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ сталкиваСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. Π’ ΠΈΠ΄Π΅Π°Π»Π΅ JVM Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сборку мусора достаточно часто, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая трСбуСтся ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, Π½ΠΎ Π½Π΅ Ρ‚Π°ΠΊ часто, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π±Π΅Π· нСобходимости ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния.Алгоритмы сборки мусора Java Ρ€Π°Π·Π²ΠΈΠ²Π°Π»ΠΈΡΡŒ Π½Π° протяТСнии ΠΌΠ½ΠΎΠ³ΠΈΡ… Π»Π΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ°ΡƒΠ· ΠΈ максимально эффСктивно ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Начиная с Java 9, сборщик мусора Garbage-First, ΠΈΠ»ΠΈ G1 GC, являСтся сборщиком ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π₯отя Π΄Ρ€ΡƒΠ³ΠΈΠ΅, Π±ΠΎΠ»Π΅Π΅ эффСктивныС сборщики мусора находятся Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, G1 GC Π² настоящСС врСмя являСтся Π»ΡƒΡ‡ΡˆΠΈΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ для Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ трСбуСтся большой объСм памяти ΠΊΡƒΡ‡ΠΈ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ ΠΏΠ°ΡƒΠ·Ρ‹ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ прилоТСния. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² этом постС ΠΌΡ‹ остановимся Π½Π° сборщикС G1.

Как сборщик G1 ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΊΡƒΡ‡Ρƒ

G1 ΠΏΠΎΡ€ΠΎΠ²Π½Ρƒ Π΄Π΅Π»ΠΈΡ‚ ΠΊΡƒΡ‡Ρƒ Π½Π° Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹; ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π΅Π³ΠΈΠΎΠ½ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π»ΠΈΠ±ΠΎ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΌΡƒ поколСнию , Π»ΠΈΠ±ΠΎ старому поколСнию . МолодоС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ состоит ΠΈΠ· райских Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² ΠΈ ΡƒΡ†Π΅Π»Π΅Π²ΡˆΠΈΡ… Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ², Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ староС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ состоит ΠΈΠ· старых Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² ΠΈ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹Ρ… Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² (для хранСния Β«ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹Ρ…Β» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… Π±ΠΎΠ»Π΅Π΅ 50 ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΎΠ² памяти Ρ€Π΅Π³ΠΈΠΎΠ½Π°). Π—Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², вновь Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π°Π·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ Ρ€Π΅Π³ΠΈΠΎΠ½Ρƒ eden Π² ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΌ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² Π±ΠΎΠ»Π΅Π΅ старыС Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ (ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π² ΠΆΠΈΠ²Ρ‹Ρ… ΠΈΠ»ΠΈ старыС Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹) Π² зависимости ΠΎΡ‚ количСства Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΡ… сборок мусора.

Π­Ρ‚Π°ΠΏΡ‹ сборки мусора G1

Π’ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Java-прилоТСния сборщик мусора ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ всС Π΅Ρ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ (Β«ΠΆΠΈΠ²Ρ‹Π΅Β» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹), Π° ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ (Β«ΠΌΠ΅Ρ€Ρ‚Π²Ρ‹Π΅Β» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹) ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ· ΠΊΡƒΡ‡ΠΈ. ΠŸΠ°ΡƒΠ·Ρ‹ Stop-the-world (ΠΊΠΎΠ³Π΄Π° всС дСйствия ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ) ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ происходят, ΠΊΠΎΠ³Π΄Π° сборщик эвакуируСт ΠΆΠΈΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ ΠΈ сТимаСт ΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ большС памяти.

Π¦ΠΈΠΊΠ» сборки мусора G1 чСрСдуСтся ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„Π°Π·ΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Ρ… ΠΈ Ρ„Π°Π·ΠΎΠΉ восстановлСния пространства.Π’ΠΎ врСмя Ρ„Π°Π·Ρ‹ Β«Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Π΅Β» сборщик G1 выполняСт Π΄Π²Π° Ρ‚ΠΈΠΏΠ° процСссов:

  • Β«ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Ρ…Β» сборщиков мусора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π°ΠΊΡƒΠΈΡ€ΡƒΡŽΡ‚ ΠΆΠΈΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· райского ΡƒΠ³ΠΎΠ»ΠΊΠ° Π² Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ Π²Ρ‹ΠΆΠΈΠ²ΡˆΠΈΡ… ΠΈΠ»ΠΈ ΠΈΠ· ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ Π² ΠΆΠΈΠ²Ρ‹Ρ… Π² старыС Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ Π² зависимости ΠΎΡ‚ ΠΈΡ… возраста.
  • Ρ†ΠΈΠΊΠ» ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΆΠΈΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ€Π΅Π³ΠΈΠΎΠ½Π°Ρ… старого поколСния. G1 Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ этот процСсс ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ΅ ΠΊ этапу освоСния пространства, Ссли ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ старого поколСния занят.

НСкоторыС Ρ„Π°Π·Ρ‹ Ρ†ΠΈΠΊΠ»Π° ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ.Π’ΠΎ врСмя этого JVM ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости. Если сборщик мусора ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ†ΠΈΠΊΠ» ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΎΠ½ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ„Π°Π·Ρƒ восстановлСния пространства, Π³Π΄Π΅ запускаСт нСсколько ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹Ρ… сборок, Π½Π°Π·Π²Π°Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡΠ²Π°ΠΊΡƒΠΈΡ€ΡƒΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· смСси ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Ρ… ΠΈ старых Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ². Когда ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€ G1 опрСдСляСт, Ρ‡Ρ‚ΠΎ ΠΈΠ· ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹Ρ… ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ эвакуировано достаточно Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ² старого поколСния Π±Π΅Π· ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΡ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠ°ΡƒΠ·Ρ‹ (ТСлаСмая максимальная ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ°ΡƒΠ· остановки ΠΌΠΈΡ€Π°), Ρ„Π°Π·Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Ρ… начинаСтся снова.

Если, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ρƒ сборщика G1 слишком ΠΌΠ°Π»ΠΎ доступной памяти для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ†ΠΈΠΊΠ»Π° ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ сборку мусора. ΠŸΠΎΠ»Π½Ρ‹ΠΉ сборщик мусора ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Π΅ΠΌ сбор Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Ρ… ΠΈΠ»ΠΈ смСшанная коллСкция, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ эвакуируСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎ всСй ΠΊΡƒΡ‡Π΅, Π° Π½Π΅ Π² стратСгичСски Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… Ρ€Π΅Π³ΠΈΠΎΠ½Π°Ρ…. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ часто происходит полная сборка мусора, собирая ΠΈ анализируя ΠΆΡƒΡ€Π½Π°Π»Ρ‹ сборки мусора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ рассмотрим Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

ΠœΡ‹ прСдставили ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ (ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ) ΠΎΠ±Π·ΠΎΡ€ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ JVM ΠΈ исслСдовали, ΠΊΠ°ΠΊ JVM ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сборку мусора для освобоТдСния памяти ΠΊΡƒΡ‡ΠΈ, которая большС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния JVM ΠΈ ΠΆΡƒΡ€Π½Π°Π»Ρ‹ сборки мусора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π²Π°ΠΌ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, связанныС с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² Π²Π°ΡˆΠΈΡ… прилоТСниях Java.

ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния JVM

JVM прСдоставляСт ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± использовании памяти ΠΊΡƒΡ‡ΠΈ, количСствС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ классах, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ MBean. Π‘Π»ΡƒΠΆΠ±Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, такая ΠΊΠ°ΠΊ Java Agent Datadog, ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ нСпосрСдствСнно Π² JVM, ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ эти ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ локально ΠΈ автоматичСски ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΈΡ… Π½Π° Π³ΠΎΡ‚ΠΎΠ²ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅.Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ распрСдСлСнной трассировки ΠΈ APM Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ трассировки ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… запросов с ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°ΠΌΠΈ JVM. НиТС Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ врСмя трассировки, Π½Π°Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ для упрощСния коррСляции, Ρ‡Ρ‚ΠΎ позволяСт Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ состояниС срСды выполнСния прилоТСния Π²ΠΎ врСмя ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ запроса.

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ рассмотрим нСсколько ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΉ Π² показатСлях JVM, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π²Π°ΠΌ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ.

Π‘Ρ€Π΅Π΄Π½Π΅Π΅ использованиС ΠΊΡƒΡ‡ΠΈ послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сборки мусора Π½Π΅ΡƒΠΊΠ»ΠΎΠ½Π½ΠΎ растСт

Если Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ использованиС ΠΊΡƒΡ‡ΠΈ постоянно увСличиваСтся послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сборки мусора, это ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ трСбования вашСго прилоТСния ΠΊ памяти растут ΠΈΠ»ΠΈ Ρƒ вас Π΅ΡΡ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти ( ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ освобоТдаСт ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹, Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ прСдотвращая ΠΈΡ… сборку мусора).Π’ любом случаС Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈ Π»ΠΈΠ±ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ большС памяти ΠΊΡƒΡ‡ΠΈ для вашСго прилоТСния (ΠΈ / ΠΈΠ»ΠΈ Ρ€Π΅ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ вашСго прилоТСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ мСньшС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²), Π»ΠΈΠ±ΠΎ ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π°ΠΊΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹, ΠΊΠ°ΠΊ VisualVM ΠΈΠ»ΠΈ Mission Control.

Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π°Π·ΡƒΠΌΠ½ΡƒΡŽ настройку, которая Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΡŽ доступных рСсурсов вашСго хоста. Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ JVM Ρ‚Π°ΠΊΠΆΠ΅ нСсСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ½Π° Ρ…Ρ€Π°Π½ΠΈΡ‚ кСш ΠΊΠΎΠ΄Π° Π² памяти, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΎΡ‚ ΠΊΡƒΡ‡ΠΈ).MBean java.lang: type = Memory прСдоставляСт ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ для HeapMemoryUsage ΠΈ NonHeapMemoryUsage , Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ использованиС ΠΊΡƒΡ‡ΠΈ ΠΈ Π½Π΅ ΠΊΡƒΡ‡ΠΈ памяти JVM. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ использованиС памяти Π½Π° систСмном ΡƒΡ€ΠΎΠ²Π½Π΅ вашСго физичСского сСрвСра с использованиСм ΠΊΡƒΡ‡ΠΈ ΠΈ Π±Π΅Π· ΠΊΡƒΡ‡ΠΈ JVM, построив Π³Ρ€Π°Ρ„ΠΈΠΊ этих ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ.

Π Π°Π·ΠΌΠ΅Ρ€ старого поколСния увСличиваСтся

JVM прСдоставляСт ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΡƒ Usage.used Ρ‡Π΅Ρ€Π΅Π· java.lang: name = G1 Old Gen, type = MemoryPool MBean, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ измСряСт объСм памяти, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ старого поколСния (ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ это Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΆΠΈΠ²Ρ‹Π΅ ΠΈ ΠΌΠ΅Ρ€Ρ‚Π²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ собраны мусором).Π’ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… условиях этот ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ. Если Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ этой ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ, это ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Java создаСт Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ старСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² сборщик мусора эвакуируСт ΠΈΡ… Π² Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ Π² старом ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΈ) ΠΈΠ»ΠΈ создаСт Π±ΠΎΠ»Π΅Π΅ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ автоматичСски ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ Ρ€Π΅Π³ΠΈΠΎΠ½Π°ΠΌ Π² старом ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΈ).

ΠŸΡ€ΠΎΡ†Π΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° сборку мусора

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ сборщик G1 пытаСтся Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΎΠΊΠΎΠ»ΠΎ 8 ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΎΠ² Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° сборку мусора (настраиваСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° XX: GCTimeRatio ).Но, ΠΊΠ°ΠΊ ΠΈ Π² случаС с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π²Ρ‹ΡˆΠ΅ Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°ΡƒΠ·Ρ‹, JVM Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ смоТСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ этот ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π·Π°Ρ‚Ρ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ„Π°Π·Ρƒ сборки мусора, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΡƒ CollectionTime ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² MBean, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ врСмя сборки Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ, смСшанного ΠΈ старого (ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ) мусора Π² миллисСкундах:

  • java.lang: type = GarbageCollector, name = G1 Young Generation
  • java.lang: type = GarbageCollector, name = G1 Mixed Generation
  • java.lang: type = GarbageCollector, name = G1 Π‘Ρ‚Π°Ρ€ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ долю Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° сборку мусора, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ слуТбу ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° для автоматичСского запроса этой ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ, прСобразования Π΅Π΅ Π² сСкунды ΠΈ расчСта посСкундной скорости. .

Π’Ρ‹ΡˆΠ΅ ΠΌΡ‹ ΠΈΠ·ΠΎΠ±Ρ€Π°Π·ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° ΡΠΌΠ΅ΡˆΠ°Π½Π½ΡƒΡŽ ΠΈ ΠΏΠΎΠ»Π½ΡƒΡŽ сборку, Π½Π° Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π° сборку ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ мусора, Π½Π° Π½ΠΈΠΆΠ½Π΅ΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ соотнСсти ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° сборку мусора, с использованиСм ΠΊΡƒΡ‡ΠΈ, построив ΠΈΡ… Π³Ρ€Π°Ρ„ΠΈΠΊ Π½Π° Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

Π₯отя ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π΄Π°ΡŽΡ‚ ΠΎΠ±Ρ‰Π΅Π΅ прСдставлСниС ΠΎ частотС ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ сборки мусора, ΠΎΠ½ΠΈ Π½Π΅ всСгда ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Если Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° сборку мусора ΠΈΠ»ΠΈ использованиС ΠΊΡƒΡ‡ΠΈ постоянно увСличиваСтся Π΄Π°ΠΆΠ΅ послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сборки мусора, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»Ρ‹ для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

Π–ΡƒΡ€Π½Π°Π»Ρ‹ сборки мусора

Π–ΡƒΡ€Π½Π°Π»Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… этапах сборки мусора.Они Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Π΅ΠΌ просто ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ JVM, ΠΊΠΎΠ³Π΄Π° вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· строя ΠΈΠ·-Π·Π° ошибки Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти - Π²Ρ‹ часто ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, просмотрСв ΠΆΡƒΡ€Π½Π°Π»Ρ‹ Π²ΠΎ врСмя сбоя. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π»Ρ‹ для отслСТивания частоты ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… процСссов, связанных со сборкой мусора: сборок Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Ρ…, ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹Ρ… сборок, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°Π· Ρ†ΠΈΠΊΠ»Π° ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ ΠΏΠΎΠ»Π½Ρ‹Ρ… сборок мусора. Π–ΡƒΡ€Π½Π°Π»Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Π²Π°ΠΌ, сколько памяти Π±Ρ‹Π»ΠΎ освобоТдСно Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСсса сборки мусора.

Π€Π»Π°Π³ -verbose: gc настраиваСт JVM для рСгистрации этих свСдСний ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ процСссС сборки мусора. Начиная с Java 9, JVM Unified Logging Framework ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ„Π»Π°Π³ΠΎΠ² для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Ρ… Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΆΡƒΡ€Π½Π°Π»Π° сборки мусора: -Xlog: gc * (хотя -verbose: gc ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚). Π‘ΠΌ. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ для получСния ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ Ρ„Π»Π°Π³ΠΎΠ² вСдСния ΠΆΡƒΡ€Π½Π°Π»Π° сборки мусора Π΄ΠΎ Java 9.x Π² Π½ΠΎΠ²Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ Xlog .

На ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅ Π²Ρ‹ΡˆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΆΡƒΡ€Π½Π°Π»Π° сборки мусора.Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΠΎΠ»Π΅ отобраТаСтся врСмя с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° послСднСго запуска ΠΈΠ»ΠΈ пСрСзапуска JVM (532 002,067 сСкунд), Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ состояния ΠΆΡƒΡ€Π½Π°Π»Π° ( информация ). Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ сборщик G1 Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» сборку мусора Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ остановкС ΠΌΠΈΡ€Π° ΠΏΡ€ΠΈ эвакуации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора сократил использованиС ΠΊΡƒΡ‡ΠΈ с 11 884 ΠœΠ‘ ( gc.memory_before ) Π΄ΠΎ 3295 ΠœΠ‘ ( gc.memory_after ). Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΠΎΠ»Π΅ ( gc.memory_total ) указываСтся Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ: 14 336 ΠœΠ‘.НаконСц, duration ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π½Π° сборку мусора: 11,456 мс.

Π‘Π»ΡƒΠΆΠ±Π° управлСния ΠΆΡƒΡ€Π½Π°Π»Π°ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ автоматичСски Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈΠ· Π²Π°ΡˆΠΈΡ… ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сбора. Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ значСниями memory_before ΠΈ memory_after , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π²Π°ΠΌ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ объСм освобоТдСнной памяти ( gc.memory_freed Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΌ ΠΆΡƒΡ€Π½Π°Π»Π΅ Π²Ρ‹ΡˆΠ΅) ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ процСссом, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, насколько эффСктивно ваш сборщик мусора со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ освобоТдаСт ΠΏΠ°ΠΌΡΡ‚ΡŒ.Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°ΠΌΠΈ JVM, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° сборку мусора.

Если вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ большой ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° сборку мусора, Π½ΠΎ сборщик ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ мноТСство краткосрочных Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΉ (часто создавая ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π° Π·Π°Ρ‚Π΅ΠΌ освобоТдая ссылки Π½Π° Π½ΠΈΡ…). Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ Π½Π° сборку мусора, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ количСство Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΉ, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, просмотрСв Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ выдСлСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π°ΠΊΠΎΠ³ΠΎ инструмСнта, ΠΊΠ°ΠΊ VisualVM.

На этих Π³Ρ€Π°Ρ„ΠΈΠΊΠ°Ρ… Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ больший ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Ρ… ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ (Π²Π²Π΅Ρ€Ρ…Ρƒ) ΠΈ Ρ‡Ρ‚ΠΎ процСссы сборки мусора ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ постоянный объСм памяти с Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (Π²Π½ΠΈΠ·Ρƒ).

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° сборку мусора ΠΈ , эти сборки мусора со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ мСньшС памяти, это ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ создаСтС Π±ΠΎΠ»Π΅Π΅ Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»Π³ΠΎ находятся Π² ΠΊΡƒΡ‡Π΅). ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ собраны мусором).Π’ этом случаС Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈΠ±ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ объСм памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ трСбуСтся Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, Π»ΠΈΠ±ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ возникновСния ошибки Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти.

На этих Π³Ρ€Π°Ρ„ΠΈΠΊΠ°Ρ… Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ больший ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Ρ… ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ (Π²Π²Π΅Ρ€Ρ…Ρƒ) ΠΈ Ρ‡Ρ‚ΠΎ процСссы сборки мусора со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ мСньшС памяти (Π²Π½ΠΈΠ·Ρƒ).

Помимо использования ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² для отслСТивания эффСктивности ΠΈ частоты процСссов сборки мусора, Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° ΠΆΡƒΡ€Π½Π°Π»Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ваша JVM ΠΈΠ·ΠΎ всСх сил пытаСтся ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с трСбованиями вашСго прилоТСния ΠΊ памяти.НиТС ΠΌΡ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассмотрим Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΆΡƒΡ€Π½Π°Π»Π°:

  • Β«To-space исчСрпано»
  • Full GC ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π½Ρ‹Π΅ сборки мусора
To-space исчСрпаны

Если ваша ΠΊΡƒΡ‡Π° находится ΠΏΠΎΠ΄ Π΄Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ, Π° сборка мусора Π½Π΅ выполняСтся Если Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ достаточно быстро, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ потрСбности вашСго прилоТСния, Π² Π²Π°ΡˆΠΈΡ… ΠΆΡƒΡ€Π½Π°Π»Π°Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ сообщСниС Β«To-space is madeΒ» Π­Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ сборщику мусора Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ «свободного мСста» ΠΈΠ»ΠΈ свободного мСста для эвакуации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹.Если Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ этот ΠΆΡƒΡ€Π½Π°Π», это ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сборщику вскорС потрСбуСтся Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ сборку мусора.

Полная сборка мусора

Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊΡƒ G1 ΠΈΠ½ΠΎΠ³Π΄Π° трСбуСтся Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ сборку мусора, Ссли ΠΎΠ½ Π½Π΅ справляСтся с трСбованиями вашСго прилоТСния ΠΊ памяти. Π”Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ стратСгичСски Π½Π°Ρ†Π΅Π»Π΅Π½Ρ‹ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Ρ€Π΅Π³ΠΈΠΎΠ½Ρ‹ Π² ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Ρ†Π΅Π»ΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠ°ΡƒΠ·Ρ‹. Напротив, полная сборка мусора ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°ΡƒΠ·Π°ΠΌ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ прилоТСния), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ сборщику G1 трСбуСтся ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²ΠΎ всСй ΠΊΡƒΡ‡Π΅.

Π’ ΠΆΡƒΡ€Π½Π°Π»Π΅ Π½ΠΈΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ эта полная сборка мусора смогла ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ 2620 ΠœΠ‘ памяти, Π½ΠΎ это Ρ‚Π°ΠΊΠΆΠ΅ заняло ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΏΡΡ‚ΡŒ сСкунд (ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ). Π’ это врСмя ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠ³Π»ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ высокой Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ΅ запроса ΠΈ Π½ΠΈΠ·ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Полная сборка мусора ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ происходит, ΠΊΠΎΠ³Π΄Π° сборщику Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ памяти для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ„Π°Π·Ρ‹ Ρ†ΠΈΠΊΠ»Π° ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Если это ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π» [GC concurrent-mark-start] , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ Ρ„Π°Π·Ρ‹ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ†ΠΈΠΊΠ»Π° ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт ΠΆΡƒΡ€Π½Π°Π» Full GC (Allocation Failure) , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСт ΠΏΠΎΠ»Π½Ρ‹ΠΉ сборка мусора ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ для Ρ†ΠΈΠΊΠ»Π° ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ памяти для продолТСния.ВскорС послС этого Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΆΡƒΡ€Π½Π°Π» [GC concurrent-mark-abort] , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сборщик Π±Ρ‹Π» Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ†ΠΈΠΊΠ»Π° ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ:

Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ, ΡΠΏΠΎΡΠΎΠ±ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΠΎΠ»Π½ΠΎΠΌΡƒ сборкС мусора, являСтся Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠžΠ³Ρ€ΠΎΠΌΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ΡΡ нСпосрСдствСнно старому поколСнию ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ большС памяти, Ρ‡Π΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Если вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², это ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ сборщику G1 потрСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ сборку мусора.

ΠžΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π² ΠΎΠ΄Π½ΠΎΠΉ области, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сборщику Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠ· сосСдних областСй. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ JVM запустит ΠΏΠΎΠ»Π½ΡƒΡŽ сборку мусора (Π΄Π°ΠΆΠ΅ Ссли Ρƒ Π½Π΅Π΅ достаточно памяти для распрСдСлСния ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ Ρ€Π΅Π³ΠΈΠΎΠ½Π°ΠΌ), Ссли это СдинствСнный способ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ количСство Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹Ρ… областСй для хранСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Если Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ выполняСт большС ΠΏΠΎΠ»Π½Ρ‹Ρ… сборок мусора, это сигнализируСт ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ JVM сталкиваСтся с большой Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΎΠΉ памяти, ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с ошибкой Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти, Ссли сборщик мусора Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ достаточно памяти Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ потрСбности.Π‘Π»ΡƒΠΆΠ±Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, такая ΠΊΠ°ΠΊ Datadog, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π²Π°ΠΌ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ошибки Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти, позволяя ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ трассировку стСка Π² трассировкС запроса (ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅) ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ связанным ΠΆΡƒΡ€Π½Π°Π»Π°ΠΌ ΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

Π‘Π±ΠΎΡ€ ΠΈ сопоставлСниС ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² сборки мусора Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ позволяСт ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ Π»ΠΈ ошибки Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя, Ρ‡Ρ‚ΠΎ ΠΈ полная сборка мусора. Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΆΡƒΡ€Π½Π°Π»Π° Π½ΠΈΠΆΠ΅ ΠΏΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ сборщику мусора G1 Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ доступной памяти ΠΊΡƒΡ‡ΠΈ для продолТСния Ρ†ΠΈΠΊΠ»Π° ΠΌΠ°Ρ€ΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ( concurrent-mark-abort ), поэтому Π΅ΠΌΡƒ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ сборку мусора ( Full GC Allocation Failure ).ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² это ΠΆΠ΅ врСмя ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΎ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти ( java.lang.OutOfMemoryError: Java heap space ), указывая Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ это Π΄Π°Π²Π»Π΅Π½ΠΈΠ΅ памяти Π² ΠΊΡƒΡ‡Π΅ влияло Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ прилоТСния.

РСгулярный ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ способности JVM эффСктивно ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ Π΅Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для обСспСчСния бСспСрСбойной Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π²Π°ΡˆΠΈΡ… Java-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ оповСщСния для автоматичСского отслСТивания ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ JVM ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

ΠΠ½ΠΎΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ рост использования ΠΊΡƒΡ‡ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ сборка мусора Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ потрСбности вашСго прилоТСния Π² памяти, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌ прилоТСния ΠΈ ошибкам Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти. Π’ Datadog Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ автоматичСски ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ увСдомлСния, ΠΊΠΎΠ³Π΄Π° срСднСС использованиС ΠΊΡƒΡ‡ΠΈ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ 80 ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΎΠ² ΠΎΡ‚ максимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ.

Если Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ это ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ ΠΈΠ»ΠΈ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ своСго прилоТСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ мСньшС Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сборщик G1 выполняСт Ρ‡Π°ΡΡ‚ΡŒ своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π±ΠΎΠ»Π΅Π΅ высокая ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ сбору мусора Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ являСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ Π½Π΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°ΡƒΠ·Ρ‹ с остановкой, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΡ€Ρ€Π΅Π»ΠΈΡ€ΡƒΡŽΡ‚ с Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ прилоТСния, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сталкиваСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. Datadog APM прСдоставляСт прСдупрСТдСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ сразу ΠΆΠ΅ автоматичСски ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ. НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠ΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ увСдомляСт вас, ΠΊΠΎΠ³Π΄Π° Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° 90-Π³ΠΎ процСнтиля для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… запросов ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ Java-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ (слуТба : java-pet-clinic Π² Π΄Π°Π½Π½ΠΎΠΌ случаС) ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° увСличиваСтся частота ошибок.

Если Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΌ трассировкам Π² APM ΠΈ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… с ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°ΠΌΠΈ JVM (Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° сборку мусора), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° Π±Ρ‹Ρ‚ΡŒ связана с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ JVM.

JVM автоматичСски Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, освобоТдая ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ эффСктивно распрСдСляя Π΅Π΅ Π² соотвСтствии с ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΌΠΈΡΡ трСбованиями вашСго прилоТСния ΠΊ рСсурсам. Алгоритмы сборки мусора стали Π±ΠΎΠ»Π΅Π΅ эффСктивными Π² сокращСнии остановок Π² Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΎΡ‚ ошибок Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти.Π’Π°ΠΌ Π½ΡƒΠΆΠ½Π° полная Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ всСго вашСго прилоТСния ΠΈ Π΅Π³ΠΎ срСды выполнСния JVM, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эффСктивно ΡƒΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ ошибки, связанныС с Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΎΠΉ памяти, ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, связанныС с ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ эти ошибки Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄ΡƒΡ‚.

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Datadog APM для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ вашСго Java-прилоТСния, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ прилоТСния, трассировки запросов, ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния JVM ΠΈ ΠΆΡƒΡ€Π½Π°Π»Ρ‹ сборки мусора, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, связан Π»ΠΈ всплСск Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. (Π΅.g., Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΊΡƒΡ‡Ρƒ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ мСньшС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²?) ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ ΡƒΠ·ΠΊΠΎΠ³ΠΎ мСста.

ВстроСнная ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° JMXFetch Π°Π³Π΅Π½Ρ‚Π° Datadog Agent Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Ρƒ MBean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ использованиС ΠΊΡƒΡ‡ΠΈ, врСмя сборки мусора ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ старого поколСния. А Java-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Datadog APM обСспСчиваСт Π³Π»ΡƒΠ±ΠΎΠΊΡƒΡŽ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, автоматичСски отслСТивая запросы ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ Π² экосистСмС Java, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Tomcat, Spring ΠΈ соСдинСния с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· JDBC.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ функциях ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Java Datadog, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ. Если Π²Ρ‹ Π½ΠΎΠ²ΠΈΡ‡ΠΎΠΊ Π² Datadog ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ своих Java-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΏΠΎΠ΄ΠΏΠΈΡˆΠΈΡ‚Π΅ΡΡŒ Π½Π° Π±Π΅ΡΠΏΠ»Π°Ρ‚Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Анализ памяти java | Dynatrace

ЦСль любого Π°Π½Π°Π»ΠΈΠ·Π° памяти Java - ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сборку мусора (GC) Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ свСсти ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ Π΅Π΅ влияниС Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° прилоТСния ΠΈΠ»ΠΈ использованиС ЦП. НС ΠΌΠ΅Π½Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния.НСхватка ΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти часто приводят ΠΊ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π²Ρ‹Π·Π²Π°Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, ΠΈΠ»ΠΈ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΡƒΡŽ сборку мусора, Π½Π°ΠΌ сначала Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ нашС Java-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… инструмСнтов. Если сборка мусора ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ влияСт Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ°, нашСй Ρ†Π΅Π»ΡŒΡŽ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ оптимизация ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. ЦСлью ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ измСнСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ этого воздСйствия. НаконСц, Ссли ΠΎΠ΄Π½ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ нСдостаточно, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ распрСдСлСния ΠΈ само использованиС памяти. Π˜Ρ‚Π°ΠΊ, приступим ΠΊ Π΄Π΅Π»Ρƒ.


Начиная с Java 5, стандартным инструмСнтом ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° JDK Π±Ρ‹Π»Π° JConsole. Oracle JDK Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ jStat, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ использованиС памяти ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ сборщика мусора с консоли, ΠΈ Java VisualVM (ΠΈΠ»ΠΈ jvisualvm), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт элСмСнтарный Π°Π½Π°Π»ΠΈΠ· памяти ΠΈ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ. Oracle JRockit JDK Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ JRockit Mission Control ΠΈ Ρ„Π»Π°Π³ verbose: gc JVM. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ поставщик JVM Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя свои собствСнныС инструмСнты ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, ΠΈ сущСствуСт мноТСство доступных коммСрчСских инструмСнтов, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰ΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ использования памяти ΠΈ активности Π“Π₯


НСхватка памяти часто являСтся ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ зависания ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Java. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ влияниС сборки мусора Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° ΠΈ использованиС памяти, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Однако ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° использования памяти ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ сборки мусора нСдостаточно, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эти Π΄Π²Π° элСмСнта сами ΠΏΠΎ сСбС Π½Π΅ говорят Π½Π°ΠΌ, влияСт Π»ΠΈ сборка мусора Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° прилоТСния.Волько приостановка сборки мусора Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ влияСт Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ°, ΠΈ сборщик мусора Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ соотнСсти приостановки, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Π΅ сборкой мусора, со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° прилоТСния. Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этого, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  • ИспользованиС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡƒΠ»ΠΎΠ² памяти (Eden, ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ²ΡˆΠ°ΡΡΡ ΠΈ старая). НСхватка памяти - главная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½ΠΎΠΉ активности сборщика мусора.
  • Если ΠΎΠ±Ρ‰Π΅Π΅ использованиС памяти постоянно увСличиваСтся, нСсмотря Π½Π° сборку мусора, происходит ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти, которая Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкС Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти.Π’ этом случаС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π°Π½Π°Π»ΠΈΠ· ΠΊΡƒΡ‡ΠΈ памяти.
  • ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния прСдоставляСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ скорости ΠΎΡ‚Ρ‚ΠΎΠΊΠ° (ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ распрСдСлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²). Π§Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ число, Ρ‚Π΅ΠΌ большС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² размСщаСтся. Π‘ΠΎΠ»ΡŒΡˆΠΎΠ΅ количСство ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Ρ… ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° ΠΈ растущСго ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ поколСния (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ большС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ с количСством ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²).
  • Если использованиС старого поколСния сильно колСблСтся, Π½Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡΡΡŒ послС сборки мусора, Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±Π΅Π· надобности ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠ· ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния Π² староС.Для этого Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹: ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ слишком ΠΌΠ°Π»ΠΎ, высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΎΡ‚Ρ‚ΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ слишком большоС использованиС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ памяти.
  • Высокая Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ сборщика мусора ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ сказываСтся Π½Π° использовании ЦП. Однако Ρ‚ΠΎΠ»ΡŒΠΊΠΎ приостановки (Ρ‚Π°ΠΊΠΆΠ΅ извСстныС ΠΊΠ°ΠΊ Β«Stop the World EventsΒ») ΠΈΠΌΠ΅ΡŽΡ‚ прямоС влияниС Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ°. Π’ΠΎΠΏΡ€Π΅ΠΊΠΈ распространСнному мнСнию, приостановка Π½Π΅ ограничиваСтся ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΌΠΈ сборщиками мусора. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ приостановки Π² зависимости ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° прилоТСния.

ПанСль ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° памяти JVM (рисунок 2.11) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ постоянноС (ΠΈΠ»ΠΈ староС) ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ постоянно растСт, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ своСму старому ΡƒΡ€ΠΎΠ²Π½ΡŽ послС GC старого поколСния (Π²Π½ΠΈΠ·Ρƒ справа). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти Π½Π΅Ρ‚, Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° роста - ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. МолодоС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ слишком ΠΌΠ°Π»ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с распрСдСлСниСм Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. На это Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ большоС количСство GC ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния (Oracle / Sun Copy GC). Π­Ρ‚ΠΈ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ второстСпСнныС сборщики мусора часто ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния.

JVM Π±ΡƒΠ΄Π΅Ρ‚ приостановлСна ​​на врСмя выполнСния второстСпСнной сборки мусора; это событиС остановки ΠΌΠΈΡ€Π°. ВторостСпСнныС сборщики мусора ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ довольно быстрыС, поэтому ΠΈΡ… Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ второстСпСнными, Π½ΠΎ Π² этом случаС ΠΎΠ½ΠΈ сильно Π²Π»ΠΈΡΡŽΡ‚ Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ°. Основная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Ρ‚Π° ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ: ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ слишком малСнькоС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ. Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ этого ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСдостаточно для увСличСния числСнности ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния. Π‘ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½ΠΎΠ΅ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ большС ΠΆΠΈΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‡Ρ‚ΠΎ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»Π°ΠΌ сборки мусора.Π›ΡƒΡ‡ΡˆΠ°Ρ оптимизация - всСгда ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒ количСство Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΈ ΠΎΠ±Ρ‰ΠΈΠ΅ трСбования ΠΊ памяти.

Рисунок 2.11: Π­Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ памяти JVM

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ»ΠΎΠ² сборки мусора, Π΄Π° ΠΈ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹. Однако ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ влияниС приостановки Π“Π₯ Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ°.

Как ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ влияниС Π“Π₯ Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ°


ΠŸΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° сборщика мусора прСдставляСт собой СдинствСнноС прямоС влияниС Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° сборщика мусора.ЕдинствСнный способ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это - Ρ‡Π΅Ρ€Π΅Π· интСрфСйс инструмСнта JVM (JVM TI), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для рСгистрации ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ приостановки. Π’ΠΎ врСмя события stop-the-world всС Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ соотнСсти эти приостановки с транзакциями ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Π»ΠΎ, Ρ‚Π°ΠΊ ΠΈ ΠΊΠΎΠ½Π΅Ρ† приостановки. ЀактичСски, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π΄ΠΎΠ»Π³ΠΎ конкрСтная транзакция Π±Ρ‹Π»Π° приостановлСна ​​сборщиком мусора. (Π‘ΠΌ. Рисунок 2.12.)

Рисунок 2.12: Π”Π²Π΅ полосы ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ с приостановкой сборки мусора ΠΈ Π±Π΅Π· Π½Π΅Π΅.Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ влияниС сборки мусора

Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Волько нСсколько инструмСнтов ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ прямой ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ приостановки, ΠΈ Dynatrace являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π½ΠΈΡ…. Если Ρƒ вас Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ инструмСнта, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ jStat, JConsole ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ инструмСнт для отслСТивания Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ сборки мусора. ΠŸΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, сообщаСмыС Π² jStat, Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ JVM Ρ‡Π΅Ρ€Π΅Π· JMX. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ JMX для отслСТивания этих ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π’Π°ΠΆΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ GC ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ ΠΈ старого поколСния (ΠΈΠ»ΠΈ второстСпСнный ΠΈ большой, ΠΊΠ°ΠΊ ΠΈΡ… ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚; ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ см. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅), ΠΈ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ частоту, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ†ΠΈΠΊΠ»ΠΎΠ² GC.Π“Π₯ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния Π±ΡƒΠ΄ΡƒΡ‚ Π² основном Π½Π΅ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ, Π½ΠΎ ΠΏΡ€ΠΈ большой Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ частыми. МногиС быстрыС сборщики мусора ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ ΠΏΠ»ΠΎΡ…ΠΈΠΌΠΈ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠ°ΠΊ ΠΈ ΠΎΠ΄ΠΈΠ½ Π΄ΠΎΠ»Π³ΠΎΠ²Π΅Ρ‡Π½Ρ‹ΠΉ (ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ сборщики мусора ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния всСгда ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ ΠΌΠΈΡ€).

ЧастыС Π“Π₯ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Π²Π΅ основныС ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹:

  • Блишком малСнькоС ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ для Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ прилоТСния.
  • Высокий ΠΎΡ‚Ρ‚ΠΎΠΊ

Если ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ слишком ΠΌΠ°Π»ΠΎ, ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ растущСС староС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ ΠΈΠ·-Π·Π° ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ владСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.

Если слишком ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² выдСляСтся слишком быстро (Ρ‚. Π•. ΠŸΡ€ΠΈ высоком ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΡ‚Ρ‚ΠΎΠΊΠ°), ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ заполняСтся Ρ‚Π°ΠΊ ΠΆΠ΅ быстро, ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ сборщик мусора. Π₯отя сборщик мусора всС Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… старого поколСния, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°Ρ‚ΡŒ это Π·Π° счСт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ прилоТСния.

Высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΎΡ‚Ρ‚ΠΎΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ Π½Π°ΠΌ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ, поэтому ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ​​проблСму Π² нашСм ΠΊΠΎΠ΄Π΅, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ саму сборку мусора.БущСствуСт ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ простой способ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Π΅ области ΠΊΠΎΠ΄Π°.

ΠŸΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π½Π° рис. 2.13, ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‚ ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ статистичСской ΠΊΠΎΠ½Ρ†Π΅Π½Ρ‚Ρ€Π°Ρ†ΠΈΠΈ сборок мусора Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ сборщик мусора запускаСтся Π½Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, Π° скорСС состояниСм заполнСния ΠΊΡƒΡ‡ΠΈ. Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ приостанавливаСтся Ρ‡Π°Ρ‰Π΅, Ρ‡Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сам ΠΌΠ΅Ρ‚ΠΎΠ΄ выдСляСт достаточно ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, запускаСт сборщик мусора.ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Ρ‚Π°ΠΊΡƒΡŽ β€‹β€‹ΡΡ‚Π°Ρ‚ΠΈΡΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ аномалию, ΠΌΡ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π° для Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ распрСдСлСния (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ рассмотрим Π΄Π°Π»Π΅Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ «Анализ распрСдСлСния» этой Π³Π»Π°Π²Ρ‹ Π½ΠΈΠΆΠ΅).

Рисунок 2.13: ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ часто ΠΈ ΠΊΠ°ΠΊ Π΄ΠΎΠ»Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±Ρ‹Π» приостановлСн сборщиком мусора

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΈ второстСпСнныС сборки мусора

Π’ΠΎ, Ρ‡Ρ‚ΠΎ я Π½Π°Π·Ρ‹Π²Π°Π» сборщиками мусора ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ ΠΈ старого поколСния, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ второстСпСнными ΠΈ основными сборщиками мусора.Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ общСизвСстно, Ρ‡Ρ‚ΠΎ основныС сборщики мусора ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Π²Π°ΡˆΡƒ JVM, ΠΏΠ»ΠΎΡ…ΠΎ ΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΠΏΠΎ возмоТности ΠΈΡ… слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, второстСпСнныС сборщики мусора часто ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈ значСния ΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π²ΠΎ врСмя ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°. Как ΡƒΠΆΠ΅ объяснялось, второстСпСнныС сборщики мусора ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния, ΠΈ Π½ΠΈ ΠΈΡ…, Π½ΠΈ основныС сборщики мусора Π½Π΅ слСдуСт ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π“Π»Π°Π²Π½Ρ‹ΠΉ сборщик мусора часто приравниваСтся ΠΊ сборкС мусора Π² старом ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΈ; Однако это Π½Π΅ совсСм Ρ‚Π°ΠΊ. Π₯отя ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΉ сборщик мусора собираСт староС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅, Π½Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ сборщик мусора старого поколСния являСтся ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠ΅ΠΉ.Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… сборщиков мусора, Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ понимаСтся. Глядя Π½Π° Π²Ρ‹Π²ΠΎΠ΄ verbose: GC ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ я имСю Π² Π²ΠΈΠ΄Ρƒ:

  [GC 325407K-> 83000K (776768K), 0,2300771 с]
    [GC 325816K-> 83372K (776768K), 0,2454258 с]
    [ΠŸΠΎΠ»Π½Ρ‹ΠΉ GC 267628K-> 83769K (776768K), 1,8479984 с]
  

Основной GC - это ΠΏΠΎΠ»Π½Ρ‹ΠΉ GC. Π“Π»Π°Π²Π½Ρ‹ΠΉ сборщик мусора собираСт всС области ΠΊΡƒΡ‡ΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ ΠΈ, Π² случаС Oracle HotSpot JVM, постоянноС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅.ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚ это Π²ΠΎ врСмя события остановки ΠΌΠΈΡ€Π°, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ приостанавливаСтся Π½Π° Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, часто Π½Π° нСсколько сСкунд ΠΈΠ»ΠΈ ΠΌΠΈΠ½ΡƒΡ‚. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ρƒ нас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ GC-активности Π² старом ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΈ, Π½ΠΎ ΠΌΡ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ большой (ΠΏΠΎΠ»Π½Ρ‹ΠΉ) GC ΠΈΠ»ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… приостановок, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Ρ… GC. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² этом, просто запуститС любоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΌ сборщиком мусора. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ jstat β€” gcutil для отслСТивания повСдСния GC вашСго прилоТСния.

Об этом Π²Ρ‹Π²ΠΎΠ΄Π΅ сообщаСт jstat -gcutil.ΠŸΠ΅Ρ€Π²Ρ‹Π΅ ΠΏΡΡ‚ΡŒ столбцов Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ 2.1 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ использованиС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… пространств Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π°Ρ… - ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΉΡΡ Π² ΠΆΠΈΠ²Ρ‹Ρ… 0, ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΉΡΡ Π² ΠΆΠΈΠ²Ρ‹Ρ… 1, Π­Π΄Π΅ΠΌ, старый ΠΈ постоянный - с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ количСством Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΉ GC ΠΈ ΠΈΡ… Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ - ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Π΅ Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ GC ΠΈ врСмя, ΠΏΠΎΠ»Π½ΠΎΠ΅ Активации GC ΠΈ врСмя. Π’ послСднСм столбцС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ врСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° сборку мусора. Π’Ρ€Π΅Ρ‚ΡŒΡ строка ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ староС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΠ»ΠΎΡΡŒ, Π° jStat сообщил ΠΎ ΠΏΠΎΠ»Π½ΠΎΠΌ сборкС мусора (см. Числа, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΆΠΈΡ€Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ).

  ** S0 ** ** S1 ** ** E ** ** O ** ** P ** ** YGC ** ** YGCT ** ** FGC ** ** FGCT ** ** GCT **
90.68 0,00 32,44 85,41 45,03 134 15,270 143 21,683 36,954
90,68 0,00 32,45 85,41 45,03 134 15,270 143 21,683 36,954
90,68 0,00 38,23 _ ** 85,41 ** _ 45,12 134 15,270 _ ** 143 ** _ _ ** 21,683 ** _ _ ** 36,954 ** _
90,68 0,00 38,52 _ ** 85,39 ** _ 45,12 134 15,270 _ ** 144 ** _ _ ** 21,860 ** _ _ ** 37,131 ** _
90,68 0,00 38,77 85,39 45,12 134 15,270 144 21,860 37,131
90,68 0,00 49,78 85,39 45,13 134 15,270 145 21,860 37,131
  

Π’Π°Π±Π»ΠΈΡ†Π° 2.1: jstat -gcutil Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡ‚Ρ‡Π΅Ρ‚

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, отслСТивая ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JConsole (рис. 2.14), ΠΌΡ‹ Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ запуск сборщика мусора для старого поколСния Π½Π΅ сообщаСтся, хотя ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ»Π΅Π±Π»ΡŽΡ‰Π΅Π΅ΡΡ староС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅.

Рисунок 2.14: JConsole ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ объСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ памяти Π² старом ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΈ колСблСтся. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя это ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² старом ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΈ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»Π°ΡΡŒ Π½ΠΈ ΠΎΠ΄Π½Π° сборка мусора.

Какой ΠΈΠ· Π΄Π²ΡƒΡ… инструмСнтов jStat (рисунок 2.13) ΠΈΠ»ΠΈ JConsole (рисунок 2.14) Π²Π΅Ρ€Π½Π°?

На самом Π΄Π΅Π»Π΅, ΠΎΠ±Π° Π²Π΅Ρ€Π½Ρ‹ лишь частично, Ρ‡Ρ‚ΠΎ Π²Π²ΠΎΠ΄ΠΈΡ‚ Π² Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅. ΠΊΠ°ΠΊ сообщаСт jStat, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сборщик мусора Π±Ρ‹Π» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½, Π½ΠΎ ΠΎΠ½ сдСлал это асинхронно ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для старого поколСния, Ρ‡Ρ‚ΠΎ ΠΈ являСтся Π΅Π³ΠΎ Ρ†Π΅Π»ΡŒΡŽ. Π­Ρ‚ΠΎ Π±Ρ‹Π» Π½Π΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ сборщик мусора! JStat сообщаСт ΠΎ сборщиках мусора старого поколСния ΠΊΠ°ΠΊ ΠΎ ΠΏΠΎΠ»Π½Ρ‹Ρ… сборщиках мусора, Ρ‡Ρ‚ΠΎ Π½Π΅Π²Π΅Ρ€Π½ΠΎ. Π‘ΠΊΠΎΡ€Π΅Π΅ всСго, это наслСдиС Π΄Π½Π΅ΠΉ, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠΈΡ… ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π½Ρ‹ΠΌ сборщикам мусора.

JConsole сообщаСт ΠΎΠ± активациях Ρ‡Π΅Ρ€Π΅Π· Java Management Extensions (JMX) ΠΈ управляСмыС bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ (MBeans).Π Π°Π½Π΅Π΅ эти MBean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ сообщали Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… сборщиках мусора. Π’ случаС CMS это происходит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° CMS Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΠ·-Π·Π° Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ памяти ΠΈΠ»ΠΈ высокой скорости ΠΎΡ‚Ρ‚ΠΎΠΊΠ°. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ JConsole Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΉ.

Π’ Π½Π΅Π΄Π°Π²Π½Π΅ΠΌ выпускС CMS, Memory MBean Π±Ρ‹Π» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ± активациях самой CMS; ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ стороной являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ нас большС Π½Π΅Ρ‚ возмоТности ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Π΅ сборщики мусора.

Π’ IBM WebSphere JVM основныС ΠΈ второстСпСнныС сборщики мусора Π½Π΅Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JConsole.ЕдинствСнный способ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ verbose: gc.

По этим ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ ΠΌΡ‹ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ второстСпСнныС сборщики мусора ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΡ†Π΅Π½ΠΈΠ²Π°Π΅ΠΌ сборщики мусора старого поколСния, считая ΠΈΡ… основными. На самом Π΄Π΅Π»Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ приостановки JVM ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΊΡ€ΠΎΡŽΡ‚ΡΡ Π»ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ Π² ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΌ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΈ ΠΈΠ·-Π·Π° ΠΎΡ‚Ρ‚ΠΎΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ»ΠΈ Π² старом ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΈ ΠΈΠ·-Π·Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ опрСдСлСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΠ»ΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти.

Анализатор Π“Π₯ для максимальной пропускной способности


ΠœΡ‹ обсудили влияниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.Однако ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Π° для пропускной способности ΠΈΠ»ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ Π½Π΅ заботимся ΠΎ влиянии Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠ°ΡƒΠ·Ρ‹ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, Π° ΠΎΠ± использовании ЦП ΠΈ ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ приостановки.

Π£Ρ‡Ρ‚ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅. Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ с Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π½Π° 2 сСкунды. Однако допустимо, Ссли каТдая транзакция приостанавливаСтся Π½Π° 50 мс. Если это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… часов, ΠΎΠ±Ρ‰Π΅Π΅ врСмя приостановки, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большС, Ρ‡Π΅ΠΌ 2 сСкунды ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ рСсурсов ЦП, Π½ΠΎ Π½ΠΈ ΠΎΠ΄Π½Π° транзакция Π½Π΅ почувствуСт этого воздСйствия! Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с высокой пропускной ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒΡŽ заботится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ± ΠΎΠ±Ρ‰Π΅ΠΉ приостановкС ΠΈ использовании ЦП, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ ΠΏΡ€ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сборки мусора.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ°ΠΊΡΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ½ΡƒΡŽ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ, сборщик мусора Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ максимально эффСктивным, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сборщик мусора Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ быстрСС. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ приостанавливаСтся Π²ΠΎ врСмя сборки мусора, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ процСссоры. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ использованиС рСсурсов Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π›ΡƒΡ‡ΡˆΠ°Ρ стратСгия здСсь - это ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ»Π½Ρ‹ΠΉ сборщик мусора (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Π° CMS).

Π’Ρ€ΡƒΠ΄Π½ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ использованиС ЦП ΠΏΡ€ΠΈ сборкС мусора, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятный ярлык.ΠœΡ‹ просто провСряСм ΠΎΠ±Ρ‰Π΅Π΅ врСмя выполнСния GC. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ любого доступного бСсплатного ΠΈΠ»ΠΈ коммСрчСского инструмСнта. Π‘Π°ΠΌΡ‹ΠΉ простой способ - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ jstat -gc 1s. Π­Ρ‚ΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π½Π°ΠΌ использованиС ΠΈ ΠΎΠ±Ρ‰Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ GC Π½Π° посСкундной основС (см. Π’Π°Π±Π»ΠΈΡ†Ρƒ 2.2).

  ** S0 ** ** S1 ** ** E ** ** O ** ** P ** ** YGC ** ** YGCT ** ** FGC ** ** FGCT ** ** GCT **
0,00 21,76 69,60 9,17 75,80 ** 63 ** ** 2,646 ** ** 20 ** ** 9,303 ** ** 11,949 **
0,00 21,76 71,24 9,17 75.80 ** 63 ** ** 2,646 ** ** 20 ** ** 9,303 ** ** 11,949 **
0,00 21,76 71,25 9,17 75,80 ** 63 ** ** 2,646 ** ** 20 ** ** 9,303 ** ** 11,949 **
0,00 21,76 71,26 9,17 75,80 ** 63 ** ** 2,646 ** ** 20 ** ** 9,303 ** ** 11,949 **
0,00 21,76 72,90 9,17 75,80 ** 63 ** ** 2,646 ** ** 20 ** ** 9,303 ** ** 11,949 **
0,00 21,76 72,92 9,17 75,80 ** 63 ** ** 2,646 ** ** 20 ** ** 9,303 ** ** 11,949 **
68,74 0,00 1,00 9,17 76,29 _ ** 64 ** _ ** 2,719 ** ** 20 ** ** 9,303 ** _ ** 12.022 ** _
68,74 0,00 29,97 9,17 76,42 ** 64 ** ** 2,719 ** ** 20 ** ** 9,303 ** ** 12,022 **
68,74 0,00 31,94 9,17 76,43 ** 64 ** ** 2,719 ** ** 20 ** ** 9,303 ** ** 12,022 **
68,74 0,00 33,42 9,17 76,43 ** 64 ** ** 2,719 ** ** 20 ** ** 9,303 ** ** 12,022 **
  

Π’Π°Π±Π»ΠΈΡ†Π° 2.2: ВмСсто ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΎΠ±Ρ‰Π΅Π΅ врСмя сборки мусора.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ графичСскиС инструмСнты, врСмя GC ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌ ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π»Π΅Π³Ρ‡Π΅ ΠΊΠΎΡ€Ρ€Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ показатСлями, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ пропускная ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ.На рис. 2.15 ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ хотя сборщик мусора выполняСтся ΠΈ довольно часто приостанавливаСтся Π²ΠΎ всСх Ρ‚Ρ€Π΅Ρ… прилоТСниях, ΠΎΠ½ потрСбляСт большС всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² GoSpaceBackendit, Ρ‡Ρ‚ΠΎ, ΠΏΠΎΡ…ΠΎΠΆΠ΅, Π½Π΅ влияСт Π½Π° ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ½ΡƒΡŽ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ.

Рисунок 2.15. На Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ приостановки сборки мусора Ρ‚Ρ€Π΅Ρ… Ρ€Π°Π·Π½Ρ‹Ρ… JVM Π² контСкстС пропускной способности ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ JVM.

МоТно с ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС рСсурсов ЦП, Ρ‡Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ JVM, ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ сильноС Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ влияниС.Π‘ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ врСмя GC Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ; это Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ! Однако врСмя сборки мусора Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ 10% ΠΎΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ЦП, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Если Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ЦП увСличиваСтся Π½Π΅ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ прилоТСния ΠΈΠ»ΠΈ Ссли Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π½Π΅ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ высока, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сборщика мусора ΠΈΠ»ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ прилоТСния.

Анализ распрСдСлСния


Π Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Java ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Π΄ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с C ++.ΠšΡƒΡ‡Π° ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΉ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для быстрого ΠΈ частого выдСлСния Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Но это Π½Π΅ бСсплатно! РаспрСдСлСниС ΠΌΠΎΠΆΠ΅Ρ‚ быстро ΡΡ‚Π°Ρ‚ΡŒ ΡƒΠ·ΠΊΠΈΠΌ мСстом, ΠΊΠΎΠ³Π΄Π° задСйствовано ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ памяти, Π±ΠΎΠ»Π΅Π΅ частыС сборщики мусора ΠΈΠ·-Π·Π° слишком большого количСства Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΈ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠ·-Π·Π° ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΉ. Π₯отя Π²Π°ΠΌ слСдуСт Π²ΠΎΠ·Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡƒΠ»ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π΄ΠΈ выдСлСния памяти, ΠΎΡ‚ΠΊΠ°Π· ΠΎΡ‚ выдСлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° - Π»ΡƒΡ‡ΡˆΠ°Ρ оптимизация.

ΠšΠ»ΡŽΡ‡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ваши Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ выдСлСния памяти ΠΈΠ»ΠΈ выдСлСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° нСсколько Ρ€Π°Π·. НапримСр, ΠΌΡ‹ часто создаСм Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Ρ†ΠΈΠΊΠ»Π°Ρ…. Часто Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠ΅Ρ€Π΅Π΄ Ρ†ΠΈΠΊΠ»ΠΎΠΌ ΠΈ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ, Π½ΠΎ Π² зависимости ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ количСства рСкурсий Ρ†ΠΈΠΊΠ»Π° это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ большоС влияниС. И хотя это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, большая Ρ‡Π°ΡΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° этого Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚. РаспрСдСлСниС Ρ‚Π°ΠΊΠΈΡ… Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… «констант» Π΄ΠΎ Ρ†ΠΈΠΊΠ»Π° - Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π΄Π°ΠΆΠ΅ Ссли ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния.

Анализ распрСдСлСния - это ΠΌΠ΅Ρ‚ΠΎΠ΄ выдСлСния областСй прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ наибольшСС количСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ наибольший ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. БущСствуСт ряд бСсплатных инструмСнтов, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ JVisualVM], для выполнСния этой Ρ„ΠΎΡ€ΠΌΡ‹ Π°Π½Π°Π»ΠΈΠ·Π°. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ всС эти инструмСнты ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ влияниС Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π²ΠΎ врСмя выполнСния ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°Ρ… производствСнного Ρ‚ΠΈΠΏΠ°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ это Π²ΠΎ врСмя контроля качСства ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΉ ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π’Π°ΠΊΠΆΠ΅ Π²Π°ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ нСдостаточно ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ тСст для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, поэтому Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… производствСнным, ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ для любого Π²ΠΈΠ΄Π° Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π½ΠΎ особСнно для Π°Π½Π°Π»ΠΈΠ·Π° распрСдСлСния.

Рассмотрим ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π― использовал JMeter для выполнСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½Ρ‹Ρ… тСстов ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠΎΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π›ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ JMeter Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΡΡ‚Π°Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ, ΠΈ я быстро ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΎΠ½ страдаСт ΠΎΡ‚ высокого уровня активности сборщика мусора. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΎΡ‚Ρ‚ΠΎΠΊΠ° (ΠΌΠ½ΠΎΠ³ΠΎ GC ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ³ΠΎ поколСния). Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, я использовал ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ инструмСнт (Π² ΠΌΠΎΠ΅ΠΌ случаС, JVisualVM), Ρ‡Ρ‚ΠΎΠ±Ρ‹ провСсти Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· горячих Ρ‚ΠΎΡ‡Π΅ΠΊ распрСдСлСния.ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ, я Ρ…ΠΎΡ‡Ρƒ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΈΠ· распрСдСлСния послС Ρ„Π°Π·Ρ‹ Ρ€Π°Π·ΠΌΠΈΠ½ΠΊΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ доступа нСзависимо ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΠ° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. ΠœΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΊΠ°ΠΆΠ°Ρ‚ΡŒ эти горячиС Ρ‚ΠΎΡ‡ΠΊΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ· Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Ρ„Π°Π·Ρ‹ Ρ€Π°Π·ΠΎΠ³Ρ€Π΅Π²Π° (ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ запуск). Π― просто ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Π» ΠΌΠΈΠ½ΡƒΡ‚Ρƒ послС запуска JMeter, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΈΠ· распрСдСлСния. ЀактичСскоС врСмя выполнСния аналитичСского прилоТСния слСдуСт ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ; Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ€Π΅Π·ΠΊΠΎΠΌΡƒ замСдлСнию Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Анализ (рисунок 2.16) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ΡΡ большС всСго ΠΈ Π³Π΄Π΅ это распрСдСлСниС происходит. Наибольший интСрСс ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ области, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ большиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (большиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ мноТСство Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² своСм конструкторС ΠΈΠ»ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅ΠΉ). ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ области ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΊΠ°ΠΊ извСстно, Π² производствСнных условиях Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. Под Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ эти мСста Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ большС, Π½ΠΎ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Ρ‚ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² самом ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ.Π’ ΠΌΠΎΠ΅ΠΌ сцСнарии я ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Method (рис. 2.16). Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Method Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»Π΅Π³ΠΊΠΎ использован ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π½Π΅Ρ‚ оправдания Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Method.

Рисунок 2.16: JVisualVM сообщаСт ΠΌΠ½Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Method ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ выдСляСмыми Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Π² Π½Π° источник распрСдСлСния (рис. 2.17), я ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Interpreter создавался ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° скрипт выполнялся, Π° Π½Π΅ использовался ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ.Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Method. ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Interpreter ΡƒΠ΄Π°Π»ΠΈΠ»ΠΎ Π±ΠΎΠ»Π΅Π΅ 90% этих распрСдСлСний.

Рисунок 2.17: JVisualVM сообщаСт, Π³Π΄Π΅ Π² ΠΌΠΎΠ΅ΠΌ ΠΊΠΎΠ΄Π΅ прилоТСния происходит Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

Π§Ρ‚ΠΎΠ±Ρ‹ быстро Π½Π΅ ΡΠ±ΠΈΡ‚ΡŒΡΡ с ΠΏΡƒΡ‚ΠΈ, Π²Π°ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π° ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ эффСкт. Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π½ΡƒΠΆΠ½ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎ ΠΈ послС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠ»Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΈ, СстСствСнно, Π±Π΅Π· ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ.Π­Ρ‚ΠΎ СдинствСнный способ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ.

НСкоторыС коммСрчСскиС инструмСнты, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Dynatrace (см. Рисунки 2.18 ΠΈ 2.19), Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ тСстирования распрСдСлСния Π½Π° основС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π² условиях Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ прСимущСство, Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ΡΡ Π² ΡƒΡ‡Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, связанных с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ½Π°Ρ‡Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ воспроизвСсти ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅.

Рисунок 2.18: Dynatrace сообщаСт ΠΌΠ½Π΅, ΠΊΠ°ΠΊ часто ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ выдСлялся Π² сцСнарии Π½Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½ΠΎΠ³ΠΎ тСстирования.

Рисунок 2.19. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Dynatrace ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΌΠ½Π΅, Π³Π΄Π΅ Π² ΠΌΠΎΠ΅ΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π±Ρ‹Π» Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Анализ памяти - Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ


Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ рассматривали влияниС сборки ΠΈ выдСлСния мусора Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ прилоТСния. Π― Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ заявлял, Ρ‡Ρ‚ΠΎ высокая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° памяти являСтся ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠΉ сборки мусора. Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Π΅ ограничСния Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ просто ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ JVM. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΡƒΡ‡ΠΈ Π½Π΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ использованиС просто ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ расти.Если это Ρ‚Π°ΠΊ, ΠΏΠΎΡ€Π° Π±ΠΎΠ»Π΅Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ использованиС памяти, просмотрСв Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ.

Π”Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ - это снимок основной памяти. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ JVM ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… инструмСнтов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… JVM TI. К соТалСнию, Π΄Π°ΠΌΠΏΡ‹ ΠΊΡƒΡ‡ΠΈ, ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π² JVM, Π½Π΅ стандартизированы. Π’ Oracle HotSpot JVM ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°ΠΌΠΏΡ‹ ΠΊΡƒΡ‡ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ jmap, jhat ΠΈ VisualVM. JRockit Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя JRockit Mission Control, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ряд Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠΌΠΈΠΌΠΎ самого Π°Π½Π°Π»ΠΈΠ·Π° памяти.

Π”Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ сам ΠΏΠΎ сСбС содСрТит ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π½ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ это богатство затрудняСт Π°Π½Π°Π»ΠΈΠ· - Π²Ρ‹ Π»Π΅Π³ΠΊΠΎ ΡƒΡ‚ΠΎΠ½Π΅Ρ‚Π΅ Π² количСствС Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ Π²Π°ΠΆΠ½Ρ‹ Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ: Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ инструмСнт ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°. Π’ Ρ†Π΅Π»ΠΎΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Ρ‹:

  • ВыявлСниС ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти
  • Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ поТиратСля памяти

ВыявлСниС ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти


ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½, Π½ΠΎ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти.На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΌΡ‹ заботимся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ± ΡƒΡ‚Π΅Ρ‡ΠΊΠ°Ρ… памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ растут ΠΈΠ»ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ памяти. Випичная ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти - это ΡƒΡ‚Π΅Ρ‡ΠΊΠ°, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° создаСтся ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ, Π½ΠΎ Π½Π΅ собираСтся сборщиком мусора (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ хранится Π² растущСм спискС ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²). Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ нСсколько Π΄Π°ΠΌΠΏΠΎΠ² ΠΊΡƒΡ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π°ΠΌΠΏΠΎΠ² Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΉ.

Π”Π°ΠΌΠΏ с отслСТиваниСм Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΉ Π΄Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ статистику количСства экзСмпляров Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ класса ΠΈ поэтому ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдоставлСн JVM ΠΎΡ‡Π΅Π½ΡŒ быстро.Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΡŽ ΠΊ росту. КаТдоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Java ΠΈΠΌΠ΅Π΅Ρ‚ большоС количСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² String, char [] ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… стандартных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Java. ЀактичСски, char [] ΠΈ String ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ наибольшСС количСство экзСмпляров, Π½ΠΎ ΠΈΡ… Π°Π½Π°Π»ΠΈΠ· Π½ΠΈ ΠΊ Ρ‡Π΅ΠΌΡƒ Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚. Π”Π°ΠΆΠ΅ Ссли Π±Ρ‹ Ρƒ нас происходила ΡƒΡ‚Π΅Ρ‡ΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² String, скорСС всСго, это Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π° Π½ΠΈΡ… ссылаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ концСнтрация Π½Π° классах нашСго собствСнного прилоТСния даст Π±ΠΎΠ»Π΅Π΅ быстрыС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

На рис. 2.20 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ нСсколько Π΄Π°ΠΌΠΏΠΎΠ² Ρ‚Ρ€Π΅Π½Π΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я взял ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅, ΠΊΠ°ΠΊ я ΠΏΠΎΠ΄ΠΎΠ·Ρ€Π΅Π²Π°Π», ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ памяти. Π― ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π» всС стандартныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Java ΠΈ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π» ΠΈΡ… ΠΏΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Ρƒ ΠΌΠΎΠ΅Π³ΠΎ прилоТСния. Π― сразу нашСл Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, количСство экзСмпляров ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ постоянно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π»ΠΎΡΡŒ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ рассматриваСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Ρ‹Π» Ρ‚Π°ΠΊΠΆΠ΅ извСстСн ΠΌΠΎΠ΅ΠΌΡƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ, ΠΌΡ‹ сразу поняли, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти.

Рис. 2.20. Π”Π°ΠΌΠΏ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΉ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² количСствС.

ВыявлСниС ΠΏΠΎΠΆΠΈΡ€Π°Ρ‚Π΅Π»Π΅ΠΉ памяти


Π•ΡΡ‚ΡŒ нСсколько случаСв, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ провСсти ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· памяти.

  • Анализ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΉ Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π» вас ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅ памяти
  • Π’Π°ΡˆΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ памяти, Π½ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ явной ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти, ΠΈ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ
  • Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π°Π½Π°Π»ΠΈΠ· Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΉ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ растСт слишком быстро, Π° ваша JVM Π΄Π°Π΅Ρ‚ сбой

Π’ΠΎ всСх Ρ‚Ρ€Π΅Ρ… случаях основной ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ, скорСС всСго, являСтся ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находятся Π² ΠΊΠΎΡ€Π½Π΅ большСго Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².Π­Ρ‚ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ сборку мусора для мноТСства Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π΄Π΅Ρ€Π΅Π²Π΅. Π’ случаС ошибки Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти Π²ΠΏΠΎΠ»Π½Π΅ вСроятно, Ρ‡Ρ‚ΠΎ горстка ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² прСпятствуСт освобоТдСнию большого количСства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‚Π΅ΠΌ самым вызывая ΠΎΡˆΠΈΠ±ΠΊΡƒ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти. ЦСль Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ - Π½Π°ΠΉΡ‚ΠΈ эту горстку ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ часто являСтся большой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ для Π°Π½Π°Π»ΠΈΠ·Π° памяти. Для создания Π΄Π°ΠΌΠΏΠ° ΠΊΡƒΡ‡ΠΈ трСбуСтся сама ΠΏΠ°ΠΌΡΡ‚ΡŒ. Если Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΡƒΡ‡ΠΈ находится Π½Π° ΠΏΡ€Π΅Π΄Π΅Π»Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ доступно ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ (32-разрядныС JVM Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ 3 Ρ„Π°ΠΉΠ»ΠΎΠ².5 Π“Π‘), JVM ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ приостановит Ρ€Π°Π±ΠΎΡ‚Ρƒ JVM. Π’ зависимости ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° это ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ нСсколько ΠΌΠΈΠ½ΡƒΡ‚ ΠΈΠ»ΠΈ большС. НС стоит этого Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ.

Когда Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Найти Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ. Однако поиск Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сборку мусора для всСго Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (ΠΈΠ»ΠΈ сСти), быстро становится прСсловутой ΠΈΠ³Π»ΠΎΠΉ Π² стогС сСна.

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Ρ‚Π°ΠΊΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ Dynatrace, ΠΌΠΎΠ³ΡƒΡ‚ автоматичСски ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.Для этого ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ доминирования, основанный Π½Π° Ρ‚Π΅ΠΎΡ€ΠΈΠΈ Π³Ρ€Π°Ρ„ΠΎΠ². Π­Ρ‚ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΊΠΎΡ€Π΅Π½ΡŒ Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Помимо вычислСния ΠΊΠΎΡ€Π½Π΅ΠΉ Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², инструмСнт Π°Π½Π°Π»ΠΈΠ·Π° памяти вычисляСт, сколько памяти Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ освобоТдСниС большого объСма памяти - Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Π² памяти (см. Рис. 2.21).

Рисунок 2.21: Π­Ρ‚ΠΎ схСматичСскоС прСдставлСниС Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².Π’ этом прСдставлСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ 1 являСтся ΠΊΠΎΡ€Π½Π΅ΠΌ Π΄Π΅Ρ€Π΅Π²Π° ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π°Π΄ всСми ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим это Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π° РисункС 2.21. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ 1 являСтся ΠΊΠΎΡ€Π½Π΅ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ 1 большС Π½Π΅ ссылаСтся Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ 3, всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² состоянии 3, Π±ΡƒΠ΄ΡƒΡ‚ собраны Π² мусор. Π’ этом смыслС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ 3 Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π°Π΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ 6, 7, 8 ΠΈ 9. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ 4 ΠΈ 5 Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ сборщиком мусора, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π° Π½ΠΈΡ… ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ссылаСтся ΠΎΠ΄ΠΈΠ½ Π΄Ρ€ΡƒΠ³ΠΎΠΉ (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ 2). Однако, Ссли ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ 1 Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½, всС ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ здСсь ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ собраны мусором.Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ 1 Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π°Π΄ всСми Π½ΠΈΠΌΠΈ.

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ инструмСнт ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ динамичСский Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° 1, суммируя Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½ Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ сдСлано, Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‚ Π² памяти. На рисункС 2.21 ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ 1 ΠΈ 3 Π±ΡƒΠ΄ΡƒΡ‚ самыми большими горячими Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ способ использования этого - просмотр горячСй Ρ‚ΠΎΡ‡ΠΊΠΈ памяти, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рисункС 2.22:

.

Рисунок 2.22. Π­Ρ‚ΠΎ прСдставлСниС горячСй Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ массив HashMap $ Entry, Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ Π±ΠΎΠ»Π΅Π΅ 80 ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΎΠ² ΠΊΡƒΡ‡ΠΈ.

Массив HashMap $ Entry Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ - Π½Π° Π½Π΅Π³ΠΎ приходится Π±ΠΎΠ»Π΅Π΅ 80 ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΎΠ² ΠΊΡƒΡ‡ΠΈ. Если Π±Ρ‹ ΠΎΠ½ собирался сборщиком мусора, 80% нашСй ΠΊΡƒΡ‡ΠΈ Π±Ρ‹Π»ΠΎ Π±Ρ‹ пустым. ΠžΡ‚ΡΡŽΠ΄Π° ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°ΠΌΠΏ ΠΊΡƒΡ‡ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ сам этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π±Ρ‹Π» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ сборщиком мусора. Π•Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Π½Π°Π΄ ΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‚ ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ эту Π³ΠΎΡ€ΡΡ‡ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ. Π’ Dynatrace ΠΌΡ‹ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ это Π½Π°Π±ΠΎΡ€ΠΎΠΌ Keep Alive Set (см. Рис. 2.23).

Рисунок 2.23: Набор keep alive ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ массив HashMap $ Entry.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΌΠΎΠΆΠ½ΠΎ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠΈΠ½ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ большая ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти ΠΈΠ»ΠΈ кэш ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ памяти.

.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *