Как получить просто бесплатный размер "кучи" (не вместе w мадам стека/метода) в Java?

Я хочу вычислить использование "кучи" для своего приложения. Я хотел бы получить значение процента размера "кучи" только.

Как я получаю значение в коде для текущего запущенного приложения?

Править

Был ответ upvoted, который НЕ был полон/корректен. Значения, возвращенные теми методами, включают стек и область метода также, и я должен контролировать только размер "кучи".
С тем кодом я получил исключение HeapError, когда я достиг 43%, таким образом, я не могу использовать те методы для контроля просто "кучи"

Runtime.getRuntime().totalMemory()
8
задан Pentium10 21 May 2010 в 20:49
поделиться

4 ответа

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

2
ответ дан 6 December 2019 в 00:05
поделиться

Bean-компонент MemoryMXBean = ManagementFactory.getMemoryMXBean (); bean.getHeapMemoryUsage (). getUsed ();

1
ответ дан 6 December 2019 в 00:05
поделиться

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

Это происходит потому, что кучи JVM и ОС отличаются. Когда в JVM заканчивается память, она может запустить сбор мусора, дефрагментировать свою собственную кучу или запросить больше памяти у ОС. Поскольку неиспользуемые объекты без сбора мусора все еще существуют, но технически являются "свободными", они делают понятие свободной памяти немного размытым.

Кроме того, память кучи фрагментируется; как/когда/если память дефрагментируется, зависит от реализации JVM/ОС. Например, OS-heap может иметь 100 МБ свободной памяти, но из-за фрагментации наибольшее доступное непрерывное пространство может составлять 2 МБ. Таким образом, если JVM запросит 3 МБ, она может получить ошибку "вне памяти", даже если 100 МБ все еще доступны. JVM не может заранее знать, что ОС не сможет выделить эти 3 МБ.

0
ответ дан 6 December 2019 в 00:05
поделиться

Эта информация отображается через интерфейс управления JMX. Если вы просто хотите взглянуть на это, JConsole или visualvm (часть JDK, установленная в JAVA_HOME / bin) могут отображать красивые графики использования памяти JVM, необязательно с разбивкой на различные пулы памяти.

К этому интерфейсу также можно получить доступ программно; см. MemoryMXBean .

1
ответ дан 6 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

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