codefest 2013. Иванов В. — Уменьшение расхода оперативной...

30
1 Управление памятью в Java: footprint Владимир Иванов Oracle Corp. [email protected]

Upload: codefest

Post on 28-Nov-2014

757 views

Category:

Documents


2 download

DESCRIPTION

 

TRANSCRIPT

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

1

Управление памятью в Java:

footprint

Владимир Иванов

Oracle Corp.

[email protected]

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

2

Содержание

• Введение

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

• «Сжатые» указатели

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

• Типы ссылок

• Разное

• Итоги

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

3

Введение О чем пойдет речь?

• Производительность GC

• 3 характеристики

• Throughput

• Объем вычислительных ресурсов, затрачиваемых на GC

• Предсказуемость

• На какое время прерывается работа приложения

• Footprint

• Объем используемой памяти

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

4

Содержание

• Введение

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

• «Сжатые» указатели

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

• Типы ссылок

• Разное

• Итоги

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

5

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

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

6

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

• Чем больше памяти, тем лучше для GC

• Как для молодого, так и для старшего поколения

• Более редкие сборки

• Ниже затраты на сборку мусора

• Доступный объем памяти ограничен

• Физическая память

• 32-битный режим

• Наличие других приложений в системе

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

7

Содержание

• Введение

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

• «Сжатые» указатели

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

• Типы ссылок

• Разное

• Итоги

Page 8: CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в 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

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

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

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

10

Содержание

• Введение

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

• «Сжатые» указатели

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

• Типы ссылок

• Разное

• Итоги

Page 11: CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в 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

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

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 байт

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

13

Содержание

• Введение

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

• «Сжатые» указатели

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

• Типы ссылок

• Разное

• Итоги

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

14

Инженерная проблема Кэширование данных

• Приложение оперирует объемами данных,

существенно превышающими доступную память

• Требуется организовать кэширование на уровне

приложения

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

15

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

• Декларативный API к GC

• Контроль достижимости

• Представлены в виде объектов

• extends java.lang.ref.Reference

• 3 типа

• «мягкие»

• java.lang.ref.SoftReference

• «слабые»

• java.lang.ref.WeakReference

• «фантомные»

• java.lang.ref.PhantomReference

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

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) { … }

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

17

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

Strongly

reachable

Weakly

reachable

Finalizable Softly

reachable

Phantom

reachable

Unreachable

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

18

Типы ссылок SoftReference

• Удаление softly reachable объекта при нехватке

памяти в системе

• Гарантии

• Все «мягкие» ссылки к soft-достижимым объектам будут

очищены до того, как будет брошен OOME

• Применение

• memory-sensitive caches

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

• -XX:SoftRefLRUPolicyMSPerMB

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

19

Типы ссылок WeakReference

• Наличие «слабой» ссылки не мешает GC удалить

объект

• Действия GC

• Атомарно очищает все «слабые» ссылки на объект

• Если надо, помещает объекты на финализацию

• Если надо, помещает «слабые» ссылки в очередь

• Использование

• canonicalizing mappings (interned strings)

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

20

Типы ссылок PhantomReference

• Замена финализаторам

– protected void Object::finalize()

• Невозможно получить ссылку на объект

– PhantomReference.get() == null

• GC помещает «фантомные» ссылки в очередь

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

21

Типы ссылок Чем плохи финализаторы?

• Замедление аллокации

– Требуется регистрация объектов с нетривиальными

финализаторами

• 2 цикла GC для удаления объекта

• Возможность «воскрешения» объекта

• Недетерминированный порядок исполнения

• Могут начать выполняться раньше чем кажется

• Многопоточность (даже в однопоточном приложении)

– Требуется синхронизация при доступе к структурам данных

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

22

Типы ссылок в Java Оповещения об изменении достижимости объекта

• Помещение ссылки в очередь

• java.lang.ref.ReferenceQueue

• Получить оповещение, когда объект становится • softy reachable

• weakly reachable

• phantom reachable

• Невозможно «воскресить» объект из очереди

– Reference.get() == null

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

23

Типы ссылок в Java Автоматическая очиста ссылок

• «Мягкие» и «слабые» ссылки

• Автоматически очищаются GC перед добавлением в очередь

• Регистрация в очереди не обязательна

• «Фантомные» ссылки

• Обязаны быть зарегистрированы в очереди

• Объект остается phantom-достижим пока все достижимые

«фантомные» ссылки не очищены

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

24

Типы ссылок в Java Резюме

• «Мягкие» ссылки

– очищаются при нехватке памяти в системе

– GC-friendly кэширование объектов

• «Cлабые» ссылки

– очищаются если на объект есть только «слабые» ссылки

– canonicalizing mappings (e.g. interned strings)

• «Фантомные» ссылки

– сообщение о «смерти» объекта

– освобождение ресурсов, ассоциированных с объектом

– надежнее финализаторов

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

25

Содержание

• Введение

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

• «Сжатые» указатели

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

• Типы ссылок

• Разное

• Итоги

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

26

Разное… Советы

• ThreadLocal + ThreadPool = ?

– «засоряют» пулы потоков

• Коллекции

– много пустых коллекций в приложении

– начальный размер может быть слишком велик

– выставлять желаемый размер явно при создании

• Массивы

– создавать перед использованием

– DirectByteBuffer vs byte[]

• используйте NIO для I/O вместо массивов

• не копирует данные

– пул <*>[]? фрагментация

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

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)

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

28

Содержание

• Введение

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

• «Сжатые» указатели

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

• Типы ссылок

• Разное

• Итоги

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

29

Итоги

• Для комфортной работы GC требуется достаточно

свободного места в «куче»

• «Сжатые» указатели работают только до 32Gb

• Неоптимальное представление данных может

серьезно увеличить расход памяти

• За счет java.lang.ref.* API можно уменьшить расход

памяти приложением

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

30

Вопросы?

[email protected]

@iwanowww