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

Post on 06-May-2015

2.433 views 2 download

description

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

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

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

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

Java Developer

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

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

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

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

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

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

Следствия

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

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

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

30 ГБ

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

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

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

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

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

OutOfMemoryError

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

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

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

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

Young Old MiscStackPerm

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

XX:PermSize -Xss

Проблема

-Xmn

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

Примитивы

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

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

Header

Primitives

References

Padding/offset

size

Of

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

Mark word

Garbage Collection Information Type Information Block Pointer Lock Array Length

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

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

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

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

32-bit, bytes 64-bit, bytes

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

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

reference size - ? reference size - ?

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

32-bit, bytes 64-bit, bytes

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

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

reference size - ? reference size - ?

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

32-bit, bytes 64-bit, bytes

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

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

reference size - ? reference size - ?

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

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

Примечание

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

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

-XX:-UseCompressedOops

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

class A {byte a;

}class B {int a;

}

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

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

class A {byte a;

}class B {int a;

}

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

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

class A {byte a;

}class B {int a;

}

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

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

байтам

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

class A {byte a;

}class B extends A {byte b;

}

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

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

class A {byte a;

}class B extends A {byte b;

}

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

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

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

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

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

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

}

new A() - ? байт

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

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

}

new A() - 40 байт

Boolean

16 1 7

header v alignment

Boolean24 bytes

Строка

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

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

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

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

Строка

17%

data

«123456»

Строка

16 12 8

header int fields ref

24 12

header+padding chars

String

char[]

Коллекции

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

HashSet → HashMap → Array → HashMap$Entry

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

Коллекции

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

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

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

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

-XX:+UseCompressedOops

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

32ГБ.

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

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

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

30%

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

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

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

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

Массив 24 16 12

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

Primitives vs Wrappers

int — 4 (stack)

Integer — 24 (heap) + 8 ref

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

class A {@NotNullprivate Long budget;

}

Сache friendly? Object pools?

new Integer(1) vs

Integer.valueOf(1)

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

Object[1000][2]и

Object[2][1000]

Архитектура

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

0.2

0.4

0.6

0.8

1

1.2

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

String icon;

Position pos;

}

class Position {

int x;

int y;

}

class Cursor2 {

String icon;

int x;

int y;

}

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

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

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

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

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

1 ГБ 4 ГБ

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

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

объектов

Hadoop

public void map(...) {

...

for (String word : words) {

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

}

}

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);

}

}

}

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);

}

}

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

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

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

Intellij Idea

protected int computeDeltaUpToRoot() {

return computeDeltaUpToRoot(new NodeCachedOffsets());

}

static class NodeCachedOffsets {

private int modCount;

private int deltaUpToRoot;

private boolean allDeltasUpAreNull;

}

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

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

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

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

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

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

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

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

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

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

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

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

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

Тесты

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

Make it run, make it right, make it fast