Как контролировать использование памяти Java?

Можно время от времени писать код мусора

Иногда быстрый и грязный кусок кода мусора - это все, что необходимо для выполнения конкретной задачи. Шаблоны, ORM, SRP, что угодно ... Добавьте консоль или веб-приложение, напишите некоторый встроенный sql (чувствует себя хорошо) и выпустите требование.

60
задан Community 23 May 2017 в 12:26
поделиться

10 ответов

Если вы действительно хотите посмотреть, что происходит в памяти виртуальной машины, вам следует использовать хороший инструмент, например VisualVM . Это бесплатное программное обеспечение, и это отличный способ увидеть, что происходит.

На самом деле нет ничего "неправильного" в явных вызовах gc (). Однако помните, что когда вы вызываете gc (), вы «предлагаете» запустить сборщик мусора. Нет никакой гарантии, что он будет запущен в то время, когда вы запустите эту команду.

52
ответ дан 24 November 2019 в 17:40
поделиться

Как было предложено, попробуйте VisualVM, чтобы получить базовое представление.

Вы также можете использовать Eclipse MAT, чтобы выполнить более подробный анализ памяти.

Это нормально, чтобы сделать Систему .gc (), если вы не зависите от него, для правильности вашей программы.

0
ответ дан 24 November 2019 в 17:40
поделиться

Проблема с system.gc заключается в том, что JVM уже автоматически выделяет время сборщику мусора на основе использования памяти.

Однако, если вы, например, работаете в очень состояние ограниченного объема памяти, как и на мобильном устройстве, System.gc позволяет вручную выделять больше времени на сборку мусора, но за счет времени процессора (но, как вы сказали, вас не беспокоят проблемы с производительностью gc) .

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

Все учтено, так как вы просто беспокоитесь об использовании памяти , не стесняйтесь позвонить в gc или, что еще лучше, посмотрите, сильно ли это влияет на память в вашем случае, а затем решите.

0
ответ дан 24 November 2019 в 17:40
поделиться

Если вы используете java 1.5, вы можете посмотреть ManagementFactory.getMemoryMXBean (), который дает вам числа на все виды памяти. heap и non-heap, perm-gen.

Хороший пример можно найти там http://www.freshblurbs.com/explaining-java-lang-outofmemoryerror-permgen-space

2
ответ дан 24 November 2019 в 17:40
поделиться

Явный запуск System.gc () в производственной системе - ужасная идея. Если память вообще достигнет любого размера, вся система может зависнуть, пока работает полный сборщик мусора. На сервере размером в несколько гигабайт это может быть легко очень заметно, в зависимости от того, как настроен jvm, какой у него запас и т. Д. И т. Д. Я видел паузы более 30 секунд.

Другая проблема заключается в том, что, явно вызывая GC, вы на самом деле не отслеживаете, как JVM запускает GC, вы фактически меняете его - в зависимости от того, как вы настроили JVM, он будет собирать мусор, когда это необходимо, и обычно постепенно (он не просто запускает полный сборщик мусора, когда ему не хватает памяти). То, что вы будете распечатывать, будет совсем не похоже на то, что JVM сделает сама по себе - во-первых, вы Вероятно, вы увидите меньше автоматических / инкрементных сборщиков мусора, поскольку вы будете очищать память вручную.

Как указано в сообщении Ника Холта, параметры для печати активности сборщика мусора уже существуют в виде флагов JVM.

У вас может быть поток, который просто распечатывает бесплатно и доступен через разумные промежутки времени, это покажет вам фактическое использование памяти.

5
ответ дан 24 November 2019 в 17:40
поделиться

Если вам нравится хороший способ сделать это из командной строки, используйте jstat:

http://java.sun.com/j2se/1.5.0/docs/tooldocs/share /jstat.html

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

4
ответ дан 24 November 2019 в 17:40
поделиться

Я бы сказал, что консультант прав в теории, а вы правы на практике. Как говорится в поговорке :

Теоретически теория и практика одинаковы. На практике это не так.

В спецификации Java говорится, что System.gc предлагает вызвать сборку мусора. На практике он просто порождает поток и сразу запускается на Sun JVM.

Хотя теоретически вы можете испортить некоторую точно настроенную реализацию сборки мусора JVM, если вы не пишете общий код, предназначенный для развертывания на любой JVM. там, не беспокойтесь об этом. Если это работает для вас, сделайте это.

9
ответ дан 24 November 2019 в 17:40
поделиться
8
ответ дан 24 November 2019 в 17:40
поделиться

Существуют инструменты, позволяющие контролировать использование памяти виртуальной машиной. ВМ может предоставлять статистику памяти с помощью JMX . Вы также можете распечатать статистику GC , чтобы увидеть, как память работает с течением времени.

Вызов System.gc () может нанести вред производительности сборщика мусора, поскольку объекты будут преждевременно перемещены из нового поколения в старое, а слабые ссылки будут преждевременно очищены. Это может привести к снижению эффективности памяти, увеличению времени сборки мусора и уменьшению попаданий в кеш (для кешей, использующих слабые ссылки). Я согласен с вашим консультантом: System.gc () - это плохо. Я бы пошел еще дальше, чтобы отключить его с помощью переключателя командной строки.

28
ответ дан 24 November 2019 в 17:40
поделиться

Взгляните на аргументы JVM: http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp#DebuggingOptions

XX: -PrintGC Print сообщения при сборке мусора. Управляемый.

-XX: -PrintGCDetails Распечатать более подробную информацию о сборке мусора. Manageable. (Introduced in 1.4.0.)

-XX:-PrintGCTimeStamps Print timestamps at garbage collection. Manageable (Introduced in 1.4.0.)

-XX:-PrintTenuringDistribution Print tenuring age information.

While you're not going to upset the JVM with explicit calls to System.gc() they may not have the effect you are expecting. To really understand what's going on with the memory in a JVM with read anything and everything the Brian Goetz writes.

5
ответ дан 24 November 2019 в 17:40
поделиться
Другие вопросы по тегам:

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