Куда уходит память?

54
Куда уходит память?

description

Презентация к докладу "Куда уходит память?" на JEEConf Kiev 2012. О размере объектов в java на разных архитектурах, о потреблении памяти типичными java приложениями. Пока нету видео доклада можно почитать мою статью на хабре на эту тему http://habrahabr.ru/post/134102/

Transcript of Куда уходит память?

Page 1: Куда уходит память?

Куда уходит память?

Page 2: Куда уходит память?

Дмитрий ДуманскийCogniance, Velti project

Java Developer

Page 3: Куда уходит память?

Тенденции за последние 8 лет

Средний heap вырос с 0,5ГБ до 5ГБ

Вырос уровень абстракции

Миграция с 32-х разрядных

архитектур на 64-х разрядные

Количество ядер увеличилось в 8 раз

Page 4: Куда уходит память?

Следствия

Page 5: Куда уходит память?

Памяти много не бывает

Количество пользователей

85 000 000Граф связей

30 ГБ

Page 6: Куда уходит память?

Как улучшить?

Размер занимаемой памяти

Количество и скорость создания объектов

Сборщик мусора

Page 7: Куда уходит память?

Размер памяти

OutOfMemoryError

Слишком много данных

Данные слишком большие

Утечка памяти

Page 8: Куда уходит память?

Структура памяти

Young Old MiscStackPerm

Память процесса-Xmx

XX:PermSize -Xss

Проблема

-Xmn

Page 9: Куда уходит память?

4 основных структурных элемента языка Java

Примитивы

Массивы Объекты Ссылки

Page 10: Куда уходит память?

Из чего состоит объект?

Header

Primitives

References

Padding/offset

size

Of

Page 11: Куда уходит память?

Структура заголовка

Mark word

Garbage Collection Information Type Information Block Pointer Lock Array Length

Page 12: Куда уходит память?

Размер заголовка объекта

Размер заголовка — 2 машинных слова.

8 байт для 32-битной JVM16 байт для 64-битной JVM

Page 13: Куда уходит память?

Отличие архитектур

32-bit, bytes 64-bit, bytes

new Object() - ? new Object() - ?

new int[0] - ? new int[0] - ?

reference size - ? reference size - ?

Page 14: Куда уходит память?

Отличие архитектур

32-bit, bytes 64-bit, bytes

new Object() - 8 new Object() - 16

new int[0] - ? new int[0] - ?

reference size - ? reference size - ?

Page 15: Куда уходит память?

Отличие архитектур

32-bit, bytes 64-bit, bytes

new Object() - 8 new Object() - 16

new int[0] - 16 new int[0] - 24

reference size - ? reference size - ?

Page 16: Куда уходит память?

Отличие архитектур

32-bit, bytes 64-bit, bytes

new Object() - 8 new Object() - 16

new int[0] - 16 new int[0] - 24

reference size - 4 reference size - 8

Page 17: Куда уходит память?

Примечание

Вся приведенная информация для 64-битной Oracle HotSpot JVM.

Не концентрируйтесь на цифрах.

-XX:-UseCompressedOops

Page 18: Куда уходит память?

Выравнивание полей

class A {byte a;

}class B {int a;

}

new A() - ? байтаnew B() - ? байта

Page 19: Куда уходит память?

Выравнивание полей

class A {byte a;

}class B {int a;

}

new A() - 24 байтаnew B() - ? байта

Page 20: Куда уходит память?

Выравнивание полей

class A {byte a;

}class B {int a;

}

new A() - 24 байтаnew B() - 24 байта

Page 21: Куда уходит память?

В java размер любого объекта кратен 8

байтам

Page 22: Куда уходит память?

Выравнивание по классу

class A {byte a;

}class B extends A {byte b;

}

new A() - 24 байтаnew B() - ? байта

Page 23: Куда уходит память?

Выравнивание по классу

class A {byte a;

}class B extends A {byte b;

}

new A() - 24 байтаnew B() - 32 байта

Page 24: Куда уходит память?

Предварительная группировка полей объекта

8-ми байтовые типы (double и long)

4-х байтовые типы (int и float) 2-х байтовые типы (short и char) Одно байтовые типы (boolean и byte) Ссылочные переменные

Page 25: Куда уходит память?

Все есть объект

сlass A {Object o = new Object();

}

new A() - ? байт

Page 26: Куда уходит память?

Все есть объект

сlass A {Object o = new Object();

}

new A() - 40 байт

Page 27: Куда уходит память?

Boolean

16 1 7

header v alignment

Boolean24 bytes

Page 28: Куда уходит память?

Строка

new String() - 40 байт (без массива)

new String(«2») - 64 байт

new String(«33») - 64 байт

new String(«444») - 72 байт

Page 29: Куда уходит память?

Строка

17%

data

«123456»

Page 30: Куда уходит память?

Строка

16 12 8

header int fields ref

24 12

header+padding chars

String

char[]

Page 31: Куда уходит память?

Коллекции

Среднее java приложение ~1 млн HashSet

HashSet → HashMap → Array → HashMap$Entry

Цена — 72 байта за new + 28 байт за каждое новое значение

Page 32: Куда уходит память?

Коллекции

95% коллекций содержат лишь несколько элементов

В среднем 5-20% хипа заняты пустыми значениями

Page 33: Куда уходит память?

Зачем все это нужно?

Page 34: Куда уходит память?

Сжимаем ссылки

-XX:+UseCompressedOops

• Увеличиваем адресное пространство до

32ГБ.

• Уменьшаем размер ссылок в два раза.

• Прирост скорости работы JVM 2-10%

• Уменьшаем потребление памяти от 5% до

30%

Page 35: Куда уходит память?

Сжимаем ссылки

64-bit 64-bit + опция 32-bit

Указатель 8 4 4

Заголовок 16 12 8

Массив 24 16 12

Выравнивание 8 4 4

Page 36: Куда уходит память?

Primitives vs Wrappers

int — 4 (stack)

Integer — 24 (heap) + 8 ref

Page 37: Куда уходит память?

Типичный пример

class A {@NotNullprivate Long budget;

}

Page 38: Куда уходит память?

Сache friendly? Object pools?

new Integer(1) vs

Integer.valueOf(1)

Page 39: Куда уходит память?

В чем разница?

Object[1000][2]и

Object[2][1000]

Page 40: Куда уходит память?

Архитектура

32-bit 64-bit 64-bit Comp.0

0.2

0.4

0.6

0.8

1

1.2

Page 41: Куда уходит память?

Денормализация моделиclass Cursor {

String icon;

Position pos;

}

class Position {

int x;

int y;

}

class Cursor2 {

String icon;

int x;

int y;

}

Объект Cursor2 занимает на 30% меньше памяти

Page 42: Куда уходит память?

Сторонние библиотеки

Guava : MapMaker.makeMap() - 2272 байт

Вы никогда не знаете, что внутри

Page 43: Куда уходит память?

Сериализация и десериализация

1 ГБ 4 ГБ

Page 44: Куда уходит память?

Известные проекты

Повсеместное использование пула

объектов

Page 45: Куда уходит память?

Hadoop

public void map(...) {

...

for (String word : words) {

output.collect(new Text(word), new IntVal(1));

}

}

Page 46: Куда уходит память?

Hadoopclass MyMapper ... {

Text wordText = new Text();

IntVal one = new IntVal(1);

public void map(...) {

...

for (String word : words) {

wordText.set(word);

output.collect(word, one);

}

}

}

Page 47: Куда уходит память?

Hadoop

public void reduce(Key key, Iterable<Value> values,

Context context) {

IntWritable c;

for (Value value : values) {

c = new IntWritable(0);

accMap.put(new Value(value), c);

}

}

Page 48: Куда уходит память?

Известные проекты

Постоянная генерация миллионов

объектов Постоянные срабатывания сборщика

Page 49: Куда уходит память?

Intellij Idea

protected int computeDeltaUpToRoot() {

return computeDeltaUpToRoot(new NodeCachedOffsets());

}

static class NodeCachedOffsets {

private int modCount;

private int deltaUpToRoot;

private boolean allDeltasUpAreNull;

}

Page 50: Куда уходит память?

Известные проекты

Вся модель в памяти

Используют свои коллекции вместо

стандартных Отказались от оболочек

Page 51: Куда уходит память?

Известные проекты

Часть модели в памяти

Целая команда по

оптимизации памяти

Page 52: Куда уходит память?

Известные проекты

Огромные heap (60ГБ)

Проблемы с паузами

сборщика Off-heap решение

Page 53: Куда уходит память?

Рекомендации

Тесты

Java core? (substring, BigDecimal) Используйте готовые решения Изучайте бизнес логику

Page 54: Куда уходит память?

Make it run, make it right, make it fast