Высокое использование памяти с большим количеством объектов в JavaJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Высокое использование памяти с большим количеством объектов в Java

Сообщение Anonymous »

У меня есть пример кода ниже, который зацикливается на 50 миллионов раз и создает объекты MyDataHolder . MyDataHolder имеет два варианта: один на основе хэш-карты, а другой — на основе переменных. видеть (

Код: Выделить всё

MyDataHolder_map
и MyDataHolder_variable)

Код: Выделить всё

public class MemTest {
public static void main(String[] args) {
List list = new LinkedList();
for (int i = 0; i < 50_000_000; i++) {
if(i % 100_000==0) System.out.println(i);
MyDataHolder_map d = new MyDataHolder_map();
d.add("key1", "value1"+i);
d.add("key2", "value2"+i);
d.add("key3", "value3"+i);
d.add("key4", "value4"+i);
d.add("key5", "value5"+i);
d.add("key6", "value6"+i);
list.add(d);
}
}
}
// use Map to store data
class MyDataHolder_map {
private Map data = new HashMap(6);

public void add(String key, String value) {
data.put(key, value);
}
}

// use variables
class MyDataHolder_variable {
private String key1;
private String key2;
private String key3;
private String key4;
private String key5;
private String key6;

public void add(String key, String value) {
switch (key) {
case "key1" -> key1 = value;
case "key2" -> key2 = value;
case "key3" -> key3 = value;
case "key4" -> key4 = value;
case "key5" -> key5 = value;
case "key6" -> key6 = value;
}
}
}

Я запускаю код с 32 ГБ оперативной памяти -Xmx32g -verbose:gc и замечаю, что MyDataHolder на основе переменной выводит следующее в конце программы:< /p>

Код: Выделить всё

With Variable based MyDataHolder
[32.495s][info][gc] GC(34) Pause Young (Normal) (G1 Evacuation Pause) 24032M->24072M(31312M) 1259.276ms
[35.537s][info][gc] GC(27) Pause Remark 24128M->24128M(32768M) 2.067ms
[59.101s][info][gc] GC(27) Pause Cleanup 24128M->24128M(32768M) 1.132ms
[59.234s][info][gc] GC(27) Concurrent Mark Cycle 39850.818ms
Обратите внимание, что для этого потребовалось 24128M, то есть 24 ГБ ОЗУ. Однако с помощью Hashmap на основе ``MyDataHolder` происходит сбой, и он печатается

Код: Выделить всё

[81.370s][info][gc] GC(73) Pause Young (Normal) (G1 Preventive Collection) 32581M->32583M(32768M) 42.816ms
[81.458s][info][gc] GC(74) To-space exhausted
[81.458s][info][gc] GC(74) Pause Young (Concurrent Start) (G1 Preventive Collection) 32615M->32647M(32768M) 82.420ms
[81.458s][info][gc] GC(75) Concurrent Mark Cycle
[81.519s][info][gc] GC(76) To-space exhausted
[81.519s][info][gc] GC(76) Pause Young (Normal) (G1 Preventive Collection) 32663M->32679M(32768M) 52.343ms
Обратите внимание, что он использовал все 32 ГБ ОЗУ.
Вопрос:
  • Почему программа занимает 24 ГБ с переменной версией, она должна быть намного меньше, поскольку общее количество уникальных строк в виртуальной машине составляет 6 ключей на итератор, т.е. 6 * 50M = 300M, и каждая строка имеет размер 7 байт, поэтому общее количество составляет 300М * 7Байт = 1,9 ГБ. Я понимаю, что существуют накладные расходы на ссылки и объекты, но они не могут превышать 20 ГБ. что происходит?
  • Почему MyDataHolder на основе Hashmap требуется больше места на 32 ГБ по сравнению с хранилищем на основе переменных. Имеет ли HashMap очень большие затраты памяти?
PS: использование java17

Подробнее здесь: https://stackoverflow.com/questions/787 ... ct-in-java
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Высокое использование 3D при вызове OpenCL с большим буфером на графической плате настольного компьютера.
    Anonymous » » в форуме C++
    0 Ответы
    68 Просмотры
    Последнее сообщение Anonymous
  • Высокое использование памяти в Java 21 по сравнению с Java 8
    Anonymous » » в форуме JAVA
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Высокое использование памяти в Java 21 по сравнению с Java 8
    Anonymous » » в форуме JAVA
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Высокое использование памяти в Java 21 по сравнению с Java 8
    Anonymous » » в форуме JAVA
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Высокое использование памяти в Java 21 по сравнению с Java 8
    Anonymous » » в форуме JAVA
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»