Как прочитать состояние кучи с помощью jdk 11?

#java #java-11

#java #java-11

Вопрос:

С jdk 8 это были мои шаги, чтобы выяснить, сколько памяти потребляется во время выполнения процесса:

 /usr/java/latest/bin>: ./jps

  27116 Main
  7591 Jps
  2879 AmbusProcessor   
  

Затем выбрал идентификатор процесса, чтобы проверить состояние кучи :

 /usr/java/latest/bin>: ./jmap -heap 2879  



Attaching to process ID 2879, please wait...

Debugger attached successfully.
Server compiler detected.
JVM version is 24.45-b08
using thread-local object allocation.
Parallel GC with 13 thread(s)

Heap Configuration:

   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 68719476736 (65536.0MB)     
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 134217728 (128.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:

PS Young Generation

Eden Space:    
   capacity = 15427698688 (14713.0MB)
   used     = 9122094480 (8699.507217407227MB)
   free     = 6305604208 (6013.492782592773MB)
   59.128031111311266% used

From Space:

   capacity = 2062024704 (1966.5MB)
   used     = 813973552 (776.2656707763672MB)
   free     = 1248051152 (1190.2343292236328MB)
   39.474481097196396% used

To Space:   

   capacity = 1944059904 (1854.0MB)
   used     = 0 (0.0MB)
   free     = 1944059904 (1854.0MB)
   0.0% used

PS Old Generation  

   capacity = 8520204288 (8125.5MB)
   used     = 6649238896 (6341.208358764648MB)
   free     = 1870965392 (1784.2916412353516MB)
   78.04083882548333% used

PS Perm Generation

   capacity = 31981568 (30.5MB)
   used     = 16156728 (15.408256530761719MB)
   free     = 15824840 (15.091743469238281MB)
   50.518873871349896% used

6141 interned Strings occupying 609896 bytes.
  

Я ищу способ прочитать статус, который должен выглядеть как приведенный выше пример, однако, не найдя такой опции с openjdk 11. Я перепробовал все возможные варианты в jmap на openjdk11.
Есть ли еще способ получить такое чтение состояния с помощью openjdk11?
Я пытаюсь выполнить сброс именно тогда, когда происходит выход из памяти

Ответ №1:

Для более новых версий Java, таких как JDK 11, вы можете использовать эту команду:

 jhsdb jmap --heap --pid <pid>
  

Вывод почти такой же, как с Java 8 и jmap .

Ответ №2:

Есть несколько параметров JVM, которые могут помочь вам, записав информацию о GC:

   -XX: PrintGCDetails
  -XX: PrintGCDateStamps
  -XX: PrintHeapAtGC
  -XX: PrintTenuringDistribution
  -XX: PrintGCApplicationStoppedTime
  -XX: HeapDumpOnOutOfMemoryError
  -XX: UseGCLogFileRotation
  -XX:NumberOfGCLogFiles=10
  -XX:GCLogFileSize=10M
  

Файл, созданный HeapDumpOnOutOfMemoryError, может быть проанализирован с помощью инструментов, поставляемых с JDK. Смотрите также https://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/clopts.html

редактировать: Есть также некоторые официальные документы об отладке проблем с памятью в Java 11:https://docs.oracle.com/en/java/javase/11/troubleshoot/troubleshoot-memory-leaks.html