SlideShare una empresa de Scribd logo
1 de 30
Descargar para leer sin conexión
Управление памятью в Java:
    footprint


    Владимир Иванов
    Oracle Corp.
    vladimir.x.ivanov@oracle.com
1
Содержание

    •   Введение
    •   Структура «кучи» в Java
    •   «Сжатые» указатели
    •   Представление объекта в памяти
    •   Типы ссылок
    •   Разное
    •   Итоги




2
Введение
    О чем пойдет речь?
    • Производительность GC
    • 3 характеристики
     • Throughput
       • Объем вычислительных ресурсов, затрачиваемых на GC
     • Предсказуемость
       • На какое время прерывается работа приложения
     • Footprint
       • Объем используемой памяти




3
Содержание

    •   Введение
    •   Структура «кучи» в Java
    •   «Сжатые» указатели
    •   Представление объекта в памяти
    •   Типы ссылок
    •   Разное
    •   Итоги




4
Стуктура «кучи» в Java




5
Критерии выбора размера «кучи»

    • Чем больше памяти, тем лучше для GC
     • Как для молодого, так и для старшего поколения
     • Более редкие сборки
     • Ниже затраты на сборку мусора


    • Доступный объем памяти ограничен
     • Физическая память
     • 32-битный режим
     • Наличие других приложений в системе




6
Содержание

    •   Введение
    •   Структура «кучи» в Java
    •   «Сжатые» указатели
    •   Представление объекта в памяти
    •   Типы ссылок
    •   Разное
    •   Итоги




7
«Сжатые» указатели
    -XX:+UseCompressedOops
    • 32-битные указатели в 64-битном режиме
    • oop - Ordinary Object Pointer

    Размер       < 4Gb          >= 4Gb           >= 26Gb
    «кучи»                      < 26Gb           < 32Gb
    Режим     Zero-based      Zero-based       Offset-based
    работы    non-aligned    8-byte aligned   8-byte aligned

    Декоди-   не требуется       x << 3       offset + x << 3
    рование




8
«Сжатые» указатели
    -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




9
Содержание

     •   Введение
     •   Структура «кучи» в Java
     •   «Сжатые» указатели
     •   Представление объекта в памяти
     •   Типы ссылок
     •   Разное
     •   Итоги




10
Представление объекта в памяти

     • Заголовок (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

11
Представление объекта в памяти


• new int[1000]             • new Integer[1000]


• 32-бита: 4+4+4+1000*4 =   • 32-бита: 4+4+4+1000*(4+4+4+4) =
  4012 байт                   16012 байт
• 64-бита: 8+8+4+1000*4 =   • 64-бита: 8+8+4+1000*(8+8+8+4) =
  4020 байт                   28020 байт




  12
Содержание

     •   Введение
     •   Структура «кучи» в Java
     •   «Сжатые» указатели
     •   Представление объекта в памяти
     •   Типы ссылок
     •   Разное
     •   Итоги




13
Инженерная проблема
     Кэширование данных
     • Приложение оперирует объемами данных,
       существенно превышающими доступную память
     • Требуется организовать кэширование на уровне
       приложения




14
Типы ссылок в Java

     • Декларативный API к GC
       • Контроль достижимости
     • Представлены в виде объектов
       • extends java.lang.ref.Reference
     • 3 типа
       • «мягкие»
         • java.lang.ref.SoftReference
       • «слабые»
         • java.lang.ref.WeakReference
       • «фантомные»
         • java.lang.ref.PhantomReference




15
Типы ссылок в 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) { … }

16
Типы ссылок в Java
     Уровни достижимости




       Strongly     Softly     Weakly     Finalizable     Phantom
      reachable   reachable   reachable                  reachable



                                                 Unreachable




17
Типы ссылок
     SoftReference
     • Удаление softly reachable объекта при нехватке
       памяти в системе
     • Гарантии
      • Все «мягкие» ссылки к soft-достижимым объектам будут
        очищены до того, как будет брошен OOME
     • Применение
      • memory-sensitive caches


     • Можно контроллировать агрессивность очистки
      • -XX:SoftRefLRUPolicyMSPerMB




18
Типы ссылок
     WeakReference
     • Наличие «слабой» ссылки не мешает GC удалить
       объект
     • Действия GC
      • Атомарно очищает все «слабые» ссылки на объект
      • Если надо, помещает объекты на финализацию
      • Если надо, помещает «слабые» ссылки в очередь
     • Использование
      • canonicalizing mappings (interned strings)




19
Типы ссылок
     PhantomReference
     • Замена финализаторам
      – protected void Object::finalize()
     • Невозможно получить ссылку на объект
      – PhantomReference.get() == null
     • GC помещает «фантомные» ссылки в очередь




20
Типы ссылок
     Чем плохи финализаторы?
     • Замедление аллокации
         – Требуется регистрация объектов с нетривиальными
           финализаторами
     •   2 цикла GC для удаления объекта
     •   Возможность «воскрешения» объекта
     •   Недетерминированный порядок исполнения
     •   Могут начать выполняться раньше чем кажется
     •   Многопоточность (даже в однопоточном приложении)
         – Требуется синхронизация при доступе к структурам данных




21
Типы ссылок в Java
     Оповещения об изменении достижимости объекта
     • Помещение ссылки в очередь
      • java.lang.ref.ReferenceQueue
     • Получить оповещение, когда объект становится
        • softy reachable
        • weakly reachable
        • phantom reachable
     • Невозможно «воскресить» объект из очереди
      – Reference.get() == null




22
Типы ссылок в Java
     Автоматическая очиста ссылок
     • «Мягкие» и «слабые» ссылки
      • Автоматически очищаются GC перед добавлением в очередь
      • Регистрация в очереди не обязательна
     • «Фантомные» ссылки
      • Обязаны быть зарегистрированы в очереди
      • Объект остается phantom-достижим пока все достижимые
        «фантомные» ссылки не очищены




23
Типы ссылок в Java
     Резюме
     • «Мягкие» ссылки
      – очищаются при нехватке памяти в системе
      – GC-friendly кэширование объектов


     • «Cлабые» ссылки
      – очищаются если на объект есть только «слабые» ссылки
      – canonicalizing mappings (e.g. interned strings)


     • «Фантомные» ссылки
      – сообщение о «смерти» объекта
      – освобождение ресурсов, ассоциированных с объектом
      – надежнее финализаторов

24
Содержание

     •   Введение
     •   Структура «кучи» в Java
     •   «Сжатые» указатели
     •   Представление объекта в памяти
     •   Типы ссылок
     •   Разное
     •   Итоги




25
Разное…
     Советы
     • ThreadLocal + ThreadPool = ?
      – «засоряют» пулы потоков
     • Коллекции
      – много пустых коллекций в приложении
      – начальный размер может быть слишком велик
      – выставлять желаемый размер явно при создании
     • Массивы
      – создавать перед использованием
      – DirectByteBuffer vs byte[]
        • используйте NIO для I/O вместо массивов
        • не копирует данные
      – пул <*>[]? фрагментация


26
Анализ содержимого «кучи» приложения

     • Суммарный размер объектов по классам
      $ 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)



27
Содержание

     •   Введение
     •   Структура «кучи» в Java
     •   «Сжатые» указатели
     •   Представление объекта в памяти
     •   Типы ссылок
     •   Разное
     •   Итоги




28
Итоги

     • Для комфортной работы GC требуется достаточно
       свободного места в «куче»
     • «Сжатые» указатели работают только до 32Gb
     • Неоптимальное представление данных может
       серьезно увеличить расход памяти
     • За счет java.lang.ref.* API можно уменьшить расход
       памяти приложением




29
Вопросы?


     vladimir.x.ivanov@oracle.com
            @iwanowww



30

Más contenido relacionado

La actualidad más candente

My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015Alex Chistyakov
 
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
2013-02-02 03 Голушко. Полнотекстовый поиск с ElasticsearchОмские ИТ-субботники
 
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 programmingAndrei Pangin
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотекаVasya Petrov
 
MongoDB basics in Russian
MongoDB basics in RussianMongoDB basics in Russian
MongoDB basics in RussianOleg Kachan
 
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...phpdevby
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхVasil Remeniuk
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_drupalconf
 
кри 2014 elastic search рациональный подход к созданию собственной системы а...
кри 2014 elastic search  рациональный подход к созданию собственной системы а...кри 2014 elastic search  рациональный подход к созданию собственной системы а...
кри 2014 elastic search рациональный подход к созданию собственной системы а...Vyacheslav Nikulin
 
Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++
Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++
Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++Антон Шестаков
 
Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...
Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...
Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...Ontico
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEBAlexandre Kalendarev
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Ontico
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?Alexey Tokar
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Ontico
 
20100228 virtualization igotti_lecture03
20100228 virtualization igotti_lecture0320100228 virtualization igotti_lecture03
20100228 virtualization igotti_lecture03Computer Science Club
 
Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...
Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...
Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...Ontico
 

La actualidad más candente (20)

My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
 
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
2013-02-02 03 Голушко. Полнотекстовый поиск с Elasticsearch
 
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
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотека
 
MongoDB basics in Russian
MongoDB basics in RussianMongoDB basics in Russian
MongoDB basics in Russian
 
Ruby basics
Ruby basicsRuby basics
Ruby basics
 
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событиях
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
 
кри 2014 elastic search рациональный подход к созданию собственной системы а...
кри 2014 elastic search  рациональный подход к созданию собственной системы а...кри 2014 elastic search  рациональный подход к созданию собственной системы а...
кри 2014 elastic search рациональный подход к созданию собственной системы а...
 
Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++
Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++
Выступление Александра Крота из "Вымпелком" на Hadoop Meetup в рамках RIT++
 
Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...
Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...
Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEB
 
No sql.mongodb scaling
No sql.mongodb scalingNo sql.mongodb scaling
No sql.mongodb scaling
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
 
20100228 virtualization igotti_lecture03
20100228 virtualization igotti_lecture0320100228 virtualization igotti_lecture03
20100228 virtualization igotti_lecture03
 
Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...
Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...
Особенности архитектуры распределённого хранилища в Dropbox / Слава Бахмутов ...
 

Destacado

CodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородахCodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородахCodeFest
 
CodeFest 2011. Ширшаков Д. — Как подружить ежа с ужом или другой взгляд на DWH
CodeFest 2011. Ширшаков Д. — Как подружить ежа с ужом или другой взгляд на DWHCodeFest 2011. Ширшаков Д. — Как подружить ежа с ужом или другой взгляд на DWH
CodeFest 2011. Ширшаков Д. — Как подружить ежа с ужом или другой взгляд на DWHCodeFest
 
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...CodeFest
 
CodeFest 2010. Погребняк А. — Проблемы оценки труда программистов
CodeFest 2010. Погребняк А. — Проблемы оценки труда программистовCodeFest 2010. Погребняк А. — Проблемы оценки труда программистов
CodeFest 2010. Погребняк А. — Проблемы оценки труда программистовCodeFest
 
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подходCodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подходCodeFest
 
CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...
CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...
CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...CodeFest
 
CodeFest 2013. Бурмако Е. — Макросы в Скале
CodeFest 2013. Бурмако Е. — Макросы в СкалеCodeFest 2013. Бурмако Е. — Макросы в Скале
CodeFest 2013. Бурмако Е. — Макросы в СкалеCodeFest
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на PythonCodeFest
 
CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...
CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...
CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...CodeFest
 
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все граблиCodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все граблиCodeFest
 
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...CodeFest
 
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...CodeFest
 
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...CodeFest
 
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?CodeFest
 
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...CodeFest
 
CodeFest 2011. Юферев Р. — Пора задуматься о Manageability
CodeFest 2011. Юферев Р. — Пора задуматься о ManageabilityCodeFest 2011. Юферев Р. — Пора задуматься о Manageability
CodeFest 2011. Юферев Р. — Пора задуматься о ManageabilityCodeFest
 
CodeFest 2013. Конев М. — Push-уведомления
CodeFest 2013. Конев М. — Push-уведомленияCodeFest 2013. Конев М. — Push-уведомления
CodeFest 2013. Конев М. — Push-уведомленияCodeFest
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest
 
CodeFest 2014. Осипов К. — NoSQL: вангуем вместе
CodeFest 2014. Осипов К. — NoSQL: вангуем вместеCodeFest 2014. Осипов К. — NoSQL: вангуем вместе
CodeFest 2014. Осипов К. — NoSQL: вангуем вместеCodeFest
 
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!CodeFest
 

Destacado (20)

CodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородахCodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
 
CodeFest 2011. Ширшаков Д. — Как подружить ежа с ужом или другой взгляд на DWH
CodeFest 2011. Ширшаков Д. — Как подружить ежа с ужом или другой взгляд на DWHCodeFest 2011. Ширшаков Д. — Как подружить ежа с ужом или другой взгляд на DWH
CodeFest 2011. Ширшаков Д. — Как подружить ежа с ужом или другой взгляд на DWH
 
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
 
CodeFest 2010. Погребняк А. — Проблемы оценки труда программистов
CodeFest 2010. Погребняк А. — Проблемы оценки труда программистовCodeFest 2010. Погребняк А. — Проблемы оценки труда программистов
CodeFest 2010. Погребняк А. — Проблемы оценки труда программистов
 
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подходCodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
 
CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...
CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...
CodeFest 2010. Уразов А. — Quality-Oriented Programming (Программирование, ор...
 
CodeFest 2013. Бурмако Е. — Макросы в Скале
CodeFest 2013. Бурмако Е. — Макросы в СкалеCodeFest 2013. Бурмако Е. — Макросы в Скале
CodeFest 2013. Бурмако Е. — Макросы в Скале
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...
CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...
CodeFest 2013. Днепровский П. — Морковка: спереди или сзади? Игровые механики...
 
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все граблиCodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
 
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
 
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
 
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
 
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
CodeFest 2013. Прокопов Н. — Зачем вам нужна Clojure?
 
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
 
CodeFest 2011. Юферев Р. — Пора задуматься о Manageability
CodeFest 2011. Юферев Р. — Пора задуматься о ManageabilityCodeFest 2011. Юферев Р. — Пора задуматься о Manageability
CodeFest 2011. Юферев Р. — Пора задуматься о Manageability
 
CodeFest 2013. Конев М. — Push-уведомления
CodeFest 2013. Конев М. — Push-уведомленияCodeFest 2013. Конев М. — Push-уведомления
CodeFest 2013. Конев М. — Push-уведомления
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 
CodeFest 2014. Осипов К. — NoSQL: вангуем вместе
CodeFest 2014. Осипов К. — NoSQL: вангуем вместеCodeFest 2014. Осипов К. — NoSQL: вангуем вместе
CodeFest 2014. Осипов К. — NoSQL: вангуем вместе
 
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
CodeFest 2014. Шипилёв А. — Java Benchmarking: как два таймстампа записать!
 

Similar a CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-приложениях

CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper
CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере ResharperCodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper
CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере ResharperCodeFest
 
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 JavaAndrei Pangin
 
ekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеit-people
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»e-Legion
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011CodeCamp
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Ontico
 
Где сегодня использовать ElasticSearch
Где сегодня использовать ElasticSearchГде сегодня использовать ElasticSearch
Где сегодня использовать ElasticSearchИлья Середа
 
Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
 Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва  Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва it-people
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Alexander Syrotenko
 
20100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture0420100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture04Computer Science Club
 
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)Pavel Tsukanov
 
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...Ontico
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ontico
 
#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Avia...
#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Avia...#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Avia...
#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Avia...e-Legion
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned Alexander Syrotenko
 
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...GeeksLab Odessa
 
SETCON'18 - Vitali Fokin - Kubernetes 101
SETCON'18 - Vitali Fokin - Kubernetes 101SETCON'18 - Vitali Fokin - Kubernetes 101
SETCON'18 - Vitali Fokin - Kubernetes 101Nadzeya Pus
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и DjangoTaras Lyapun
 
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...CUBRID
 

Similar a CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-приложениях (20)

An internal look at HotSpot JVM
An internal look at HotSpot JVMAn internal look at HotSpot JVM
An internal look at HotSpot JVM
 
CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper
CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере ResharperCodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper
CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper
 
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
 
ekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилище
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
 
Где сегодня использовать ElasticSearch
Где сегодня использовать ElasticSearchГде сегодня использовать ElasticSearch
Где сегодня использовать ElasticSearch
 
Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
 Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва  Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?
 
20100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture0420100307 virtualization igotti_lecture04
20100307 virtualization igotti_lecture04
 
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)
 
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
 
#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Avia...
#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Avia...#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Avia...
#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Avia...
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...
 
SETCON'18 - Vitali Fokin - Kubernetes 101
SETCON'18 - Vitali Fokin - Kubernetes 101SETCON'18 - Vitali Fokin - Kubernetes 101
SETCON'18 - Vitali Fokin - Kubernetes 101
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и Django
 
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...
 

Más de CodeFest

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита ПрокоповCodeFest
 
Денис Баталов
Денис БаталовДенис Баталов
Денис БаталовCodeFest
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена ГальцинаCodeFest
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр КалашниковCodeFest
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина ИвановаCodeFest
 
Marko Berković
Marko BerkovićMarko Berković
Marko BerkovićCodeFest
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис КортуновCodeFest
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр ЗиминCodeFest
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей КрапивенскийCodeFest
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей ИгнатовCodeFest
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай КрапивныйCodeFest
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим СмирновCodeFest
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин ОсиповCodeFest
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele RialdiCodeFest
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим ПугачевCodeFest
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene GroeschkeCodeFest
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван БондаренкоCodeFest
 
Mete Atamel
Mete AtamelMete Atamel
Mete AtamelCodeFest
 

Más de CodeFest (20)

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита Прокопов
 
Денис Баталов
Денис БаталовДенис Баталов
Денис Баталов
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена Гальцина
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр Калашников
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина Иванова
 
Marko Berković
Marko BerkovićMarko Berković
Marko Berković
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис Кортунов
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр Зимин
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей Игнатов
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай Крапивный
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим Смирнов
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele Rialdi
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим Пугачев
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene Groeschke
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван Бондаренко
 
Mete Atamel
Mete AtamelMete Atamel
Mete Atamel
 

CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-приложениях

  • 1. Управление памятью в Java: footprint Владимир Иванов Oracle Corp. vladimir.x.ivanov@oracle.com 1
  • 2. Содержание • Введение • Структура «кучи» в Java • «Сжатые» указатели • Представление объекта в памяти • Типы ссылок • Разное • Итоги 2
  • 3. Введение О чем пойдет речь? • Производительность GC • 3 характеристики • Throughput • Объем вычислительных ресурсов, затрачиваемых на GC • Предсказуемость • На какое время прерывается работа приложения • Footprint • Объем используемой памяти 3
  • 4. Содержание • Введение • Структура «кучи» в Java • «Сжатые» указатели • Представление объекта в памяти • Типы ссылок • Разное • Итоги 4
  • 6. Критерии выбора размера «кучи» • Чем больше памяти, тем лучше для GC • Как для молодого, так и для старшего поколения • Более редкие сборки • Ниже затраты на сборку мусора • Доступный объем памяти ограничен • Физическая память • 32-битный режим • Наличие других приложений в системе 6
  • 7. Содержание • Введение • Структура «кучи» в Java • «Сжатые» указатели • Представление объекта в памяти • Типы ссылок • Разное • Итоги 7
  • 8. «Сжатые» указатели -XX:+UseCompressedOops • 32-битные указатели в 64-битном режиме • oop - Ordinary Object Pointer Размер < 4Gb >= 4Gb >= 26Gb «кучи» < 26Gb < 32Gb Режим Zero-based Zero-based Offset-based работы non-aligned 8-byte aligned 8-byte aligned Декоди- не требуется x << 3 offset + x << 3 рование 8
  • 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 9
  • 10. Содержание • Введение • Структура «кучи» в Java • «Сжатые» указатели • Представление объекта в памяти • Типы ссылок • Разное • Итоги 10
  • 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 11
  • 12. Представление объекта в памяти • new int[1000] • new Integer[1000] • 32-бита: 4+4+4+1000*4 = • 32-бита: 4+4+4+1000*(4+4+4+4) = 4012 байт 16012 байт • 64-бита: 8+8+4+1000*4 = • 64-бита: 8+8+4+1000*(8+8+8+4) = 4020 байт 28020 байт 12
  • 13. Содержание • Введение • Структура «кучи» в Java • «Сжатые» указатели • Представление объекта в памяти • Типы ссылок • Разное • Итоги 13
  • 14. Инженерная проблема Кэширование данных • Приложение оперирует объемами данных, существенно превышающими доступную память • Требуется организовать кэширование на уровне приложения 14
  • 15. Типы ссылок в Java • Декларативный API к GC • Контроль достижимости • Представлены в виде объектов • extends java.lang.ref.Reference • 3 типа • «мягкие» • java.lang.ref.SoftReference • «слабые» • java.lang.ref.WeakReference • «фантомные» • java.lang.ref.PhantomReference 15
  • 16. Типы ссылок в 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) { … } 16
  • 17. Типы ссылок в Java Уровни достижимости Strongly Softly Weakly Finalizable Phantom reachable reachable reachable reachable Unreachable 17
  • 18. Типы ссылок SoftReference • Удаление softly reachable объекта при нехватке памяти в системе • Гарантии • Все «мягкие» ссылки к soft-достижимым объектам будут очищены до того, как будет брошен OOME • Применение • memory-sensitive caches • Можно контроллировать агрессивность очистки • -XX:SoftRefLRUPolicyMSPerMB 18
  • 19. Типы ссылок WeakReference • Наличие «слабой» ссылки не мешает GC удалить объект • Действия GC • Атомарно очищает все «слабые» ссылки на объект • Если надо, помещает объекты на финализацию • Если надо, помещает «слабые» ссылки в очередь • Использование • canonicalizing mappings (interned strings) 19
  • 20. Типы ссылок PhantomReference • Замена финализаторам – protected void Object::finalize() • Невозможно получить ссылку на объект – PhantomReference.get() == null • GC помещает «фантомные» ссылки в очередь 20
  • 21. Типы ссылок Чем плохи финализаторы? • Замедление аллокации – Требуется регистрация объектов с нетривиальными финализаторами • 2 цикла GC для удаления объекта • Возможность «воскрешения» объекта • Недетерминированный порядок исполнения • Могут начать выполняться раньше чем кажется • Многопоточность (даже в однопоточном приложении) – Требуется синхронизация при доступе к структурам данных 21
  • 22. Типы ссылок в Java Оповещения об изменении достижимости объекта • Помещение ссылки в очередь • java.lang.ref.ReferenceQueue • Получить оповещение, когда объект становится • softy reachable • weakly reachable • phantom reachable • Невозможно «воскресить» объект из очереди – Reference.get() == null 22
  • 23. Типы ссылок в Java Автоматическая очиста ссылок • «Мягкие» и «слабые» ссылки • Автоматически очищаются GC перед добавлением в очередь • Регистрация в очереди не обязательна • «Фантомные» ссылки • Обязаны быть зарегистрированы в очереди • Объект остается phantom-достижим пока все достижимые «фантомные» ссылки не очищены 23
  • 24. Типы ссылок в Java Резюме • «Мягкие» ссылки – очищаются при нехватке памяти в системе – GC-friendly кэширование объектов • «Cлабые» ссылки – очищаются если на объект есть только «слабые» ссылки – canonicalizing mappings (e.g. interned strings) • «Фантомные» ссылки – сообщение о «смерти» объекта – освобождение ресурсов, ассоциированных с объектом – надежнее финализаторов 24
  • 25. Содержание • Введение • Структура «кучи» в Java • «Сжатые» указатели • Представление объекта в памяти • Типы ссылок • Разное • Итоги 25
  • 26. Разное… Советы • ThreadLocal + ThreadPool = ? – «засоряют» пулы потоков • Коллекции – много пустых коллекций в приложении – начальный размер может быть слишком велик – выставлять желаемый размер явно при создании • Массивы – создавать перед использованием – DirectByteBuffer vs byte[] • используйте NIO для I/O вместо массивов • не копирует данные – пул <*>[]? фрагментация 26
  • 27. Анализ содержимого «кучи» приложения • Суммарный размер объектов по классам $ 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) 27
  • 28. Содержание • Введение • Структура «кучи» в Java • «Сжатые» указатели • Представление объекта в памяти • Типы ссылок • Разное • Итоги 28
  • 29. Итоги • Для комфортной работы GC требуется достаточно свободного места в «куче» • «Сжатые» указатели работают только до 32Gb • Неоптимальное представление данных может серьезно увеличить расход памяти • За счет java.lang.ref.* API можно уменьшить расход памяти приложением 29
  • 30. Вопросы? vladimir.x.ivanov@oracle.com @iwanowww 30