Код: Выделить всё
MyDataHolder_map
Код: Выделить всё
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;
}
}
}
Код: Выделить всё
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
Код: Выделить всё
[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
Вопрос:
- Почему программа занимает 24 ГБ с переменной версией, она должна быть намного меньше, поскольку общее количество уникальных строк в виртуальной машине составляет 6 ключей на итератор, т.е. 6 * 50M = 300M, и каждая строка имеет размер 7 байт, поэтому общее количество составляет 300М * 7Байт = 1,9 ГБ. Я понимаю, что существуют накладные расходы на ссылки и объекты, но они не могут превышать 20 ГБ. что происходит?
- Почему MyDataHolder на основе Hashmap требуется больше места на 32 ГБ по сравнению с хранилищем на основе переменных. Имеет ли HashMap очень большие затраты памяти?
Подробнее здесь: https://stackoverflow.com/questions/787 ... ct-in-java