|
|
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
Добрый день, уважаемые дамы и господа. Пытаюсь мониторить использование памяти в Java SE7 при помощи MXBean. код - Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Вроде выдает корректные данные по heap и PermGen (сравнивал с jconsole). Вопрос - можно ли верить этим данным? Еще вопрос - как программно получить инфу об использовании Stack (размер задается ключом -Xss) ? Заранее спасибо. До свидания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 16:56 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
МурзикВопрос - можно ли верить этим данным?... Верить никому нельзя. Особенно если у Вас на компьютере процессор Intel, там даже в Pentium'ах бага была. ))) МурзикЕще вопрос - как программно получить инфу об использовании Stack (размер задается ключом -Xss) ? Зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 17:04 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
МурзикВроде выдает корректные данные по heap и PermGen (сравнивал с jconsole). Вопрос - можно ли верить этим данным? Еще вопрос - как программно получить инфу об использовании Stack (размер задается ключом -Xss) ? Вопрос веры/неверы это какой-то сугубо личный вопрос. Можчно качнуть исходники MemoryMXBean и просто посмотреть откуда он их получает. И дальше будет совсем другая формулировка. Какой смысл Oracle/Sun вкладывает в эти счётчики и есть-ли им реальная подоплёка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 17:12 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Так как верить никому нельзя, я хочу проверить, где создаются переменные: 1. Примитивные 2. Строки 3. Статические переменные 4. Переменные уровня экземпляра при задании какого-то хитрого ХХ-ключа JVM. также мне интересно, освобождает ли GC область памяти PermGen. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 17:53 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
МурзикТак как верить никому нельзя, я хочу проверить, где создаются переменные: 1. Примитивные 2. Строки 3. Статические переменные 4. Переменные уровня экземпляра при задании какого-то хитрого ХХ-ключа JVM. также мне интересно, освобождает ли GC область памяти PermGen. 1. Локальные переменные создаются на стеке. Не важно примитивы или ссылка на объект. 2. Строки это объекты. Живут в куче как все либо в пуле строк. Пул живет в PermGen или MetaSpace. 3. Статические переменные это поля объекта-класса. Они живут в куче, как и сам класс. Скорее всего в PermGen/MetaSpace. 4. Какого такого хитрого ключа? 5. PermGen освобождается. Это и много другое можно смотреть в профайлерах (например VisualVM) или инструментах разработки - jstat, jconsole, mission control ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 18:05 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
Мурзик...я хочу проверить, где создаются переменные... 1. Документации от вендора Вы тоже не верите? 2. Каким образом Ваш вопрос соотносится с данной задачей? Мурзиктакже мне интересно, освобождает ли GC область памяти PermGen Статистику по PermGen получить вроде элементарно. По стеку, не факт, что на уровне Java это возможно. По хорошему стек нужно смотреть на уровне OS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 18:13 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
Здесь пишут 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 18:29 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
Ну "не все так однозначно" ( C ) дочь офицера Вроде stack size распространяется и на native потоки. Т.ч. в общем виде "получить инфу об использовании Stack" вроде задача не совсем тривиальная. Но зачем это надо практически - понять сложно + у меня какой-то шумок в голове, что никто не обещал, что java thread будет однозначно соответствовать os thread. Хотя, похоже, в последних версиях Java это именно так. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 18:34 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
stackdepth - совсем другое. Плюс, FR - коммерческая фишка и для его легального использования требуется прикупить соответствующую лицензию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 18:34 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
Допустим у нас есть рекурсивная функция которая обходит сайты, файловую систему или древовидную DBMS. Какие числовые оценки можно делать для стека? И зачем? Какие выводы можно делать? Что стека не хватит? Почему софт так написан? Может использовать template преобразования рекурсии в FSM+Queue(Collection) ? Может ограничить глубину рекурсии парамертром maxDepth в аргументах и использовать проверку? Вообще что даёт сама метрика? Что софт плохой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 19:07 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
mayton...Какие числовые оценки можно делать для стека?... Ну я бы рекомендовал написать тест. Посмотреть когда упадет (на каком уровне вложенности). Поделил одно на другое и сделал бы оценку. IMHO & AFAIK: 1) А вообще рекурсия это зло. В том числе и по данной причине. Сложно контролировать выделение ресурсов. 2) Если heap можно достаточно безболезненно задирать, то задирать стек, из-за того, что ОДНА функция в системе сделана через рекурсию и ей категорически не хватает стека.... это попахивает бредом.... Проще и лучше дать пинка программисту и развернуть с цикл и/или ручной стек ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 19:16 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
Развёртывание стека - это хардкор. Тяжёлая артиллерия. В 99% ее никто не будет делать. Будут искать компромиссное решение. Крутить настройки сервера. Бить задачу на порции как хадупах или форк-джойнить и запускать в разных нодах/серверах. Готов поспорить что так и будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 19:25 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
Остаётся только вопрос - задлянафига автору вообще знать размер стека. И, не исключено, выяснится, что ищет он не там, где потерял, а там, где светло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 21:34 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
Добрый день. Ключ именуется: -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. Запускаю так - 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). Именно поэтому я очень люблю проверять то, что написано - на заборе вот тоже много чего написано, а за забором - дрова :) Такие вот мысли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 10:40 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
МурзикКлюч именуется: -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 и смотреть как реализован стэк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 11:01 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
МурзикЗадавался вопрос - почему я не верю документации от вендора. Ответ такой: Был я как-то на московской конференции Тома Кайта и он сказал, что надо верить только тому, что прошло через ваши руки здесь и сейчас. Может что-то измениться - например, выйдет новый релиз, в котором будет изменено именно ЭТОИменно поэтому существует тестирование обновлений. По логике, об этом дядюшка Кайт должен был (тоже) сказать.Дока писалась для определенной версии java - после этого вышло около 60-ти релизов (версия 1.7.60)Вы уже демонстрируете издержки не чтения документации: начиная с u25 нумерация идёт "через пять". Документация, кстати, тоже обновляется.Именно поэтому я очень люблю проверять то, что написано - на заборе вот тоже много чего написано, а за забором - дрова :) Такие вот мысли.Документация отличается от забора в одном важном отношении: только вдумчивое чтение позволяет формулировать правильные вопросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 11:21 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
Читаем доку: 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) - помогите пож-ста найти там, где темно. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 15:02 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
МурзикЧитаем доку: http://docs.oracle.com/javase/specs/jls/se7/html/index.html Обратите внимание на дату - 2013-02-28 Я правильно понимаю, что с тех пор java изменялась отдельно от доки? Java может изменятся в соответствии с графиком выхода критических патчей. А документ который входит в релиз может вполне датироваться датой релиза. Это нормально. Твой самый первый вопрос касался Java SE7 ? Верно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 15:22 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
А спецификация SMTP определена в RFC-821 от, страшно подумать, 1982 года. Как же у нас почта до сих пор ходит??? P.S. Слово спецификация выделено совершенно не случайно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 15:23 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
МурзикЧитаем доку: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 15:24 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
Мурзик, Какая конкретно задача? Посмотреть как утроет стек потока в Hotspot? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 15:26 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
О! Открыл для себя интересную фичу. VisualVM -> Heap Dump -> Summary -> Threads at the heap dump -> Show Threads Показывает дамп потоков с локальными переменными. По-моему только теми, которые на кучу ссылаются. Примитивов не наблюдаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 15:42 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
Интересное продолжение - 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 она очень хорошо используется :) Где же можно овладеть этими терминами, как не в первоисточнике? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 15:43 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
МурзикПо крайней мере, в доке о поколениях или (составных частях) памяти heap не говорится. Оно говорится в доках описывающих алгоритмы Garbage Collection Мало того, при разных алгоритмах GC, разделение памяти на поколения (или составные части) может меняться. AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 15:46 |
|
||
|
Мониторинг памяти в Java SE7
|
|||
|---|---|---|---|
|
#18+
Сведения о памяти не скрываются. Они изложены в спецификации. Детали реализации - в исходных текстах. И на это вам уже указывали. Проблема в том, что искомое вами никак не поможет ни в разработке, ни в отладке, ни в эксплуатации. Очень крутое и совершенно бесполезное знание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 15:48 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38691550&tid=2126910]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 350ms |

| 0 / 0 |
