Использование Виртуальной памяти от Java в соответствии с Linux, слишком много памяти используется

Вот что сработало для меня:

CSS

h2{
    position:relative;
}
h2 > a{
    position:absolute;
    top: -12.5vh;
}

HTML

[ 111]

Надеюсь, это поможет кому-то в будущем.

Благодарю

246
задан Lii 22 November 2017 в 01:45
поделиться

6 ответов

Это было давней жалобой с Java, но это в основном бессмысленно, и обычно на основе рассмотрения неправильной информации. Обычная формулировка - что-то как "Привет, Мир на Java берет 10 мегабайтов! Почему этому нужно это?" Ну, Вот способ заставить Привет Мир на 64-разрядной JVM утверждать, что принял 4 гигабайта..., по крайней мере, одной формой измерения.

java -Xms1024m -Xmx4096m com.example.Hello

Различные Способы Измерить Память

На Linux, вершина команда дает Вам несколько различных чисел для памяти. Вот то, что это говорит о Привет Мировом примере:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 2120 kgregory  20   0 4373m  15m 7152 S    0  0.2   0:00.10 java
  • VIRT является пространством виртуальной памяти: сумма всего в карте виртуальной памяти (см. ниже). Это в основном бессмысленно, кроме тех случаев, когда это не (см. ниже).
  • RES является размером резидентного набора: число страниц, которые в настоящее время являются резидентным объектом в RAM. Почти во всех случаях это - единственное число, которое необходимо использовать при высказывании "слишком большой". Но это все еще не очень большое количество, особенно при разговоре о Java.
  • SHR является объемом резидентной памяти, которая совместно используется с другими процессами. Для процесса Java это обычно ограничивается общими библиотеками и JARfiles с отображенной памятью. В этом примере у меня только было одно выполнение процесса Java, таким образом, я подозреваю, что 7k является результатом библиотек, пользовавшихся ОС.
  • ПОДКАЧКА не включена по умолчанию и не показана здесь. Это указывает на объем виртуальной памяти, которая в настоящее время является резидентным объектом на диске, , является ли это на самом деле в области подкачки . ОС очень хороша о хранении активных страниц в RAM, и единственные средства исправления для свопинга являются (1) покупкой больше памяти, или (2) сокращают количество процессов, поэтому лучше игнорировать это число.

ситуация для Windows Task Manager немного более сложна. Под Windows XP существуют столбцы "Memory Usage" и "Virtual Memory Size", но официальная документация тиха на том, что они имеют в виду. Windows Vista и Windows 7 добавляют больше столбцов, и они на самом деле , зарегистрировал . Из них измерение "Рабочего набора" является самым полезным; это примерно соответствует сумме RES и SHR на Linux.

Понимание Карты

Виртуальной памяти виртуальная память, использованная процессом, является общим количеством всего, что это находится в карте распределения памяти процесса. Это включает данные (например, "куча" Java), но также и все общие библиотеки и файлы с отображенной памятью, используемые программой. На Linux можно использовать команда pmap для наблюдения всех вещей, отображенных в пространство процесса (отсюда на, я только собираюсь обратиться к Linux, потому что это - то, что я использую; я уверен, что существуют эквивалентные инструменты для Windows). Вот выборка из карты распределения памяти "Привет Мировой" программы; вся карта распределения памяти является более чем 100 строками долго, и весьма обычно иметь тысячу списков строки.

0000000040000000     36K r-x--  /usr/local/java/jdk-1.6-x64/bin/java
0000000040108000      8K rwx--  /usr/local/java/jdk-1.6-x64/bin/java
0000000040eba000    676K rwx--    [ anon ]
00000006fae00000  21248K rwx--    [ anon ]
00000006fc2c0000  62720K rwx--    [ anon ]
0000000700000000 699072K rwx--    [ anon ]
000000072aab0000 2097152K rwx--    [ anon ]
00000007aaab0000 349504K rwx--    [ anon ]
00000007c0000000 1048576K rwx--    [ anon ]
...
00007fa1ed00d000   1652K r-xs-  /usr/local/java/jdk-1.6-x64/jre/lib/rt.jar
...
00007fa1ed1d3000   1024K rwx--    [ anon ]
00007fa1ed2d3000      4K -----    [ anon ]
00007fa1ed2d4000   1024K rwx--    [ anon ]
00007fa1ed3d4000      4K -----    [ anon ]
...
00007fa1f20d3000    164K r-x--  /usr/local/java/jdk-1.6-x64/jre/lib/amd64/libjava.so
00007fa1f20fc000   1020K -----  /usr/local/java/jdk-1.6-x64/jre/lib/amd64/libjava.so
00007fa1f21fb000     28K rwx--  /usr/local/java/jdk-1.6-x64/jre/lib/amd64/libjava.so
...
00007fa1f34aa000   1576K r-x--  /lib/x86_64-linux-gnu/libc-2.13.so
00007fa1f3634000   2044K -----  /lib/x86_64-linux-gnu/libc-2.13.so
00007fa1f3833000     16K r-x--  /lib/x86_64-linux-gnu/libc-2.13.so
00007fa1f3837000      4K rwx--  /lib/x86_64-linux-gnu/libc-2.13.so
...

А быстрое объяснение формата: каждая строка запускается с адреса виртуальной памяти сегмента. Это сопровождается размером сегмента, полномочиями и источником сегмента. Этот последний объект является или файлом или "скоро", который указывает на блок памяти, выделенной через [1 111] mmap.

Запуск с вершины, мы имеем

  • загрузчик JVM (т.е., программа, которая запущена когда Вы тип java). Это является очень маленьким; все, что это делает, загрузиться в общих библиотеках, где реальный код JVM хранится.
  • набор А скоро блоков, содержащих "кучу" Java и внутренние данные. Это - JVM Sun, таким образом, "куча" повреждается в несколько поколений, каждое из которых является своим собственным блоком памяти. Обратите внимание, что JVM выделяет пространство виртуальной памяти на основе эти -Xmx значение; это позволяет этому иметь непрерывную "кучу". Эти -Xms значение используется внутренне для высказывания, сколько из "кучи" используется, когда программа запускается, и инициировать сборку "мусора", поскольку к тому пределу приближаются.
  • А JARfile с отображенной памятью, в этом случае файл, который содержит "классы JDK". Когда Вы карта распределения памяти JAR, можно получить доступ к файлам в нем очень эффективно (по сравнению с чтением его от запуска каждый раз). JVM Sun будет карта распределения памяти все Раздражать путь к классу; если Ваш код приложения должен получить доступ к JAR, Вы можете также карта распределения памяти он.
  • данные На поток для двух потоков. 1M блок является стопкой потока; я не знаю то, что входит в 4K блок. Для реального приложения Вы будете видеть десятки если не сотни этих записей, повторенных через карту распределения памяти.
  • Одна из общих библиотек, которая содержит фактический код JVM. Существует несколько из них.
  • общая библиотека для стандартной библиотеки C. Это - только одна из многих вещей, что загрузки JVM, которые не являются строго частью Java.

общие библиотеки особенно интересны: каждая общая библиотека имеет по крайней мере два сегмента: сегмент только для чтения, содержащий код библиотеки и сегмент чтения-записи, который содержит глобальные данные для каждого процесса для библиотеки (я не знаю, каков сегмент без полномочий; я только видел его на x64 Linux). Часть только для чтения библиотеки может быть совместно использована всеми процессами, которые пользуются библиотекой; например, libc имеет 1.5M пространства виртуальной памяти, которое может быть совместно использовано.

, Когда Размер Виртуальной памяти Важен?

карта виртуальной памяти содержит много материала. Часть его только для чтения, часть его совместно используется, и часть его выделяется, но никогда не затрагивается (например, почти все 4 ГБ "кучи" в этом примере). Но операционная система достаточно умна, чтобы только загрузить то, в чем она нуждается, таким образом, размер виртуальной памяти в основном не важен.

то, Где размер виртуальной памяти важен, - то, если Вы работаете на 32-разрядной операционной системе, где можно только выделить 2 ГБ (или, в некоторых случаях, 3 ГБ) адресного пространства процесса. В этом случае Вы имеете дело с дефицитным ресурсом и, возможно, придется сделать компромиссы, такие как сокращение Вашего размера "кучи", чтобы к карте распределения памяти большой файл или создает много потоков.

, Но, учитывая, что 64-разрядные машины повсеместны, я не думаю, что это будет задолго до того, как Размер Виртуальной памяти является абсолютно несоответствующей статистической величиной.

, Когда Размер Резидентного набора Важен?

размер Резидентного набора - то, что часть пространства виртуальной памяти, которое находится на самом деле в RAM. Если Ваш RSS растет, чтобы быть значительной частью Вашей общей физической памяти, могло бы быть пора начать вызывать беспокойство. Если Ваш RSS растет для приведения в рабочее состояние всей физической памяти, и система начинает подкачивать, это - хорошо прошлый раз, чтобы начать вызывать беспокойство.

, Но RSS также вводит в заблуждение, особенно на слегка загруженной машине. Операционная система не расходует большое усилие к исправлению страниц, используемых процессом. Существует мало преимущества, которое будет получено путем выполнения так, и потенциал для дорогого отсутствия страницы, если процесс касается страницы в будущем. В результате статистическая величина RSS может включать много страниц, которые не находятся в активном употреблении.

Нижняя строка

, Если Вы не подкачиваете, не становится чрезмерно касавшейся тем, что различные статистические данные памяти говорят Вам. С протестом, что постоянно растущий RSS может указать на своего рода утечку памяти.

С программой Java, намного более важно обратить внимание на то, что происходит в "куче". Общая сумма занимавшего места важна, и существуют некоторые шаги, которые можно сделать для сокращения этого. Более важный количество времени, которое Вы проводите в сборке "мусора", и какие части "кучи" становятся собранными.

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

599
ответ дан Steephen 23 November 2019 в 03:02
поделиться

Объем памяти, выделенный для процесса Java, в значительной степени на одном уровне с тем, что я ожидал бы. У меня были подобные проблемы при работе встроенного Java / память ограничила системы. При выполнении любой приложение с произвольными пределами VM или в системах, которые не имеют необходимых объемов подкачки, имеет тенденцию повреждаться. Это, кажется, природа многих современных приложений, которые не являются дизайном для использования в системах с ограниченными ресурсами.

у Вас есть еще несколько опций, можно попытаться ограничить объем потребляемой памяти JVM. Это могло бы уменьшить место виртуальной памяти:

-XX:ReservedCodeCacheSize=32m Зарезервированный размер кэша кода (в байтах) - максимум кодируют размер кэша. [64-разрядный Солярис, amd64, и - сервер x86: 48 м; в 1.5.0_06 и ранее, 64-разрядный Солярис и and64: 1024 м.]

-XX:MaxPermSize=64m Размер Постоянного Поколения. [5.0 и более новый: VMs на 64 бита масштабируются на 30% больше; 1,4 amd64: 96 м; 1.3.1 - клиент: 32 м.]

кроме того, также необходимо установить-Xmx (макс. размер "кучи") к значению максимально близко к фактическое пиковое использование памяти из приложения. Я полагаю, что поведение по умолчанию JVM все еще к двойное размер "кучи" каждый раз, когда это разворачивает его до максимум. Если бы Вы запускаете с 32M, "куча" и Ваше приложение достигли максимума к 65M, то "куча" закончила бы тем, что росла 32M-> 64M-> 128M.

Вы могли бы также попробовать это для создания менее агрессивного VM о росте "кучи":

-XX:MinHeapFreeRatio=40 Минимальный процент "кучи", свободной после GC избегать расширения.

кроме того, от того, что я вспоминаю из экспериментирования с этим несколько лет назад, число собственных загруженных библиотек оказало огромное влияние на минимальное место. Загрузка java.net. Сокет добавил больше, чем 15M, если я вспоминаю правильно (и я, вероятно, не делаю).

9
ответ дан James Schek 23 November 2019 в 03:02
поделиться

JVM Sun требует большой памяти для HotSpot, и это отображается в библиотеках времени выполнения в общей памяти.

, Если память является проблемой, рассматривают использование другой JVM, подходящей для встраивания. IBM имеет j9, и существует Открытый исходный код "jamvm", который пользуется библиотеками пути к классу GNU. Также Sun имеет JVM Писка, работающую на SunSPOTS, таким образом, существуют альтернативы.

7
ответ дан Thorbjørn Ravn Andersen 23 November 2019 в 03:02
поделиться

Просто мысль, но можно проверить влияние ulimit -v опция .

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

3
ответ дан VonC 23 November 2019 в 03:02
поделиться

java 1.4 Sun имеет следующие аргументы размеру управляющей памяти:

-Xmsn Указывают начальный размер, в байтах, пула выделения памяти. Это значение должно быть кратным 1 024 большим, чем 1 МБ. Добавьте букву K или K для указания на килобайты, или m или M для указания на мегабайты. Значение по умолчанию составляет 2 МБ. Примеры:

           -Xms6291456
           -Xms6144k
           -Xms6m

-Xmxn Указывают максимальный размер, в байтах, пула выделения памяти. Это значение должно несколько из 1 024 больших, чем 2 МБ. Добавьте букву K или K для указания на килобайты, или m или M для указания на мегабайты. Значение по умолчанию составляет 64 МБ. Примеры:

           -Xmx83886080
           -Xmx81920k
           -Xmx80m

http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html

Java 5 и 6 имеют еще немного. См. http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

1
ответ дан Paul Tomblin 23 November 2019 в 03:02
поделиться

Нет, Вы не можете настроить сумму памяти, необходимую VM. Однако обратите внимание, что это - виртуальная память, не резидентный объект, таким образом, это просто остается там без вреда если не на самом деле используемым.

Alernatively, можно попробовать некоторую другую JVM затем Sun один с меньшим объемом потребляемой памяти, но я не могу советовать здесь.

0
ответ дан Marko 23 November 2019 в 03:02
поделиться
Другие вопросы по тегам:

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