JVM изнутри
    Оптимизация и
    профилирование



Константин Слисенко
JazzTeam, Senior Software Engineer
Сколько нужно программистов
 чтобы заменить сгоревшую
         лампочку?


           +          ?
Сколько нужно программистов
 чтобы заменить сгоревшую
         лампочку?


           +          ?
         Ни одного!
    Это проблема железа.
О чѐм я расскажу
•   Внутреннее устройство JVM
     o   Виды памяти
    Сборка мусора
     o

• Оптимизация JVM
     o   Опции памяти
    Как избегать memory leaks
     o

• Профилирование java-приложений
     o   Утилиты в составе JDK
     o   VisualVM
Память в JVM: stack
          Thread 1      Thread 3   Отдельный для каждого потока
Stack     Thread 2      Thread 4   Используется для хранения
                                    • Локальных переменных
                                    • Аргументов методов
                     Eden           • Значений примитивных типов
                                      (int, float, double, char, ...)

Heap                               Настройка
                 Survivor          -Xss256k
space

                     Old


        Perm gen space
Память в JVM: heap space
          Thread 1      Thread 3   Heap используется для хранения
Stack                                 объектов
          Thread 2      Thread 4
                                   Настройка
                                   -Xms256m - минимальный размер
                     Eden          -Xmx512m - максимальный размер
                                   -XX:NewRatio=2 - соотношение eden
                                      + survivor/old
Heap
                 Survivor          Eden
space
                                    • Молодые объекты
                                    • Когда переполняется, GC
                     Old              выполняет быструю сборку
                                      мусора (затрагивается только
                                      эта область, выжившие объекты
                                      переносятся в survivor space)
        Perm gen space
                                    • Хранит временные объекты
                                      внутри методов
Память в JVM: heap space
          Thread 1      Thread 3   Heap используется для хранения
                                   объектов
Stack     Thread 2      Thread 4
                                   Survivor
                                    •  Объекты, пережившие одну
                     Eden              сборку мусора

                                   Tenured generation
Heap
                 Survivor           •  объекты, пережившие много
                                       сборок мусора: менеджеры
space                                  ресурсов, синглтоны
                                    •  при заполнении выполняется
                     Old               полная сборка мусора, она
                                       затрагивает все объекты
                                       JVM, дорогостоящий процесс

        Perm gen space             System.gc() вызывает полную сборку
                                   мусора
Память в JVM: perm gen
          Thread 1      Thread 3   Permanent generation
Stack     Thread 2      Thread 4   Хранение мета-информации о
                                      классах и методах

                     Eden          Настройка
                                   -XX:PermSize=32m
                                   -XX:MaxPermSize=128m
Heap
                 Survivor          Изменение размера - дорогостоящая
space                                 операция, лучше задать размер
                                      сразу
                     Old


        Perm gen space
Сборка мусора
Garbage - структуры данных в памяти, к которым больше нет доступа из
  программы

Сборщик мусора - фоновый процесс, который освобождает память от
  мусора

Основные сборщики мусора

Copy collection
 • Самый простой алгоритм
 • Копируем нужные объекты из eden в survivor, чистим eden
 • Stop the world pauses

Mark sweep compact
 • mark - помечаем неиспользуемые объекты
 • sweep - удаляем их
 • compact - смещаем их к началу памяти
Memory leaks
Возникают из-за забытых ссылок, особенно на "тяжѐлые объекты"

// Some image loading functionality
Map<String, Bitmap> images = new HashMap<String, Bitmap>();

// We use this method for image caching
public Bitmap getBitmap(String name) {
    if (!images.contains(name)) {
          // loadBitmap is slow operation, we use caching to speed up this process
          images.put(name, loadBitmap(name));
    }

      return images.get(name);
}

...

// Somewhere in the application
gallery.onNext(new GalleryListener(Gallery g, String name) {
    g.setImage(getBitmap(name));
});


Ссылки на тяжѐлые битмапы сохраняются, сборщик мусора не может
  очистить эти объекты, память переполняется
Как избегать memory leaks
Кеширование больших объектов
Используйте weak и soft references

WeakReference - GC удаляет объект если на него нет "сильных" ссылок
SoftReference - объект удаляется при нехватке памяти в системе

Оптимизируем пример

Map<String, WeakReference<Bitmap>> images = new
    HashMap<String, WeakReference<Bitmap>>();

// We use this method for image caching
public Bitmap getBitmap(String name) {
    if (!images.contains(name) || images.get(name).get() == null) {
          // loadBitmap is slow operation, we use caching to speed up this process
          images.put(name, new WeakReference(loadBitmap(name)));
    }


    return images.get(name);
}
Как избегать memory leaks
Закрываем потоки, сокеты, соединения

OutputStream out = new FileOutputStream();
try {
   // Work with stream
} finally {
   out.close();
}

PreparedStatement stmt = createStatement();
ResultSet rs = null;
try {
     rs = stmt.executeQuery();
     // Work with result set
} finally {
          if (stmt != null) {
                   stmt.close();
     }

    if (rs != null) {
           rs.close();
         }
}
Профилирование
Анализ работы программы
• Замер времени на выполнения методов
• Замер расходуемой памяти
• Загрузка CPU
Цель
• Нахождение "узких мест", далее
  оптимизация
• Определение утечек памяти, исправление
Профилирование в java
JMX - Java Management Extensions
• Технология для управления и
  мониторинга java-приложений
• Работа как с локальными, так и с
  удалѐнными приложениями
• Поддерживает авторизацию
• VisualVM использует JMX
Утилиты в составе JDK
jps - вывод списка JVM в системе

jinfo - вывод конфигурационной информации о java-
   процессе

jstack - вывод стектрейсов всех потоков java-процесса

jstat - сбор статистики производительности

jmap - сбор статистики используемой памяти

jhat - просмотр heap
VisualVM
Спасибо за внимание!
    Вопросы?




Константин Слисенко
kslisenko@gmail.com

Solit 2013, JVM изнутри: оптимизация и профилирование, Слисенко Константин

  • 1.
    JVM изнутри Оптимизация и профилирование Константин Слисенко JazzTeam, Senior Software Engineer
  • 2.
    Сколько нужно программистов чтобы заменить сгоревшую лампочку? + ?
  • 3.
    Сколько нужно программистов чтобы заменить сгоревшую лампочку? + ? Ни одного! Это проблема железа.
  • 4.
    О чѐм ярасскажу • Внутреннее устройство JVM o Виды памяти Сборка мусора o • Оптимизация JVM o Опции памяти Как избегать memory leaks o • Профилирование java-приложений o Утилиты в составе JDK o VisualVM
  • 5.
    Память в JVM:stack Thread 1 Thread 3 Отдельный для каждого потока Stack Thread 2 Thread 4 Используется для хранения • Локальных переменных • Аргументов методов Eden • Значений примитивных типов (int, float, double, char, ...) Heap Настройка Survivor -Xss256k space Old Perm gen space
  • 6.
    Память в JVM:heap space Thread 1 Thread 3 Heap используется для хранения Stack объектов Thread 2 Thread 4 Настройка -Xms256m - минимальный размер Eden -Xmx512m - максимальный размер -XX:NewRatio=2 - соотношение eden + survivor/old Heap Survivor Eden space • Молодые объекты • Когда переполняется, GC Old выполняет быструю сборку мусора (затрагивается только эта область, выжившие объекты переносятся в survivor space) Perm gen space • Хранит временные объекты внутри методов
  • 7.
    Память в JVM:heap space Thread 1 Thread 3 Heap используется для хранения объектов Stack Thread 2 Thread 4 Survivor • Объекты, пережившие одну Eden сборку мусора Tenured generation Heap Survivor • объекты, пережившие много сборок мусора: менеджеры space ресурсов, синглтоны • при заполнении выполняется Old полная сборка мусора, она затрагивает все объекты JVM, дорогостоящий процесс Perm gen space System.gc() вызывает полную сборку мусора
  • 8.
    Память в JVM:perm gen Thread 1 Thread 3 Permanent generation Stack Thread 2 Thread 4 Хранение мета-информации о классах и методах Eden Настройка -XX:PermSize=32m -XX:MaxPermSize=128m Heap Survivor Изменение размера - дорогостоящая space операция, лучше задать размер сразу Old Perm gen space
  • 9.
    Сборка мусора Garbage -структуры данных в памяти, к которым больше нет доступа из программы Сборщик мусора - фоновый процесс, который освобождает память от мусора Основные сборщики мусора Copy collection • Самый простой алгоритм • Копируем нужные объекты из eden в survivor, чистим eden • Stop the world pauses Mark sweep compact • mark - помечаем неиспользуемые объекты • sweep - удаляем их • compact - смещаем их к началу памяти
  • 10.
    Memory leaks Возникают из-зазабытых ссылок, особенно на "тяжѐлые объекты" // Some image loading functionality Map<String, Bitmap> images = new HashMap<String, Bitmap>(); // We use this method for image caching public Bitmap getBitmap(String name) { if (!images.contains(name)) { // loadBitmap is slow operation, we use caching to speed up this process images.put(name, loadBitmap(name)); } return images.get(name); } ... // Somewhere in the application gallery.onNext(new GalleryListener(Gallery g, String name) { g.setImage(getBitmap(name)); }); Ссылки на тяжѐлые битмапы сохраняются, сборщик мусора не может очистить эти объекты, память переполняется
  • 11.
    Как избегать memoryleaks Кеширование больших объектов Используйте weak и soft references WeakReference - GC удаляет объект если на него нет "сильных" ссылок SoftReference - объект удаляется при нехватке памяти в системе Оптимизируем пример Map<String, WeakReference<Bitmap>> images = new HashMap<String, WeakReference<Bitmap>>(); // We use this method for image caching public Bitmap getBitmap(String name) { if (!images.contains(name) || images.get(name).get() == null) { // loadBitmap is slow operation, we use caching to speed up this process images.put(name, new WeakReference(loadBitmap(name))); } return images.get(name); }
  • 12.
    Как избегать memoryleaks Закрываем потоки, сокеты, соединения OutputStream out = new FileOutputStream(); try { // Work with stream } finally { out.close(); } PreparedStatement stmt = createStatement(); ResultSet rs = null; try { rs = stmt.executeQuery(); // Work with result set } finally { if (stmt != null) { stmt.close(); } if (rs != null) { rs.close(); } }
  • 13.
    Профилирование Анализ работы программы •Замер времени на выполнения методов • Замер расходуемой памяти • Загрузка CPU Цель • Нахождение "узких мест", далее оптимизация • Определение утечек памяти, исправление
  • 14.
    Профилирование в java JMX- Java Management Extensions • Технология для управления и мониторинга java-приложений • Работа как с локальными, так и с удалѐнными приложениями • Поддерживает авторизацию • VisualVM использует JMX
  • 15.
    Утилиты в составеJDK jps - вывод списка JVM в системе jinfo - вывод конфигурационной информации о java- процессе jstack - вывод стектрейсов всех потоков java-процесса jstat - сбор статистики производительности jmap - сбор статистики используемой памяти jhat - просмотр heap
  • 16.
  • 17.
    Спасибо за внимание! Вопросы? Константин Слисенко kslisenko@gmail.com