powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Мониторинг памяти в Java SE7
25 сообщений из 55, страница 1 из 3
Мониторинг памяти в Java SE7
    #38690839
Мурзик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, уважаемые дамы и господа.
Пытаюсь мониторить использование памяти в Java SE7 при помощи MXBean.

код -
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;

public class TestMXBean {
	static double doubleOne=1e3;
	static double doubleTwo=2e3;
	public static void main(String[] args) {		
		MemoryMXBean mxBean = ManagementFactory.getMemoryMXBean();
		System.out.println("Non Heap:");
		System.out.print("	used=" + mxBean.getNonHeapMemoryUsage().getUsed()/1024);
		System.out.print("	commited="+mxBean.getNonHeapMemoryUsage().getCommitted()/1024);
		System.out.print("	Max="+mxBean.getNonHeapMemoryUsage().getMax()/1024);
		System.out.println("	init="+mxBean.getNonHeapMemoryUsage().getInit()/1024);
		System.out.println("Heap:");
		System.out.print("	used=" + mxBean.getHeapMemoryUsage().getUsed()/1024);
		System.out.print("	commited="+mxBean.getHeapMemoryUsage().getCommitted()/1024);
		System.out.print("	Max="+mxBean.getHeapMemoryUsage().getMax()/1024);
		System.out.println("	init="+mxBean.getHeapMemoryUsage().getInit()/1024);
	}
}

Вроде выдает корректные данные по heap и PermGen (сравнивал с jconsole).
Вопрос - можно ли верить этим данным?
Еще вопрос - как программно получить инфу об использовании Stack (размер задается ключом -Xss) ?

Заранее спасибо.
До свидания.
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38690853
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МурзикВопрос - можно ли верить этим данным?...
Верить никому нельзя.
Особенно если у Вас на компьютере процессор Intel, там даже в Pentium'ах бага была. )))
МурзикЕще вопрос - как программно получить инфу об использовании Stack (размер задается ключом -Xss) ?

Зачем?
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38690866
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МурзикВроде выдает корректные данные по heap и PermGen (сравнивал с jconsole).
Вопрос - можно ли верить этим данным?
Еще вопрос - как программно получить инфу об использовании Stack (размер задается ключом -Xss) ?

Вопрос веры/неверы это какой-то сугубо личный вопрос.

Можчно качнуть исходники MemoryMXBean и просто посмотреть откуда он их получает.
И дальше будет совсем другая формулировка. Какой смысл Oracle/Sun вкладывает
в эти счётчики и есть-ли им реальная подоплёка.
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38690924
Мурзик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Так как верить никому нельзя, я хочу проверить, где создаются переменные:
1. Примитивные
2. Строки
3. Статические переменные
4. Переменные уровня экземпляра при задании какого-то хитрого ХХ-ключа JVM.

также мне интересно, освобождает ли GC область памяти PermGen.
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38690945
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МурзикТак как верить никому нельзя, я хочу проверить, где создаются переменные:
1. Примитивные
2. Строки
3. Статические переменные
4. Переменные уровня экземпляра при задании какого-то хитрого ХХ-ключа JVM.

также мне интересно, освобождает ли GC область памяти PermGen.

1. Локальные переменные создаются на стеке. Не важно примитивы или ссылка на объект.
2. Строки это объекты. Живут в куче как все либо в пуле строк. Пул живет в PermGen или MetaSpace.
3. Статические переменные это поля объекта-класса. Они живут в куче, как и сам класс. Скорее всего в PermGen/MetaSpace.
4. Какого такого хитрого ключа?
5. PermGen освобождается.

Это и много другое можно смотреть в профайлерах (например VisualVM) или инструментах разработки - jstat, jconsole, mission control
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38690964
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мурзик...я хочу проверить, где создаются переменные...
1. Документации от вендора Вы тоже не верите?
2. Каким образом Ваш вопрос соотносится с данной задачей?

Мурзиктакже мне интересно, освобождает ли GC область памяти PermGen
Статистику по PermGen получить вроде элементарно. По стеку, не факт, что на уровне Java это возможно. По хорошему стек нужно смотреть на уровне OS.
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38690989
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь пишут
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html -Xssn

Sets the thread stack size.

XX:FlightRecorderOptions =parameter=value

stackdepth=depth

Stack depth for stack traces by JFR. By default, the depth is set to 64 method calls. The maximum is 2048, minimum is 1.
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38690995
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну "не все так однозначно" ( C ) дочь офицера

Вроде stack size распространяется и на native потоки. Т.ч. в общем виде "получить инфу об использовании Stack" вроде задача не совсем тривиальная. Но зачем это надо практически - понять сложно

+ у меня какой-то шумок в голове, что никто не обещал, что java thread будет однозначно соответствовать os thread. Хотя, похоже, в последних версиях Java это именно так.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38690996
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stackdepth - совсем другое.
Плюс, FR - коммерческая фишка и для его легального использования требуется прикупить соответствующую лицензию.
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38691039
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим у нас есть рекурсивная функция которая обходит
сайты, файловую систему или древовидную DBMS.
Какие числовые оценки можно делать для стека? И зачем?
Какие выводы можно делать? Что стека не хватит? Почему
софт так написан? Может использовать template преобразования
рекурсии в FSM+Queue(Collection) ? Может ограничить глубину
рекурсии парамертром maxDepth в аргументах и использовать
проверку?

Вообще что даёт сама метрика? Что софт плохой?
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38691046
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton...Какие числовые оценки можно делать для стека?...
Ну я бы рекомендовал написать тест. Посмотреть когда упадет (на каком уровне вложенности). Поделил одно на другое и сделал бы оценку.

IMHO & AFAIK:
1) А вообще рекурсия это зло. В том числе и по данной причине. Сложно контролировать выделение ресурсов.
2) Если heap можно достаточно безболезненно задирать, то задирать стек, из-за того, что ОДНА функция в системе сделана через рекурсию и ей категорически не хватает стека.... это попахивает бредом.... Проще и лучше дать пинка программисту и развернуть с цикл и/или ручной стек
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38691055
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Развёртывание стека - это хардкор. Тяжёлая артиллерия. В 99% ее никто не будет делать.
Будут искать компромиссное решение. Крутить настройки сервера. Бить задачу на порции
как хадупах или форк-джойнить и запускать в разных нодах/серверах. Готов поспорить
что так и будет.
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38691145
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Остаётся только вопрос - задлянафига автору вообще знать размер стека.
И, не исключено, выяснится, что ищет он не там, где потерял, а там, где светло.
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38691550
Мурзик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Ключ именуется: -XX:+DoEscapeAnalysis
Прочитал про него здесь: http://www.javaspecialist.ru/2011/04/java-thread-stack.html


Зачем начал интересоваться распределением памяти в JAVA:
Прослушав курсы тов. Мирончика в Киеве, узнал, что есть такие разделы памяти:
--
+статический контекст -сюда загружаются java-классы со своей структурой, из
которых потом будут создаваться экземпляры, тут же хранятся переменные уровня класса (которые static)
+стек — тут выполняются инструкции описанные в методах и тут же примитивные переменные
+heap — хранятся переменные уровня экземпляра для объектов
+garbage collection — сюда сваливаются уже ненужные переменные из heap
---
(день 1, файл capture_5.avi, время 01:00:44)
Маленькая реклама: сделал хронометраж его курса и поместил его сюда - http://www.programtask.ru/archives/80

Так вот:
Нигде больше я не нашел инфу про область памяти garbage collection, посему начал разбираться что и как.
Что узнал:
+Статический контекст в оригинале называется PermGen
+Стек - это ThreadStack
+heap - состоит из нескольких частей.

Касательно стека - создал класс с ОЧЧЧень большим кол-вом примитивных переменных:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class TestPrimitive {
 public static void main(String[] args) {
	 System.out.println(Runtime.getRuntime().freeMemory());
	 System.out.println("RUN");
	 double a1=1e3; double b1=1e4;double c1=1e5;double d1=1e6;double e1=1e7;double f1=1e7;double g1=1e8;double h1=1e9;
...
	 double a1000=1000e3; double b1000=1000e4;double c1000=1000e5;double d1000=1000e6;double e1000=1000e7;double f1000=1000e7;double g1000=1000e8;double h1000=1000e9;

	 System.out.println(Runtime.getRuntime().freeMemory());
	 
 }
}
(: Создавал не сам - мне помог excel :)

Запускаю так -
java -Xss64K TestPrimitive
Получаю -
Exception in thread "main" java.lang.StackOverflowError
at TestPrimitive.main(TestPrimitive.java:8)

Если так -
java -Xss72K TestPrimitive
То все Ок:
RUN
15477216
15477216

Вроде все объяснимо - 8000 double-переменных занимают 64K памяти.

Что интересно, а если эти переменные поместить в другом методе (не main), создать экземпляр этого класса и выполнить этот метод, то как долго эти переменные будут занимать место в stack?
Для этого мне и требовался инстрУмент для программного измерения заполненности ThreadStack.

Задавался вопрос - почему я не верю документации от вендора.
Ответ такой: Был я как-то на московской конференции Тома Кайта и он сказал, что надо верить только тому, что прошло через ваши руки здесь и сейчас.
Может что-то измениться - например, выйдет новый релиз, в котором будет изменено именно ЭТО.
Дока писалась для определенной версии java - после этого вышло около 60-ти релизов (версия 1.7.60).
Именно поэтому я очень люблю проверять то, что написано - на заборе вот тоже много чего написано, а за забором - дрова :)
Такие вот мысли.
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38691585
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МурзикКлюч именуется: -XX:+DoEscapeAnalysis
--
+статический контекст -сюда загружаются java-классы со своей структурой, из
которых потом будут создаваться экземпляры, тут же хранятся переменные уровня класса (которые static)
+стек — тут выполняются инструкции описанные в методах и тут же примитивные переменные
+heap — хранятся переменные уровня экземпляра для объектов
+garbage collection — сюда сваливаются уже ненужные переменные из heap
---

С такой терминологией разбираться в Escape Analysis, по-моему рано. Потому что терминология не точная и показывает полное непонимание происходящего.

МурзикНигде больше я не нашел инфу про область памяти garbage collection, посему начал разбираться что и как.

Нет такой "области памяти". Есть "куча", у неё есть "поколения". Есть ещё нативная памяти процесса вне кучи (off heap).

Мурзик+Статический контекст в оригинале называется PermGen

А если идти в ногу со временем, то Metaspace.

Мурзик+Стек - это ThreadStack

"Стек" это "стек". Точный и понятный термин. Даже если не указывать Thread, то спутать с коллекцией java.util.Stack довольно сложно.

Мурзик+heap - состоит из нескольких частей.

Обычно "поколений". Но фрагментация кучи может быть разной в зависимости от реализации сборщика мусора.

МурзикЧто интересно, а если эти переменные поместить в другом методе (не main), создать экземпляр этого класса и выполнить этот метод, то как долго эти переменные будут занимать место в stack?

Какая разница, выполняется метод экземпляра или статический? Ведь локальные переменные все равно живут на стеке.
Тут опять же в вашей терминологии, сложно сориентироваться. Что значит "занимать". Фрейм завершается и на месте старых переменных можно писать новые. Но вот вопрос, когда область памяти заполнена данными, но ещё не перезаписано это "переменная занимает память" или нет?

МурзикДля этого мне и требовался инстрУмент для программного измерения заполненности ThreadStack.

Ну, так инструмент надо было искать, а не самому писать на pure Java.

МурзикЗадавался вопрос - почему я не верю документации от вендора.
Ответ такой: Был я как-то на московской конференции Тома Кайта и он сказал, что надо верить только тому, что прошло через ваши руки здесь и сейчас.
Может что-то измениться - например, выйдет новый релиз, в котором будет изменено именно ЭТО.
Дока писалась для определенной версии java - после этого вышло около 60-ти релизов (версия 1.7.60).
Именно поэтому я очень люблю проверять то, что написано - на заборе вот тоже много чего написано, а за забором - дрова :)
Такие вот мысли.
Возможно вам интересно. Это хорошо что вы продолжаете в этом направлении копаться. Но на самом деле пользы для вас от этого будет мало. Лучше бы разобраться с терминологией сначала, и понять что как работает вообще, а потом уже разбираться в деталях.

Ну, и если очень интересны детали, то по-моему проще всего скачать OpenJDK и смотреть как реализован стэк.
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38691628
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МурзикЗадавался вопрос - почему я не верю документации от вендора.
Ответ такой: Был я как-то на московской конференции Тома Кайта и он сказал, что надо верить только тому, что прошло через ваши руки здесь и сейчас.
Может что-то измениться - например, выйдет новый релиз, в котором будет изменено именно ЭТОИменно поэтому существует тестирование обновлений. По логике, об этом дядюшка Кайт должен был (тоже) сказать.Дока писалась для определенной версии java - после этого вышло около 60-ти релизов (версия 1.7.60)Вы уже демонстрируете издержки не чтения документации: начиная с u25 нумерация идёт "через пять".
Документация, кстати, тоже обновляется.Именно поэтому я очень люблю проверять то, что написано - на заборе вот тоже много чего написано, а за забором - дрова :)
Такие вот мысли.Документация отличается от забора в одном важном отношении: только вдумчивое чтение позволяет формулировать правильные вопросы.
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38692008
Мурзик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаем доку:
http://docs.oracle.com/javase/specs/jls/se7/html/index.html
Обратите внимание на дату - 2013-02-28
Я правильно понимаю, что с тех пор java изменялась отдельно от доки?

Все, что нашел в доке про память:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4
Memory that can be shared between threads is called shared memory or heap memory.

All instance fields, static fields, and array elements are stored in heap memory. In this chapter, we use the term variable to refer to both fields and array elements.

На странице
https://search.oracle.com/search/search?search.timezone=-240&search_startnum=&search_endnum=&num=10&search_dupid=&exttimeout=false&actProfId=0&q=heap url:/javase/7/docs/api&group=Documentation&sw=t&search_p_main_operator=all&search_p_atname=&adn=&search_p_op=equals&search_p_val=&search_p_atname=&adn=&search_p_op=equals&search_p_val=
искал
heap url:/javase/7/docs/api
там же искал memory model
Нигде не увидел описания использования памяти java.
Возможно, я не владею технологией поиска или ищу там, где светло (или куда указывает yandex.ru по словам java 7 memory model) - помогите пож-ста найти там, где темно.
Заранее спасибо.
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38692041
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МурзикЧитаем доку:
http://docs.oracle.com/javase/specs/jls/se7/html/index.html
Обратите внимание на дату - 2013-02-28
Я правильно понимаю, что с тех пор java изменялась отдельно от доки?

Java может изменятся в соответствии с графиком выхода критических
патчей. А документ который входит в релиз может вполне датироваться
датой релиза. Это нормально.

Твой самый первый вопрос касался Java SE7 ? Верно?
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38692042
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А спецификация SMTP определена в RFC-821 от, страшно подумать, 1982 года.
Как же у нас почта до сих пор ходит???

P.S. Слово спецификация выделено совершенно не случайно.
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38692044
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МурзикЧитаем доку:
http://docs.oracle.com/javase/specs/jls/se7/html/index.html

Это не единственная дока. Есть например ещё такая:
http://docs.oracle.com/javase/specs/jvms/se7/html/

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

Мурзик Обратите внимание на дату - 2013-02-28
Я правильно понимаю, что с тех пор java изменялась отдельно от доки?

Вы уделяете внимание каким-то совершенно не важным мелочам. Почему надо обращать внимание на дату? JLS это не полное описание работы всего и вся. Это спецификация на то как должна работать система. Изменяется она не часто. Разве что вносятся небольшие правки. Это совершенно не значит что в реализации ничего не меняется.

МурзикВсе, что нашел в доке про память:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4
Memory that can be shared between threads is called shared memory or heap memory.
All instance fields, static fields, and array elements are stored in heap memory. In this chapter, we use the term variable to refer to both fields and array elements.


Правильно. Что наводит нас на мысль, что JLS поможет не особо.

Мурзик Возможно, я не владею технологией поиска или ищу там, где светло (или куда указывает yandex.ru по словам java 7 memory model) - помогите пож-ста найти там, где темно.
Заранее спасибо.
Вы не владеете терминами. И это первое с чем стоит ознакомится.
Memory model:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4
Это вообще не о том:
http://en.wikipedia.org/wiki/Java_Memory_Model
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38692048
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мурзик,

Какая конкретно задача? Посмотреть как утроет стек потока в Hotspot?
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38692068
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О! Открыл для себя интересную фичу.
VisualVM -> Heap Dump -> Summary -> Threads at the heap dump -> Show Threads
Показывает дамп потоков с локальными переменными. По-моему только теми, которые на кучу ссылаются. Примитивов не наблюдаю.
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38692070
Мурзик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересное продолжение -
BlazkowiczВы не владеете терминами. И это первое с чем стоит ознакомится.

Согласен. Я сюда и пришел, чтобы овладеть терминами.
BlazkowiczMemory model:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4
Это вообще не о том:
http://en.wikipedia.org/wiki/Java_Memory_Model

Если надо смотреть на то, что "о том", то туда меня перенаправил yandex.ru - славим его :)

На этой странице я попытался найти слово heap - 2 совпадения.
Тут же слово perm находится тоже 2 раза.

Получается крамольная весЧь - java скрывает структуру памяти.
По крайней мере, в доке о поколениях или (составных частях) памяти heap не говорится. Буду рад ссылкам на оф. доку, где мои слова будут опровергнуты.

Это по ОраклиНому - попытайтесь, например в доке по Oracle12c найти описание таблицы sys.ltxid_trans. А в TransactionGuard она очень хорошо используется :)

Где же можно овладеть этими терминами, как не в первоисточнике?
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38692076
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МурзикПо крайней мере, в доке о поколениях или (составных частях) памяти heap не говорится.
Оно говорится в доках описывающих алгоритмы Garbage Collection

Мало того, при разных алгоритмах GC, разделение памяти на поколения (или составные части) может меняться.

AFAIK
...
Рейтинг: 0 / 0
Мониторинг памяти в Java SE7
    #38692080
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сведения о памяти не скрываются. Они изложены в спецификации. Детали реализации - в исходных текстах.
И на это вам уже указывали.

Проблема в том, что искомое вами никак не поможет ни в разработке, ни в отладке, ни в эксплуатации. Очень крутое и совершенно бесполезное знание.
...
Рейтинг: 0 / 0
25 сообщений из 55, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Мониторинг памяти в Java SE7
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]