特定对象列表的内存使用情况

时间:2011-01-26 08:47:39

标签: java unit-testing memory-management

我有一个简单的pojos(一个用户类)列表,其中包含大约15个简单字段& 1个arrayList。 那些代表用户&可能100或1000个将存储在内存中,以避免每次从外部系统检索它们。 (我正在使用Ehcache)

我想通过junit测试知道这些用户的K列表使用了多少内存。 我有直觉认为简单的pojo就像那些即使是1000个也不会以任何方式威胁(换言之,不到100 Ko)

先谢谢你的回复。 我非常感谢你的帮助。

4 个答案:

答案 0 :(得分:11)

您可以在创建对象之前和之后计算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 :(得分:1)

您可以将它们写入ByteOutputStream,然后获取字节数组并检查其长度。如果您的pojos是Serializable,这将有效。

答案 2 :(得分:0)

如果您想进行简单测试,可以将新尺寸设置为较大并执行以下操作。 仅当您的新尺寸远大于您创建的数据时,此方法才有效。 e.g。

  

-XX:NewSize = 1g -verbosegc

如果您没有看到任何GC,该值将是正确的。

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

//build object here

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

注意:这假设您不生成临时对象。

答案 3 :(得分:0)

JOL (Java Object Layout)实用程序库,可以分析对象布局和内存占用。

向项目添加依赖项(例如,使用gradle // 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) 上的输出:

{{1}}