Куда уходит память?
Post on 06-May-2015
2.451 Views
Preview:
DESCRIPTION
TRANSCRIPT
Куда уходит память?
Дмитрий Думанский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
top related