Использование памяти для определенного списка объектов - PullRequest
3 голосов
/ 26 января 2011

У меня есть список простых pojos (класс User) с примерно 15 простыми полями и 1 arrayList. Они представляют пользователей, и, возможно, 100 или 1000 из них будут храниться в памяти, чтобы избежать извлечения их из внешней системы каждый раз. (я использую Ehcache)

Я хотел бы узнать с помощью теста junit, сколько памяти используется списком K этих пользователей. У меня есть интуиция, что простые pojo, подобные тем, что даже для 1000, ничем не угрожают (другими словами, меньше 100 Ko)

Заранее спасибо за ваш ответ. я очень ценю вашу помощь.

Ответы [ 4 ]

11 голосов
/ 26 января 2011

Вы можете рассчитать объем памяти, используемый JRE до и после создания вашего объекта, чтобы приблизительно сколько байтов использовалось вашим объектом.

System.gc();
System.runFinalization();
Thread.sleep(1000);
long before = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();

//build object here

System.gc();
System.runFinalization();
Thread.sleep(1000);
long after = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();

long objectSize = after - before;
1 голос
/ 26 января 2011

Вы можете записать их в ByteOutputStream, затем получить байтовый массив и проверить его длину. Это будет работать, если ваши pojos являются Serializable.

0 голосов
/ 21 октября 2018

Существует JOL (Java Object Layout) служебная библиотека, которая может анализировать расположение объектов и объем памяти.

Добавить зависимость к вашему проекту (например, с помощью gradle compile 'org.openjdk.jol:jol-core:0.9'), а затемВы можете использовать вспомогательные классы для печати или проверки объема памяти конкретного объекта.

// Print VM details
System.out.println(VM.current().details());

// Create new object (this can be your own data class)
Map<String, Long> o = new HashMap<>();
o.put("key1", 123L);

// To check object size (for example: from unit test)
System.out.println("Shallow size: " + VM.current().sizeOf(o));
System.out.println("Total size: " + GraphLayout.parseInstance(o).totalSize());
System.out.println();

// To print object details
System.out.println(ClassLayout.parseInstance(o).toPrintable());
System.out.println(GraphLayout.parseInstance(o).toPrintable());
System.out.println(GraphLayout.parseInstance(o).toFootprint());

Вывод этого примера на Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode), java version "1.8.0_191":

# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

Shallow size: 48
Total size: 232

java.util.HashMap object internals:
 OFFSET  SIZE                       TYPE DESCRIPTION                               VALUE
      0     4                            (object header)                           01 52 99 6a (00000001 01010010 10011001 01101010) (1788432897)
      4     4                            (object header)                           2d 00 00 00 (00101101 00000000 00000000 00000000) (45)
      8     4                            (object header)                           a3 37 00 f8 (10100011 00110111 00000000 11111000) (-134203485)
     12     4              java.util.Set AbstractMap.keySet                        null
     16     4       java.util.Collection AbstractMap.values                        null
     20     4                        int HashMap.size                              1
     24     4                        int HashMap.modCount                          1
     28     4                        int HashMap.threshold                         12
     32     4                      float HashMap.loadFactor                        0.75
     36     4   java.util.HashMap.Node[] HashMap.table                             [(object), null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
     40     4              java.util.Set HashMap.entrySet                          null
     44     4                            (loss due to the next object alignment)
Instance size: 48 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

java.util.HashMap@2d6a9952d object externals:
          ADDRESS       SIZE TYPE                      PATH                           VALUE
        7410cb2b8         24 java.lang.Long            .table[0].value                123
        7410cb2d0    5383088 (something else)          (somewhere else)               (something else)
        7415ed680         48 java.util.HashMap                                        (object)
        7415ed6b0         24 java.lang.String          .table[0].key                  (object)
        7415ed6c8         24 [C                        .table[0].key.value            [k, e, y, 1]
        7415ed6e0         80 [Ljava.util.HashMap$Node; .table                         [(object), null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
        7415ed730         32 java.util.HashMap$Node    .table[0]                      (object)


java.util.HashMap@2d6a9952d footprint:
     COUNT       AVG       SUM   DESCRIPTION
         1        24        24   [C
         1        80        80   [Ljava.util.HashMap$Node;
         1        24        24   java.lang.Long
         1        24        24   java.lang.String
         1        48        48   java.util.HashMap
         1        32        32   java.util.HashMap$Node
         6                 232   (total)
0 голосов
/ 26 января 2011

Если вы хотите простой тест, вы можете установить новый размер, чтобы быть большим и сделать следующее.Это работает, только если ваш новый размер намного больше, чем данные, которые вы создаете.например,

-XX: NewSize = 1g -verbosegc

Значение будет правильным, если вы не видите GC.

long before = Runtime.getRuntime().freeMemory();

//build object here

long used = before - Runtime.getRuntime().freeMemory();

Примечание: предполагается, что вы не генерируете временные объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...