Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Runtime.get*Memory


Автор: KostenkoSergey 27.9.2006, 17:53
для мониторинга памяти в яве 1.4 есть три метода.
с максхип сайзом понятно, а вот эти два возвращают какие то совершенно не понятные мне значения
runtime.freeMemory()
runtime.totalMemory(), которые никак не зависят от изменения максхипсайза.

Хочу  предупредить outOfMemory, а именно уведомить пользователя, что объём используемой памяти приближается к критическому (скажем Vтек > max_heap_size - 20 Мбт (приложение серверное) )
Трудности с определением именно текущего объёма используемой памяти.
Так например (totalMemory = 532 МБт freeMemory = 200), а память процесса java.exe = 980МБт (mxHeapSize = 1ГБт)

Поясните ?


Автор: LSD 27.9.2006, 17:56
totalMemory() - это текущий размер кучи, не JVM вообще а именно кучи
freeMemory() - сколько свободно памяти в куче

Автор: KostenkoSergey 27.9.2006, 18:00
а runtime.maxMemory() тогда что ?

оутОфмемори возникает, когда памяти не хватает у JVM? как определить сколько памяти она сейчас съела ?

Автор: LSD 27.9.2006, 18:15
maxMemory() - объем памяти который максимально может захватить себе JVM (JVM может динамически менять размер кучи в по необходимости)
Поэксперементируй с ключами запуска: -Xmx и -Xms.

Цитата(KostenkoSergey @  27.9.2006,  19:00 Найти цитируемый пост)
оутОфмемори возникает, когда памяти не хватает у JVM?

Когда нехватает памяти в куче и размер кучи максимальный из возможного. По умолчанию Sun JVM берет себе 64Мб, или половину оперативной памяти машины (смотря что меньше).

Автор: KostenkoSergey 27.9.2006, 18:23
Цитата(LSD @  27.9.2006,  18:15 Найти цитируемый пост)
Поэксперементируй с ключами запуска: -Xmx и -Xms.

смотрел.

Т.е. если я правильно понял, то для решения моей задачи можно использовать след. формулу:

if (maxMemory() -totalMemory() < 20МБт) { System.out.println("Скоро оут оф мемори"); }

Автор: LSD 27.9.2006, 18:30
Да.
Только учти что иногда maxMemory() может вернуть Long.MAX_VALUE (если не ошибаюсь, то так вела себя Sun JDK 1.3).

Автор: KostenkoSergey 28.9.2006, 08:45
решил проверить - пишу в логи totalMemory()  - заметил, что он у меня не превышает 532Мбт (mx HeapSize = 800)
возможно, правда, просто больше пока не было затребовано - ещё послежу...


Автор: KostenkoSergey 28.9.2006, 09:03
а нет... 
LSD - Вы правы ... -  растёт. 
Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)