SlideShare une entreprise Scribd logo
1  sur  33
1
Управление памятью в Java:
footprint
Владимир Иванов
Oracle Corp.
vladimir.x.ivanov@oracle.com
2
Содержание
•  Введение
•  Структура «кучи» в Java
•  «Сжатые» указатели
•  Представление объекта в памяти
•  Типы ссылок
•  Разное
•  Итоги
3
Введение
О чем пойдет речь?
•  Производительность GC
•  3 характеристики
•  Throughput
• Объем вычислительных ресурсов, затрачиваемых на GC
•  Предсказуемость
• На какое время прерывается работа приложения
•  Footprint
• Объем используемой памяти
4
Содержание
•  Введение
•  Структура «кучи» в Java
•  «Сжатые» указатели
•  Представление объекта в памяти
•  Типы ссылок
•  Разное
•  Итоги
5
Стуктура «кучи» в Java
6
Критерии выбора размера «кучи»
•  Чем больше памяти, тем лучше для GC
•  Как для молодого, так и для старшего поколения
•  Более редкие сборки
•  Ниже затраты на сборку мусора
•  Доступный объем памяти ограничен
•  Физическая память
•  32-битный режим
•  Наличие других приложений в системе
7
Содержание
•  Введение
•  Структура «кучи» в Java
•  «Сжатые» указатели
•  Представление объекта в памяти
•  Типы ссылок
•  Разное
•  Итоги
8
«Сжатые» указатели
-XX:+UseCompressedOops
•  32-битные указатели в 64-битном режиме
•  oop - Ordinary Object Pointer
Размер	
  
«кучи»	
  
<	
  4Gb	
   	
  	
  >=	
  4Gb	
  	
  
<	
  26Gb	
  
>=	
  26Gb	
  	
  
<	
  32Gb	
  
Режим	
  
работы	
  
Zero-­‐based	
  	
  
non-­‐aligned	
  
Zero-­‐based	
  	
  
8-­‐byte	
  aligned	
  
Offset-­‐based	
  	
  
8-­‐byte	
  aligned	
  
Декоди-­‐
рование	
  
не	
  требуется	
   	
  x	
  <<	
  3	
   offset	
  +	
  x	
  <<	
  3	
  
9
«Сжатые» указатели
-XX:+UseCompressedOops
•  Распаковка «сжатых» указателей дешева
–  64-bit JVM + zero-based COOPs быстрее 32-bit JVM
–  64-bit JVM + offset-based COOPs немного медленнее 64-bit
JVM + zero-based COOPs
• 1 регистр используется для хранения offset
•  Работают для «кучи» размером не более 32Gb
•  ~1.4x увеличение размера данных если выключены
•  скачок: 32Gb -> 45Gb
10
Содержание
•  Введение
•  Структура «кучи» в Java
•  «Сжатые» указатели
•  Представление объекта в памяти
•  Типы ссылок
•  Разное
•  Итоги
11
Представление объекта в памяти
•  Заголовок (12/16/20 байт)
–  mark word (4/8 байт)
–  указатель на класс объекта (4/8 байт)
–  длина (только для массива) (4 байта)
•  Нестатические поля класса / элементы массива
–  эффективное представление
–  выбор оптимального порядка
–  порядок полей
• long/double, int, short/char, byte/boolean, reference
•  http://github.com/shipilev/java-object-layout
•  -XX:+PrintCompactFieldsSavings
12
Представление объекта в памяти
•  new int[1000]
•  32-бита: 4+4+4+1000*4 =
4012 байт
•  64-бита: 8+8+4+1000*4 =
4020 байт
•  new Integer[1000]
•  32-бита: 4+4+4+1000*(4+4+4+4) =
16012 байт
•  64-бита: 8+8+4+1000*(8+8+8+4) =
28020 байт
13
Содержание
•  Введение
•  Структура «кучи» в Java
•  «Сжатые» указатели
•  Представление объекта в памяти
•  Типы ссылок
•  Разное
•  Итоги
14
Инженерная проблема
Кэширование данных
•  Приложение оперирует объемами данных,
существенно превышающими доступную память
•  Требуется организовать кэширование на уровне
приложения
15
Типы ссылок в Java
•  Декларативный API к GC
•  Контроль достижимости
•  Представлены в виде объектов
•  extends java.lang.ref.Reference
•  3 типа
•  «мягкие»
• java.lang.ref.SoftReference
•  «слабые»
• java.lang.ref.WeakReference
•  «фантомные»
• java.lang.ref.PhantomReference
16
Типы ссылок в Java
Как использовать?
import java.lang.ref.*;
Object obj = new Object(); // strong reference
17
Типы ссылок в Java
Как использовать?
import java.lang.ref.*;
Object obj = new Object(); // strong reference
Reference softRef = new SoftReference(obj); // soft reference
Reference weakRef = new WeakReference(obj); // weak reference
18
Типы ссылок в Java
Как использовать?
import java.lang.ref.*;
Object obj = new Object(); // strong reference
Reference softRef = new SoftReference(obj); // soft reference
Reference weakRef = new WeakReference(obj); // weak reference
// phantom reference
ReferenceQueue reqQueue = new ReferenceQueue(obj);
Reference phantomRef = new PhantomReference(obj, refQueue);
Object obj1 = softRef.get(); if (obj1 != null) { … }
19
Типы ссылок в Java
Уровни достижимости
Strongly
reachable
Weakly
reachable
FinalizableSoftly
reachable
Phantom
reachable
Unreachable
20
Типы ссылок
SoftReference
•  Удаление softly reachable объекта при нехватке
памяти в системе
•  Гарантии
•  Все «мягкие» ссылки к soft-достижимым объектам будут
очищены до того, как будет брошен OOME
•  Применение
•  memory-sensitive caches
•  Можно контроллировать агрессивность очистки
•  -XX:SoftRefLRUPolicyMSPerMB
21
Типы ссылок
WeakReference
•  Наличие «слабой» ссылки не мешает GC удалить
объект
•  Действия GC
•  Атомарно очищает все «слабые» ссылки на объект
•  Если надо, помещает объекты на финализацию
•  Если надо, помещает «слабые» ссылки в очередь
•  Использование
•  canonicalizing mappings (interned strings)
22
Типы ссылок
PhantomReference
•  Замена финализаторам
–  protected void Object::finalize()
•  Невозможно получить ссылку на объект
–  PhantomReference.get() == null
•  GC помещает «фантомные» ссылки в очередь
23
Типы ссылок
Чем плохи финализаторы?
•  Замедление аллокации
–  Требуется регистрация объектов с нетривиальными
финализаторами
•  2 цикла GC для удаления объекта
•  Возможность «воскрешения» объекта
•  Недетерминированный порядок исполнения
•  Могут начать выполняться раньше чем кажется
•  Многопоточность (даже в однопоточном приложении)
–  Требуется синхронизация при доступе к структурам данных
24
Типы ссылок в Java
Оповещения об изменении достижимости объекта
•  Помещение ссылки в очередь
•  java.lang.ref.ReferenceQueue
•  Получить оповещение, когда объект становится
• softy reachable
• weakly reachable
• phantom reachable
•  Невозможно «воскресить» объект из очереди
–  Reference.get() == null
25
Типы ссылок в Java
ReferenceQueue: Как использовать?
import java.lang.ref.*;
Object obj = new Object(); // strong reference
// phantom reference
ReferenceQueue reqQueue = new ReferenceQueue(obj);
Reference phantomRef = new PhantomReference(obj, refQueue);
26
Типы ссылок в Java
Автоматическая очиста ссылок
•  «Мягкие» и «слабые» ссылки
•  Автоматически очищаются GC перед добавлением в очередь
•  Регистрация в очереди не обязательна
•  «Фантомные» ссылки
•  Обязаны быть зарегистрированы в очереди
•  Объект остается phantom-достижим пока все достижимые
«фантомные» ссылки не очищены
27
Типы ссылок в Java
Резюме
•  «Мягкие» ссылки
–  очищаются при нехватке памяти в системе
–  GC-friendly кэширование объектов
•  «Cлабые» ссылки
–  очищаются если на объект есть только «слабые» ссылки
–  canonicalizing mappings (e.g. interned strings)
•  «Фантомные» ссылки
–  сообщение о «смерти» объекта
–  освобождение ресурсов, ассоциированных с объектом
–  надежнее финализаторов
28
Содержание
•  Введение
•  Структура «кучи» в Java
•  «Сжатые» указатели
•  Представление объекта в памяти
•  Типы ссылок
•  Разное
•  Итоги
29
Разное…
Советы
•  ThreadLocal + ThreadPool = ?
–  «засоряют» пулы потоков
•  Коллекции
–  много пустых коллекций в приложении
–  начальный размер может быть слишком велик
–  выставлять желаемый размер явно при создании
•  Массивы
–  создавать перед использованием
–  DirectByteBuffer vs byte[]
• используйте NIO для I/O вместо массивов
• не копирует данные
–  пул <*>[]? фрагментация
30
Анализ содержимого «кучи»
приложения
•  Суммарный размер объектов по классам
$ jmap –histo[:live] <pid>
•  Копия содержимого «кучи» (heap dump)
–  Как получить
$ jmap –dump:live,format=b,file=<file> <pid>
$ java –XX:+HeapDumpOnOutOfMemoryError …
–  Как анализировать heap dump?
• JHAT – Java Heap Analysis Tool
• $ jhat <file>
• http://localhost:7000
• поддерживает OQL (Object Query Language)
31
Содержание
•  Введение
•  Структура «кучи» в Java
•  «Сжатые» указатели
•  Представление объекта в памяти
•  Типы ссылок
•  Разное
•  Итоги
32
Итоги
•  Для комфортной работы GC требуется достаточно
свободного места в «куче»
•  «Сжатые» указатели работают только до 32Gb
•  Неоптимальное представление данных может
серьезно увеличить расход памяти
•  За счет java.lang.ref.* API можно уменьшить расход
памяти приложением
33
vladimir.x.ivanov@oracle.com
@iwanowww

Contenu connexe

Tendances

Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Oleg Tsarev
 
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
Омские ИТ-субботники
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?
Alexey Tokar
 
кри 2014 elastic search рациональный подход к созданию собственной системы а...
кри 2014 elastic search  рациональный подход к созданию собственной системы а...кри 2014 elastic search  рациональный подход к созданию собственной системы а...
кри 2014 elastic search рациональный подход к созданию собственной системы а...
Vyacheslav Nikulin
 
Архитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай самАрхитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай сам
Sergey Xek
 
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Badoo Development
 
CodeFest 2013. Бабаев А. — Сервер для самых маленьких
CodeFest 2013. Бабаев А. — Сервер для самых маленькихCodeFest 2013. Бабаев А. — Сервер для самых маленьких
CodeFest 2013. Бабаев А. — Сервер для самых маленьких
CodeFest
 
Aлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreetAлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreet
Ontico
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Ontico
 
Не все базы данных одинаково полезны
Не все базы данных одинаково полезныНе все базы данных одинаково полезны
Не все базы данных одинаково полезны
Sergey Xek
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
Alex Chistyakov
 
Аналитическая инфраструктура оптимизации рекламной сети (Александр Зайцев)
Аналитическая инфраструктура оптимизации рекламной сети (Александр Зайцев)Аналитическая инфраструктура оптимизации рекламной сети (Александр Зайцев)
Аналитическая инфраструктура оптимизации рекламной сети (Александр Зайцев)
Ontico
 

Tendances (19)

Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервера
 
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?
 
кри 2014 elastic search рациональный подход к созданию собственной системы а...
кри 2014 elastic search  рациональный подход к созданию собственной системы а...кри 2014 elastic search  рациональный подход к созданию собственной системы а...
кри 2014 elastic search рациональный подход к созданию собственной системы а...
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотека
 
Модульный объект: как это работает в «Аллодах Онлайн».
Модульный объект: как это работает в «Аллодах Онлайн».Модульный объект: как это работает в «Аллодах Онлайн».
Модульный объект: как это работает в «Аллодах Онлайн».
 
Архитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай самАрхитектура А/Б тестирования: сделай сам
Архитектура А/Б тестирования: сделай сам
 
Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)
Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)
Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)
 
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
 
CodeFest 2013. Бабаев А. — Сервер для самых маленьких
CodeFest 2013. Бабаев А. — Сервер для самых маленькихCodeFest 2013. Бабаев А. — Сервер для самых маленьких
CodeFest 2013. Бабаев А. — Сервер для самых маленьких
 
Aлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreetAлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreet
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
 
Выступление Сергея Аверина, Badoo, на High Performance Conference
Выступление Сергея Аверина, Badoo, на High Performance ConferenceВыступление Сергея Аверина, Badoo, на High Performance Conference
Выступление Сергея Аверина, Badoo, на High Performance Conference
 
Не все базы данных одинаково полезны
Не все базы данных одинаково полезныНе все базы данных одинаково полезны
Не все базы данных одинаково полезны
 
Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)
Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)
Бигдата — как добывать золото из данных / Александр Сербул (1С-Битрикс)
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
 
Аналитическая инфраструктура оптимизации рекламной сети (Александр Зайцев)
Аналитическая инфраструктура оптимизации рекламной сети (Александр Зайцев)Аналитическая инфраструктура оптимизации рекламной сети (Александр Зайцев)
Аналитическая инфраструктура оптимизации рекламной сети (Александр Зайцев)
 
Выбираем поисковик умом головы, Андрей Аксенов (Sphinx)
Выбираем поисковик умом головы, Андрей Аксенов (Sphinx)Выбираем поисковик умом головы, Андрей Аксенов (Sphinx)
Выбираем поисковик умом головы, Андрей Аксенов (Sphinx)
 

Similaire à "Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine

андрей паньгин
андрей паньгинандрей паньгин
андрей паньгин
kuchinskaya
 
Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)
Ontico
 
Caching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in JavaCaching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in Java
Andrei Pangin
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
Andrei Pangin
 
ekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилище
it-people
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011
CodeCamp
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Ontico
 
Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.
Andrew Mayorov
 
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Ontico
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
drupalconf
 

Similaire à "Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine (20)

андрей паньгин
андрей паньгинандрей паньгин
андрей паньгин
 
An internal look at HotSpot JVM
An internal look at HotSpot JVMAn internal look at HotSpot JVM
An internal look at HotSpot JVM
 
Проект «Одноклассники» Mail.Ru Group, Андрей Паньгин
Проект «Одноклассники» Mail.Ru Group, Андрей ПаньгинПроект «Одноклассники» Mail.Ru Group, Андрей Паньгин
Проект «Одноклассники» Mail.Ru Group, Андрей Паньгин
 
Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)Выжимаем из сервера максимум (Андрей Паньгин)
Выжимаем из сервера максимум (Андрей Паньгин)
 
Caching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in JavaCaching data outside Java Heap and using Shared Memory in Java
Caching data outside Java Heap and using Shared Memory in Java
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
 
Где сегодня использовать ElasticSearch
Где сегодня использовать ElasticSearchГде сегодня использовать ElasticSearch
Где сегодня использовать ElasticSearch
 
ekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилище
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
 
Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.Синяя Борода. История одного проекта.
Синяя Борода. История одного проекта.
 
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
 
My talk on LeoFS, Highload++ 2014
My talk on LeoFS, Highload++ 2014My talk on LeoFS, Highload++ 2014
My talk on LeoFS, Highload++ 2014
 
Машинное обучение в электронной коммерции - практика использования и подводны...
Машинное обучение в электронной коммерции - практика использования и подводны...Машинное обучение в электронной коммерции - практика использования и подводны...
Машинное обучение в электронной коммерции - практика использования и подводны...
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
 
Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
 Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва  Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
 
Клиент-серверные приложения на iPhone
Клиент-серверные приложения на iPhoneКлиент-серверные приложения на iPhone
Клиент-серверные приложения на iPhone
 

Plus de Vladimir Ivanov

"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia "What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
Vladimir Ivanov
 
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,..."Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
Vladimir Ivanov
 
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
Vladimir Ivanov
 
JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013
Vladimir Ivanov
 
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
Vladimir Ivanov
 
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
Vladimir Ivanov
 
Многоуровневая компиляция в HotSpot JVM
Многоуровневая компиляция в HotSpot JVMМногоуровневая компиляция в HotSpot JVM
Многоуровневая компиляция в HotSpot JVM
Vladimir Ivanov
 
"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)
"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)
"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)
Vladimir Ivanov
 

Plus de Vladimir Ivanov (10)

"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia "What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
 
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,..."Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
"Formal Verification in Java" by Shura Iline, Vladimir Ivanov @ JEEConf 2013,...
 
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
"JIT compiler overview" @ JEEConf 2013, Kiev, Ukraine
 
JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013
 
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
 
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
 
Управление памятью в Java: Footprint
Управление памятью в Java: FootprintУправление памятью в Java: Footprint
Управление памятью в Java: Footprint
 
Многоуровневая компиляция в HotSpot JVM
Многоуровневая компиляция в HotSpot JVMМногоуровневая компиляция в HotSpot JVM
Многоуровневая компиляция в HotSpot JVM
 
G1 GC: Garbage-First Garbage Collector
G1 GC: Garbage-First Garbage CollectorG1 GC: Garbage-First Garbage Collector
G1 GC: Garbage-First Garbage Collector
 
"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)
"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)
"Диагностирование проблем и настройка GC в HotSpot JVM" (JEEConf, Киев, 2011)
 

"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine

  • 1. 1 Управление памятью в Java: footprint Владимир Иванов Oracle Corp. vladimir.x.ivanov@oracle.com
  • 2. 2 Содержание •  Введение •  Структура «кучи» в Java •  «Сжатые» указатели •  Представление объекта в памяти •  Типы ссылок •  Разное •  Итоги
  • 3. 3 Введение О чем пойдет речь? •  Производительность GC •  3 характеристики •  Throughput • Объем вычислительных ресурсов, затрачиваемых на GC •  Предсказуемость • На какое время прерывается работа приложения •  Footprint • Объем используемой памяти
  • 4. 4 Содержание •  Введение •  Структура «кучи» в Java •  «Сжатые» указатели •  Представление объекта в памяти •  Типы ссылок •  Разное •  Итоги
  • 6. 6 Критерии выбора размера «кучи» •  Чем больше памяти, тем лучше для GC •  Как для молодого, так и для старшего поколения •  Более редкие сборки •  Ниже затраты на сборку мусора •  Доступный объем памяти ограничен •  Физическая память •  32-битный режим •  Наличие других приложений в системе
  • 7. 7 Содержание •  Введение •  Структура «кучи» в Java •  «Сжатые» указатели •  Представление объекта в памяти •  Типы ссылок •  Разное •  Итоги
  • 8. 8 «Сжатые» указатели -XX:+UseCompressedOops •  32-битные указатели в 64-битном режиме •  oop - Ordinary Object Pointer Размер   «кучи»   <  4Gb      >=  4Gb     <  26Gb   >=  26Gb     <  32Gb   Режим   работы   Zero-­‐based     non-­‐aligned   Zero-­‐based     8-­‐byte  aligned   Offset-­‐based     8-­‐byte  aligned   Декоди-­‐ рование   не  требуется    x  <<  3   offset  +  x  <<  3  
  • 9. 9 «Сжатые» указатели -XX:+UseCompressedOops •  Распаковка «сжатых» указателей дешева –  64-bit JVM + zero-based COOPs быстрее 32-bit JVM –  64-bit JVM + offset-based COOPs немного медленнее 64-bit JVM + zero-based COOPs • 1 регистр используется для хранения offset •  Работают для «кучи» размером не более 32Gb •  ~1.4x увеличение размера данных если выключены •  скачок: 32Gb -> 45Gb
  • 10. 10 Содержание •  Введение •  Структура «кучи» в Java •  «Сжатые» указатели •  Представление объекта в памяти •  Типы ссылок •  Разное •  Итоги
  • 11. 11 Представление объекта в памяти •  Заголовок (12/16/20 байт) –  mark word (4/8 байт) –  указатель на класс объекта (4/8 байт) –  длина (только для массива) (4 байта) •  Нестатические поля класса / элементы массива –  эффективное представление –  выбор оптимального порядка –  порядок полей • long/double, int, short/char, byte/boolean, reference •  http://github.com/shipilev/java-object-layout •  -XX:+PrintCompactFieldsSavings
  • 12. 12 Представление объекта в памяти •  new int[1000] •  32-бита: 4+4+4+1000*4 = 4012 байт •  64-бита: 8+8+4+1000*4 = 4020 байт •  new Integer[1000] •  32-бита: 4+4+4+1000*(4+4+4+4) = 16012 байт •  64-бита: 8+8+4+1000*(8+8+8+4) = 28020 байт
  • 13. 13 Содержание •  Введение •  Структура «кучи» в Java •  «Сжатые» указатели •  Представление объекта в памяти •  Типы ссылок •  Разное •  Итоги
  • 14. 14 Инженерная проблема Кэширование данных •  Приложение оперирует объемами данных, существенно превышающими доступную память •  Требуется организовать кэширование на уровне приложения
  • 15. 15 Типы ссылок в Java •  Декларативный API к GC •  Контроль достижимости •  Представлены в виде объектов •  extends java.lang.ref.Reference •  3 типа •  «мягкие» • java.lang.ref.SoftReference •  «слабые» • java.lang.ref.WeakReference •  «фантомные» • java.lang.ref.PhantomReference
  • 16. 16 Типы ссылок в Java Как использовать? import java.lang.ref.*; Object obj = new Object(); // strong reference
  • 17. 17 Типы ссылок в Java Как использовать? import java.lang.ref.*; Object obj = new Object(); // strong reference Reference softRef = new SoftReference(obj); // soft reference Reference weakRef = new WeakReference(obj); // weak reference
  • 18. 18 Типы ссылок в Java Как использовать? import java.lang.ref.*; Object obj = new Object(); // strong reference Reference softRef = new SoftReference(obj); // soft reference Reference weakRef = new WeakReference(obj); // weak reference // phantom reference ReferenceQueue reqQueue = new ReferenceQueue(obj); Reference phantomRef = new PhantomReference(obj, refQueue); Object obj1 = softRef.get(); if (obj1 != null) { … }
  • 19. 19 Типы ссылок в Java Уровни достижимости Strongly reachable Weakly reachable FinalizableSoftly reachable Phantom reachable Unreachable
  • 20. 20 Типы ссылок SoftReference •  Удаление softly reachable объекта при нехватке памяти в системе •  Гарантии •  Все «мягкие» ссылки к soft-достижимым объектам будут очищены до того, как будет брошен OOME •  Применение •  memory-sensitive caches •  Можно контроллировать агрессивность очистки •  -XX:SoftRefLRUPolicyMSPerMB
  • 21. 21 Типы ссылок WeakReference •  Наличие «слабой» ссылки не мешает GC удалить объект •  Действия GC •  Атомарно очищает все «слабые» ссылки на объект •  Если надо, помещает объекты на финализацию •  Если надо, помещает «слабые» ссылки в очередь •  Использование •  canonicalizing mappings (interned strings)
  • 22. 22 Типы ссылок PhantomReference •  Замена финализаторам –  protected void Object::finalize() •  Невозможно получить ссылку на объект –  PhantomReference.get() == null •  GC помещает «фантомные» ссылки в очередь
  • 23. 23 Типы ссылок Чем плохи финализаторы? •  Замедление аллокации –  Требуется регистрация объектов с нетривиальными финализаторами •  2 цикла GC для удаления объекта •  Возможность «воскрешения» объекта •  Недетерминированный порядок исполнения •  Могут начать выполняться раньше чем кажется •  Многопоточность (даже в однопоточном приложении) –  Требуется синхронизация при доступе к структурам данных
  • 24. 24 Типы ссылок в Java Оповещения об изменении достижимости объекта •  Помещение ссылки в очередь •  java.lang.ref.ReferenceQueue •  Получить оповещение, когда объект становится • softy reachable • weakly reachable • phantom reachable •  Невозможно «воскресить» объект из очереди –  Reference.get() == null
  • 25. 25 Типы ссылок в Java ReferenceQueue: Как использовать? import java.lang.ref.*; Object obj = new Object(); // strong reference // phantom reference ReferenceQueue reqQueue = new ReferenceQueue(obj); Reference phantomRef = new PhantomReference(obj, refQueue);
  • 26. 26 Типы ссылок в Java Автоматическая очиста ссылок •  «Мягкие» и «слабые» ссылки •  Автоматически очищаются GC перед добавлением в очередь •  Регистрация в очереди не обязательна •  «Фантомные» ссылки •  Обязаны быть зарегистрированы в очереди •  Объект остается phantom-достижим пока все достижимые «фантомные» ссылки не очищены
  • 27. 27 Типы ссылок в Java Резюме •  «Мягкие» ссылки –  очищаются при нехватке памяти в системе –  GC-friendly кэширование объектов •  «Cлабые» ссылки –  очищаются если на объект есть только «слабые» ссылки –  canonicalizing mappings (e.g. interned strings) •  «Фантомные» ссылки –  сообщение о «смерти» объекта –  освобождение ресурсов, ассоциированных с объектом –  надежнее финализаторов
  • 28. 28 Содержание •  Введение •  Структура «кучи» в Java •  «Сжатые» указатели •  Представление объекта в памяти •  Типы ссылок •  Разное •  Итоги
  • 29. 29 Разное… Советы •  ThreadLocal + ThreadPool = ? –  «засоряют» пулы потоков •  Коллекции –  много пустых коллекций в приложении –  начальный размер может быть слишком велик –  выставлять желаемый размер явно при создании •  Массивы –  создавать перед использованием –  DirectByteBuffer vs byte[] • используйте NIO для I/O вместо массивов • не копирует данные –  пул <*>[]? фрагментация
  • 30. 30 Анализ содержимого «кучи» приложения •  Суммарный размер объектов по классам $ jmap –histo[:live] <pid> •  Копия содержимого «кучи» (heap dump) –  Как получить $ jmap –dump:live,format=b,file=<file> <pid> $ java –XX:+HeapDumpOnOutOfMemoryError … –  Как анализировать heap dump? • JHAT – Java Heap Analysis Tool • $ jhat <file> • http://localhost:7000 • поддерживает OQL (Object Query Language)
  • 31. 31 Содержание •  Введение •  Структура «кучи» в Java •  «Сжатые» указатели •  Представление объекта в памяти •  Типы ссылок •  Разное •  Итоги
  • 32. 32 Итоги •  Для комфортной работы GC требуется достаточно свободного места в «куче» •  «Сжатые» указатели работают только до 32Gb •  Неоптимальное представление данных может серьезно увеличить расход памяти •  За счет java.lang.ref.* API можно уменьшить расход памяти приложением