Вы можете использовать профилирование памяти NetBeans для исследования утечек памяти. Приложение SnowStorm не имеет какой-либо утечки памяти, но могло бы быть, если бы мы забыли удалять снежинки из последовательности snowflakes после того, как они достигали нижней части сцены. Чтобы создать утечку памяти найдите и закомментируйте строку 126 из файла SnowStorm.fx, вот так:
124 if (snowflake.centerY >= scene.height) {
125 delete snowflake from scene.content;
126 // delete snowflake from snowflakes;
127 }
124 if (snowflake.centerY >= scene.height) {
125 delete snowflake from scene.content;
126 // delete snowflake from snowflakes;
127 }
Теперь запустите Profiler, нажав на кнопку Profile как и раньше, но на этот раз выберите профилирование памяти в диалоге Profile. Диалог Profile предлагает Вам возможность увеличения или уменьшения количества данных профилирования, которые будут собраны. Как и прежде, сбор дополнительной информации вызывает больше накладных расходов, поэтому как обычно всё принимаем по умолчанию для первого запуска и добавим позже, если это необходимо. Чтобы начать сбор информации, нажмите кнопку Run. Когда приложение начинает работать, появляется панель профилирования, и вы можете нажать кнопку Live Results, что бы видеть объекты, которые создаются, как показано на рисунке 4-28.
При поиске утечек памяти, важно понимать, что много мусора может оставаться до тех пор, пока JVM не будет хватать места. Просто потому, что большое количество определенного типа объекта показанных в профилировании памяти не обязательно означает, что эти объекты не соберутся, когда надо. Если вы думаете, что есть утечка, первое, что нужно сделать, это насильно вызвать garbage collector (сборщик мусора). Вы можете сделать это, нажав на кнопку, которая выглядит как мусорный ящик на панели профилирования. Если вы сделаете это, вы обнаружите, что действительно существует утечка памяти. С одной стороны, общий объем используемой памяти растет и не падает очень долго после сборки мусора. Это значение можно увидеть в разделе Basic Telemetry в нижней части панели профилирования, а также на рисунке 4-29. Если вы посмотрите на объекты, которые занимают много места, вы увидите, что все они принадлежат среде выполнения JavaFX. Ни один из них, очевидно, ничего общего с кодом приложения SnowStorm не имеет. Просто чтобы убедиться, давайте посмотрим, что происходит с объектами, которые мы можем создавать. Для этого введите значение javafx.scene.shape в поле фильтра ниже результатов профилирования памяти и нажмите Enter. Это сужает результаты только для объектов, имя класса которых совпадет с введенной строкой. Вы сразу увидите, что многие из объектов circle стали выделены и, самое главное, если вы вызываете сборщик мусора, ни один из них не выпускается - количество активных экземпляров продолжает расти. Это свидетельствует о явной ошибке, которую мы намеренно ввели. Если исправить ошибку и повторно профилировать приложение, вы увидите, что утечка памяти исчезла. Как профилирование процессора, так и профилирование памяти позволяет создавать и сохранять снимки для сравнения и последующего анализа.
Рисунок 4-27 снимков профилирования процессора
Рисунок 4-28 использование профилирования памяти
Рисунок 4-29 Basic Telemetry в профилировании NetBeans



Комментариев нет:
Отправить комментарий