размножение памяти jvm, которое достигает удвоения xmx [duplicate]

Вы используете объект, содержащий ссылку нулевого значения. Таким образом, он дает пустое исключение. В примере строковое значение равно null, и при проверке его длины произошло исключение.

Пример:

string value = null;
if (value.Length == 0) // <-- Causes exception
{
    Console.WriteLine(value); // <-- Never reached
}

Ошибка исключения:

Необработанное исключение:

System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта. в Program.Main ()

5
задан Adelave 3 May 2010 в 08:55
поделиться

6 ответов

(в моем случае я использую 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

10
ответ дан Eugene To 27 August 2018 в 20:57
поделиться

В этой статье представлена ​​хорошая информация об устранении проблем с внутренней памятью и объясняется, как вы исчерпали собственную память.

3
ответ дан 11101101b 27 August 2018 в 20:57
поделиться

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

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

0
ответ дан Affe 27 August 2018 в 20:57
поделиться
  • 1
    Таким образом, вы говорите, что максимальная память занимает около 2GB - Xmx - Xmx permgen space = Макс. Является ли переход на 3 ГБ, также расширит собственное пространство памяти? так что это становится: 3 ГБ - Xmx - Xmx permgen space = Максимальное собственное пространство памяти. Есть ли какой-либо инструмент для мониторинга этого реального времени, afaik, я не могу найти этот показатель в jconsole / jvisualvm. большое спасибо. – Adelave 3 May 2010 в 10:26
  • 2
    Проводник процесса предоставит вам довольно подробную информацию: technet.microsoft.com/en-us/sysinternals/bb896653.aspx Глубокие внутренние функции управления памятью Windows сложны. Я не знаю, существует ли даже простая формула для получения «точного» количества, сколько места у вас действительно есть в любой момент времени. В основном вы кладете сервер приложений под производственную нагрузку и настраиваете кучу до тех пор, пока не найдете место, где вы не получите ни Native Threads, ни Out of Heap Space. – Affe 3 May 2010 в 19:49

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

1
ответ дан dmalechek 27 August 2018 в 20:57
поделиться

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

-1
ответ дан Mirek Pluta 27 August 2018 в 20:57
поделиться
  • 1
    hi Luno, jvisualvm только предоставляют мне бесплатную и используемую память кучи, мне нужна свободная собственная память. У меня заканчивается память. – Adelave 3 May 2010 в 09:15
  • 2

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

NativeMemory = (ProcessSize - MaxHeapSize - MaxPermSize)

Найден это в devopsconsole

0
ответ дан user2173387 27 August 2018 в 20:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: