Использование собственной памяти Java - PullRequest
5 голосов
/ 03 мая 2010

Есть ли какой-нибудь инструмент, чтобы узнать, сколько собственной памяти было использовано из моего Java-приложения? Я испытал внеочередную память из моего заявления: Текущая настройка: -Xmx900m

Компьютер, Windows 2003 Server 32 бита, RAM 4 ГБ.

Также изменяет boot.ini на / 3GB на windows, будет какая-то разница? Если установлен Xmx900m, сколько макс. Собственной памяти может быть выделено для этого процесса? это 1100м?

Ответы [ 6 ]

12 голосов
/ 19 июня 2015

(в моем случае я использую Java 8)

добавить в командную строку: -XX:NativeMemoryTracking=summary

затем запустите jcmd <PID> VM.native_memory

Вы должны получить что-то вроде этого:

Total: reserved=3863657KB, committed=1679977KB
-                 Java Heap (reserved=1843200KB, committed=824320KB)
                            (mmap: reserved=1843200KB, committed=824320KB) 

-                     Class (reserved=1311974KB, committed=298726KB)
                            (classes #52579)
                            (malloc=5350KB #76340) 
                            (mmap: reserved=1306624KB, committed=293376KB) 

-                    Thread (reserved=263278KB, committed=263278KB)
                            (thread #256)
                            (stack: reserved=262140KB, committed=262140KB)
                            (malloc=839KB #1280) 
                            (arena=299KB #510)

-                      Code (reserved=278521KB, committed=164773KB)
                            (malloc=28921KB #37983) 
                            (mmap: reserved=249600KB, committed=135852KB) 

-                        GC (reserved=114897KB, committed=77093KB)
                            (malloc=13729KB #67925) 
                            (mmap: reserved=101168KB, committed=63364KB) 

-                  Compiler (reserved=461KB, committed=461KB)
                            (malloc=330KB #1138) 
                            (arena=131KB #3)

-                  Internal (reserved=13877KB, committed=13877KB)
                            (malloc=13845KB #72978) 
                            (mmap: reserved=32KB, committed=32KB) 

-                    Symbol (reserved=28871KB, committed=28871KB)
                            (malloc=24740KB #275452) 
                            (arena=4131KB #1)

-    Native Memory Tracking (reserved=8393KB, committed=8393KB)
                            (malloc=45KB #523) 
                            (tracking overhead=8348KB)

-               Arena Chunk (reserved=184KB, committed=184KB)
                            (malloc=184KB) 

Для получения дополнительной информации см. https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html

3 голосов
/ 24 октября 2013

Эта статья дает полезную информацию о поиске проблем с собственной памятью и объясняет, как у вас заканчивается собственная память.

1 голос
/ 28 февраля 2013

Для тех, кто придет после, VMMap даст вам ваш ответ. Это покажет родные распределения памяти. По моему опыту, -Xss игнорируется при минимальном размере 124 КБ, как я полагаю, в блоках выделения ОС. Выделение ОС происходит удваивающимися порциями, пока оно не достигнет 1 ГБ (и тогда все готово.) Если вы не можете уменьшить свои потоки, попробуйте уменьшить параметры max heap и max permgen или попробуйте переключатель / 3GB.

0 голосов
/ 18 февраля 2016

Собственная память - это область, которая обычно используется JVM для внутренних операций и выполнения кодов JNI. JVM использует собственную память для оптимизации кода и для загрузки классов и библиотек вместе с промежуточной генерацией кода. Размер встроенной памяти зависит от архитектуры операционной системы и объема памяти, который уже выделен для кучи Java. Собственная память - это область процессов, в которую загружаются коды JNI, загружаются библиотеки JVM или загружаются собственные пакеты Performance и модули Proxy. Не существует опции JVM для определения размера родной области. но мы можем приблизительно рассчитать его по следующей формуле:

NativeMemory = (ProcessSize - MaxHeapSize - MaxPermSize)

Нашел это на devopsconsole

0 голосов
/ 03 мая 2010

Свободное пространство процесса чуть меньше 2 ГБ - Xmx. (при условии Sun JVM) Вы должны добавить свое пространство permgen к Xmx, а затем вычесть около 150-200MB или около того для ядра ОС. Если реальная проблема заключается в подлинной нехватке памяти, переключатель 3 ГБ или сокращение пространства Xmx и PermGen должны уменьшить его. Иногда, по крайней мере в Windows, ОС просто требуется больше времени, чем JVM готова подождать, чтобы выделить поток, и проблема скорее в том, что вы создаете спам, а не исчерпывает память. У вас должно быть пространство памяти для нескольких тысяч потоков. Сколько у вас есть, прежде чем он сдастся?

Также есть ключ -Xss для управления размером стека потоков, который запрашивает JVM. YMMV, если изменить его, что-то делает на Windows или нет.

0 голосов
/ 03 мая 2010

Если вы используете, например, jvisualvm (поставляется с jdk), вы можете увидеть, сколько памяти использует ваше приложение, вы также можете более подробно его профилировать.

...