[Java] резьб и анализ памяти инструмента VisualVM и MAT простой учебник

предисловие

В этой статье мы кратко рассмотрим использование Java потоков и анализа памяти инструмента VisualVM и МАТ, и дальнейшее исследование может обратиться к официальному веб-сайт или инструментов для помощи (например, MAT: Help -> Добро пожаловать -> Учебники), и мастерство на практике.


VisualVM

Java VisualVM после JDK1.6 собственного инструмента визуализации, которая предоставляет графический интерфейс для нитку мониторинга в реальном времени приложений, процессор и потребление ресурсов памяти, и может сохранять снимки для офф-лайн анализа узких мест в программе.

Установка и настройка

После JDK1.6 уже поставляется с VisualVM инструмента (jvisualvm.exe). Если вы используете не-Oracle JDK, свободно войти на официальном сайте , чтобы загрузить и установить VisualVM.
После загрузки инструмента, необходимо visualvm_143\etc\visualvm.confнастроить путь к JDK (visualvm_jdkhome) в руководстве.

VisualVM может контролировать локальную или удаленную программу Java. Вам необходимо запустить службу JMX на стороне сервера при помощи пульта дистанционного управления. Во- первых, увеличение параметров запуска из удаленной процедуры следует параметров JVM :
-Djava.rmi.server.hostname=10.186.189.98(远程服务器IP地址) -Dcom.sun.management.jmxremote.port=8090(JMX远程监听端口) -Dcom.sun.management.jmxremote.ssl=false(禁用SSL) -Dcom.sun.management.jmxremote.authenticate=false(不启用用户认证)

Затем перезапустите программу удаленной. В этом случае netstat -ano | findstr 8090(Windows) или netstat -anlp | grep 8090вид (Linux) порт находится в состоянии Listening, указывая , что позволяет удаленные соединения JMX.

В дополнении к использованию VisualVM инструмента в одиночку, но он также может быть интегрирован в плагином IDEA VisualVM Launcher. По Файл-> Setting-> Плагины -> Браузеры Repositrories Поиск VisualVM Launcher установки и перезагрузки IDEA, меню и кнопки будут появляться между этими двумя методами:

VisualVM выберет путь После нажатия на кнопку, выберите исполняемый файл VisualVM. После этого нажмите на старте VisualVM откроется окно.

Местное применение

В этом разделе описываются примеры функций интерфейса в сочетании с кодом VisualVM. Пример кода выглядит следующим образом:

package thread;

public class InfiniteLoop {
    public static void main(String[] args) {
        Thread t1 = new Thread(new ImplicitLoop(), "ImplicitLoop");
        Thread t2 = new Thread(new ExplicitLoop(),"ExplicitLoop");
        t1.start();
        t2.start();
    }
}

class ExplicitLoop extends Thread {
    @Override
    public void run() {
        while (true) {
            System.out.println("I work hard!");
        }
    }
}

class ImplicitLoop extends Thread {
    @Override
    public void run() {
        for (byte i = 0; i < 150; i += 2) {  //此处因数值溢出导致死循环
            System.out.println("I've worked " + i + " hours!");
            if (i >= 120) {
                try {
                    System.out.println("I'll take a short break...");
                    Thread.sleep(20);
                    System.out.println("I wake up!");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Проверка местной информации мониторинга запуска VisualVM, интерфейс выглядит следующим образом:

Локальный левая сторона Java процесс «локальный (местная)» следуя пример содержит InfiniteLoop, в том числе права на Обзор (Обзор), монитор (монитор), нити (нити), пробоотборник (Sampler), такие как вкладки, чтобы показать детали ,

Среди них, основной информации Обзора страница для просмотра процесса, параметры JVM загрузочных, системные свойств ( такой же jinfo -sysprops <pid>) и другой информации.

страница Monitor можно просматривать процессора, памяти (кучи пространства и доллары), класс и нити линейного графика в реальном времени. Сбор мусора (GC Выполнить) Кнопка для запуска системы GC, кнопка Heap Dump (Heap Dump), чтобы указать каталог, в кучах сырого дампа файла (дамп).

Обратите внимание , что кнопка щелкающего дампа кучи (Heap Dump) включается автоматически загрузить сгенерированный файл дампа , когда локальный монитор, и вам необходимо скопировать сгенерированный файл дампа на удаленном хосте удаленного мониторинга на локальный вручную загружено. Кроме того, VisualVM очень медленно , когда файлы дампа памяти анализ загрузки, мы рекомендуем использовать MAT для анализа дампа памяти .

Автор подробно страница для просмотра времени работы и состояния каждого потока. Dump Thread кнопка (Thread Dump) , чтобы сгенерировать поток файла дампа (класс jstack <pid>).

Фиг., Индикация времени линия активных потоков выполнения, сна (SLEEP), ожидание (o.wait), обитать (холостой ход) и наблюдения (синхронное блокирующее) состояние, а также более детальное наблюдение состояния потока с помощью кнопки зума.
Threads inspectorПлагины могут отображать стек однократный или многократный поток. На рисунке проверяется только ImplicitLoop нить, стек был понят , что препятствие в System.out.println("I've worked " + i + " hours!")линии - реализация метода будет первым замком! По кнопке Refresh для обновления стека вы найдете ImplicitLoop темы иногда бездействует.

Пробоотборник страница на определенный промежуток времени для процессора, выборки памяти, вы можете проверить больше процессорного времени или объем памяти, занимаемый большей нитью помогает настройка производительности. При дискретизации процессора, выборки страница содержит CPU (Образцы CPU) и времени центрального процессора (Тема процессорного времени) две суб-вкладки, могут быть использованы в первом способе, называется много времени анализа цепи, которая может быть использована для сравнения процессора при Обработанные ,

VisualVM также обеспечивают много полезных плагинов, таких как Визуальный GC (см сбора мусора состояние). По инструменту (Tools) - Скачать Плагин> Plug (плагинов).

удаленный мониторинг

Нажмите на левую VisualVM удаленно (Remote) -> Add Remote Host (Добавить удаленный хост), заливку в IP-адрес сервера.

Затем нажмите на удаленном хосте, щелкните правой кнопкой мыши «Добавить JMX Connection (Добавить JMX Connection)» введите номер порта JMX и проверить «не требует подключения к SSL (не требуют SSL)».

Добавление JMX разъемов справа «открыт (на открытом)» или просто дважды щелкните на интерфейсе монитора правой панели можно увидеть.

МАТ

MAT (Memory Analyzer Tool) это быстрый, многофункциональный JAVA дамп кучи инструмент анализа, который помогает разработчикам утечек памяти и уменьшить потребление памяти.

сценарии использования

MAT сценарии общего пользования являются:

  • ООМ (OutOfMemoryError исключение), обычно есть причины:
    • Объект мертв, но не может автоматически восстановить сборщиком мусора, утечки памяти постоянно - нужно найти код и зафиксировать место утечки
    • Слишком длинные или слишком долго держит состояние жизненного цикла большого количества объектов - космическое пространство в дополнении к увеличению выделения кучи, рассмотреть вопрос оптимизацию логики или хранения кода структуры
  • загрузка процессора завершена, нить тупик (аналогично VisualVM)
  • Шпион по содержанию объектов памяти, таких как:
    • Устранение неполадок отладки отладки среда не позволяет печатать или добавлять журналы
    • Наличие конфиденциальной информации, такие как пароли в незашифрованном виде сканирования резидентного

Установка и настройка

С официального сайта , чтобы загрузить автономный инструмент MAT, каталог MAT работать сразу после распаковки MemoryAnalyzer.exe для запуска ВСУ.

Если анализ файла дампа быть слишком большим, он может увеличить установленные файлы в значениях параметров MemoryAnalyzer.ini XMX каталогов ( по умолчанию 1G). Обратите внимание, значение Xmx не может превышать операционную среду системной памяти, в противном случае она начнет отдается MAT Failed to create the Java Virtual Machine.

Получите файл дампа кучи

MAT куча инструментов статического анализа, необходимо заранее получить в Java Heap файлы дампа памяти (снимки).

Студенты могут осыпать файл дампа следующими способами:
1) увеличение параметров JVM загрузочном в -XX:+HeapDumpOnOutOfMemoryErrorпараметре автоматически генерируется в рабочем каталоге (user.dir) ООМ происходит , когда система java_pid<pid>.hprofфайла дампа. По JVM параметры могут также -XX:HeapDumpPath=<path>явно указать файл стека дампа путь хранения.
2) Если вы не хотите ждать , пока вы не получите произошла ошибка ООМ кучи файл дампа, вы можете добавить параметры виртуальной машины Java , -XX:+HeapDumpOnCtrlBreakчтобы использовать кнопку Ctrl + Break (Пауза) на пульте для свободного доступа к файлу дампа кучи.
3) Если инструменты среды Jmap доступны, можно с помощью jmap -dump:live,format=b,file=heap.bin <pid>полученного командного файла дампа.
Что, PID идентификатор процесса, живой вариант сила триггера перед сбросом полного GC (для уменьшения размера файла), имена файлов и каталогов могут быть определены для представления документов.
Точно так же, VisualVM, Jconsole и другие инструменты JDK можно также использовать Afterlife кучи файл дампа.
4) сама MAT также доступна куча файлов дампа , что File -> Приобретать Heap меню самосвала.

Анализ файла дампа кучи

В этом разделе также описывается в сочетании с примерами кода MAT функциями общего интерфейса. Пример кода выглядит следующим образом:

package thread;

import java.util.*;

public class JavaHeapDump {
    private static List<String> smallArray = new ArrayList<>();
    private static List<byte[]> largeArray = new ArrayList<>();

    public static String getPassword() {
        char[] pw = {'A', 'd', 'm', 'i', 'n', '1', '2', '3'};
        return new String(pw);
    }

    public static void makeHeapOom() {
        for (int i = 0; i < 1000; i++) {
            smallArray.add(getPassword()); //smallArray.add(getPassword().intern());

            byte[] elems = new byte[1024 * 1024];
            Arrays.fill(elems, (byte)101);
            largeArray.add(elems);
            //largeArray.add(new byte[1024 * 1024]);
        }
    }

    public static void main(String[] args) {
        makeHeapOom();
    }
}

Составитель код -Xms20m -Xmx20mзапуска (ограничение быстро ООМ куча пространства) как параметры виртуальной машины Java, чтобы получить следующий вывод:

D:\xywang\target\classes>java -Xms20m -Xmx20m -Xmn2m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\dump\heapDump.bin thread.JavaHeapDum
p
java.lang.OutOfMemoryError: Java heap space
Dumping heap to E:\dump\heapDump.bin ...
Heap dump file created [21458899 bytes in 0.805 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at thread.JavaHeapDump.makeHeapOom(JavaHeapDump.java:18)
        at thread.JavaHeapDump.main(JavaHeapDump.java:26)

Показывает , что вскоре появились из памяти ( java.lang.OutOfMemoryError: Java heap space), и генерирует файл дампа heapDump.bin на диске E.

На данный момент запуска ВСУ, выберите пункт меню File -> Open Heap Dump для загрузки файла дампа кучи для анализа. После загрузки файла, выберите всплывающие мастер анализ утечек страничной памяти в соответствии с режимом.

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


Нажмите ссылку «Детали», вы можете увидеть самые большие виновники может вызвать переполнение памяти на самом деле largeArray! Здесь, « Shortest Paths To the Accumulation Point» Как показывают и который подключен к ОЙ первопричине в настоящее время нераспределенная куча занимает большой объект не может быть восстановлена.

Вкладка Обзор содержит обзорную Heap Dump, включая кучу пирога и действий / Отчеты / шаг за шагом и другие области быстрого доступа.

Что, Гистограмма (куча гистограмма) предоставляет список статистической памяти занимают объекты класса группировки, по умолчанию отсортированы по убыванию класс мелкой кучи. Доминатор Дерево (дерево одноразовое) отображается в Object / Класс защищен размер памяти сортировки результата исследования может быть использован , чтобы вызвать другие объекты , которые объекты не могут быть собраны мусор. Топ Потребители Dominator Дерево представляет собой графические статистические данные, соответственно, по Object, класс, ClassLoader, пакет и других размеры делают статистику использования памяти. Топ Компоненты перечислены более кучи пространства , занимаемого компонентом, и предполагает потребление памяти может быть уменьшено.

Наиболее часто используемый интерфейс Доминатор дерева в качестве примера:

куча два ArrayList, и один из которых занимает до 96.57% памяти. Ниже представлены основные направления значении фигуры:

Малый Heap: объект сами по себе занимают объем памяти, объект не содержит свою долю ссылочного объема памяти. Малый кучный массив объектов является суммой размеров элементов массива, неглубоко куча объект не-массива является суммой всех членов размера переменного объекта.
Нераспределенные кучный: размер текущего объекта + текущего объект можно ссылаться прямо или косвенно к сумме размеров объекта, то есть, текущий объект является ГМ общей память освобождается из кучи.
входящие ссылки: класс , который упоминается в текущем классе, или в котором текущий объект ссылается объект.
исходящие ссылки: все экземпляры текущего класса или объекта , на который ссылается на текущий объект.

Выберите Dominator Дерево занимает самый большой объект в памяти, на with incoming referencesвоззрения внешних объектов , которые он ссылается.

Видимый, занимает много контента является виновником largeArray. Для коллекции объектов, вы можете щелкнуть правой кнопкой выбрать Java Collections подменю сделать все виды рода и вида. Например, на фиг выбрать , Extract List Valuesчтобы просмотреть largeArrayсодержимое, результаты следующие:

Подсмотренное значение памяти

JavaHeapDump образец кода намерение использовать пароль, реальный бизнес может быть такой чувствительной информации существует по OQL (Object Query Language) для устранения неполадок памяти.

OQL является язык, основанный на выражений JavaScript, как это будет класс таблица, объект экземпляра класса в виде строк, как поле объекта переменной член в таблице, вы можете использовать операторы SQL похож на способ Java Heap запрос объект. OQL структура синтаксиса выглядит следующим образом:

select <JavaScript expression to select>
from [ instanceof ] <class name="name">
[ where <JavaScript boolean expression to filter> ]

Более OOL синтаксис, на оол странице нажмите F1 для просмотра справочной информации.

OQL MAT нажав кнопку на панели инструментов, откройте окно редактора OQL, введите команду запроса, нажав на красную кнопку восклицательный знак в результатах запроса следующим образом :

. «*» Обратите внимание , что эквивалентно SQL - запрос подстановочные «%» заявление за «admin123» , Запрос Результаты удивили , чтобы увидеть «admin123» такой текстовый пароль!

По Merge Shortest Path to GC Rootsли GC Roots до просмотра этих паролей объектов:

если объект недоступен , то пароль не является постоянной памятью, видная фигура пароля постоянной памяти.

Heap дамп файлов сравнительный анализ

Фактического бизнеса - сценарии кучи объекты памяти могут быть очень много, обнаружение утечек памяти, как правило , они должны быть захвачены и сравнительной куча файл дамп имеет два момента. MAT следующие шаги:
1) загрузить первый файл дампа стека и открытый вид гистограммы.
2) Открытое окно -> История навигации вид, правая гистограмма выберите Добавить для сравнения Корзины.

3) Загрузка вторых файлов дамп кучи, а также добавить в корзину Сравнить.
4) Откройте окно -> Сравнить КОРЗИНА, нажмите Сравнить результаты (красный восклицательный знак в правом верхнем углу).

5) анализ и сравнение результатов по сравнению Таблицы лет.

Например, на фиг. 1 # информация память хранения паролей, меньше , чем # 0 создает строку объекта (который может быть подтверждена результатами OQL) с использованием String.intern ().

Таким образом, быстро находить объект проводится до и после приращения операции, таким образом, чтобы дальнейшие локализовать конкретные утечки памяти преступников.

резюме

В данной статье кратко описано использование Java потоков и анализа памяти инструмента VisualVM и ВСУ, а также дальнейшее изучение может сослаться на официальный сайт или инструментов для помощи (например, MAT: Help -> Добро пожаловать -> Учебники), и мастерство на практике. На самом деле ничего не сказать ......

рекомендация

отwww.cnblogs.com/clover-toeic/p/11553867.html