2

我目前正在用 Java 开发自己的宠物项目,其中包含自定义数据结构。为了测量性能,我选择了 Google Caliper 框架,但是为了测量数据结构的内存使用情况,我应该每次使用 VisuamVm(转储堆并等待计算对象保留大小)来测量它,以获得有效的结果。我想做某种“内存基准”测试。

所以,问题是:

是否有任何类似于CaliperJunitBenchmarks的 Java 框架允许进行测试以测量我的数据结构的内存消耗?

4

3 回答 3

2

这个工具适合你。Open JDK - Java 对象布局

检查 HashMap 的示例

$ java -jar jol-cli/target/jol-internals.jar java.util.HashMap
  Running 64-bit HotSpot VM.
  Using compressed references 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]

  java.util.HashMap object internals:
   OFFSET  SIZE       TYPE DESCRIPTION                    VALUE
    0     4            (object header)                01 00 00 00 (00000001 00000000    00000000 00000000)
    4     4            (object header)                00 00 00 00 (00000000 00000000 00000000 00000000)
    8     4            (object header)                0f 0f 3e e0 (00001111 00001111 00111110 11100000)
   12     4        Set AbstractMap.keySet             null
   16     4 Collection AbstractMap.values             null
   20     4        int HashMap.size                   0
   24     4        int HashMap.threshold              16
   28     4      float HashMap.loadFactor             0.75
   32     4        int HashMap.modCount               0
   36     4        int HashMap.hashSeed               0
   40     4    Entry[] HashMap.table                  []
   44     4        Set HashMap.entrySet               null
   Instance size: 48 bytes (estimated, add this JAR via -javaagent: to get accurate result)
   Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
于 2014-03-10T14:25:23.517 回答
0

虽然我不知道这方面的库,但有比使用堆转储来测量内存使用更好的方法:您可以要求 JVM 使用 执行垃圾收集System.gc(),然后使用 查询堆使用情况Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()

于 2014-03-10T14:35:11.370 回答
0

内存基准包含两点:吞吐量片段。在这里,我认为您要做的是为这些环境选择更好的数据结构。对于这一点,我想你也需要这两点来衡量。

在这里,您可以使用OQL(对象查询语言)来查询此数据结构的使用情况。您可以使用hprofMAT来分析系统的堆上下文。

为了解决您进行测试以测量内存消耗的问题,我建议执行以下步骤:

  1. 创造一个生产环境
  2. 运行程序
  3. 重要的是,您可以转储堆使用 JMX 在完全 GC 之前和之后进行 HPROF 堆转储
  4. 使用MAT , VisualVM分析 hprof
于 2014-03-10T14:51:28.443 回答