首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java工具返回的大小单位。

java工具返回的大小单位。
EN

Stack Overflow用户
提问于 2014-12-05 13:39:48
回答 3查看 968关注 0票数 0

我使用下面的java项目来确定对象http://sizeof.sourceforge.net/的大小

代码语言:javascript
复制
public class DataClass /*implements Serializable*/{

    // private static final long serialVersionUID = 5199373516861766638L;
    String name = "GUNJ";
    String lastName= "";

    // int age = 148888890;

    @Override
    public String toString() {
        return "DataClass{" +
                "Name='" + name + '\'' +
                ", Last Name='" + lastName + '\'' +
                ", Age=" +
                '}';

    }

    public static void main(String[] args) {

        // SizeOf.skipStaticField(true);
        // SizeOf.skipFinalField(true);
        // SizeOf.skipFlyweightObject(true);

        System.out.println(SizeOf.humanReadable(SizeOf.deepSizeOf(new DataClass()))); //this will print the object size in bytes
    }

}

我得到的结果如下144 as,64 as,72 as

  1. 这里的'b‘代表位还是字节?
  2. 为什么输出不改变,因为我在上面的情况下改变了字符的数量?有时增加,有时不增加。

它似乎在使用Java工具代码

似乎正在使用以下软件包: java.lang.instrument.Instrumentation

但不确定包的API是返回对象大小(以位还是字节为单位)。

EN

回答 3

Stack Overflow用户

发布于 2014-12-05 14:51:15

这个工具似乎有点过时了。作为另一种选择,我可以推荐优秀的约尔,它现在已经在OpenJDK下发布了。它甚至比sizeOf更好,并且支持许多很酷的特性。还可以查看Shipilev的博客文章,它演示了该工具的使用。

票数 1
EN

Stack Overflow用户

发布于 2014-12-05 13:53:58

您指出的链接指出:

Use the humanReadable() method to get the object size in byte, kilo or mega (if you need giga your in trouble guy!):

所以它似乎不是零碎的。

关于你的第二个问题,我没有答案。我猜String使用的缓冲区的大小大于字符串的大小,因此您可以在缓冲区的大小增长之前添加几个字符。

票数 0
EN

Stack Overflow用户

发布于 2015-01-05 16:51:36

我不相信对于这么小的物体你会得到“144‘t,64’t,72‘t”这样的结果。您很可能得到了144.0b64.0b72.0b

已链接的页面已经毫不怀疑地说:

  System.out.println(SizeOf.deepSizeOf());//这将以字节打印对象大小

如果您对SizeOf.humanReadable做什么持怀疑态度,您可以简单地省略它的调用,直接打印SizeOf.deepSizeOf的结果。

因为skipStaticFieldskipFinalFieldskipFlyweightObject是三个标志,因此允许八个组合,但是您只发布了三个结果而没有告诉您使用的组合,所以很难解释结果。特别是,由于String的实现在Java版本之间发生了变化,并且您没有指定使用的Java。

当指定skipFlyweightObject时,像源代码中的文字String那样的String不算在内。当没有指定skipFinalField时,就会考虑String的平面对象存储,但是当使用final字段引用它时,会忽略它的char[]内容。如果计算了所有的char,则必须考虑大多数实现都有一个对象大小填充,在报告对象大小时可能会考虑这个填充。

看起来,对于Oracle的JVM,每个对象都有一个对象大小为8个字节的倍数。因此,在UTF-16数组的对象大小增加到下一个8个字节的倍数之前,您可能会添加多达4个char字符。

您可以使用SizeOf.turnOnDebug();来了解如何计算对象大小。但是,您应该始终记住,这样的累积大小可能包括在不同对象图之间共享的对象,因此与实际使用的堆存储相比,这些对象的大小加起来要大得多。

还请考虑Instrumentation.getObjectSize (这个SizeOf类的后端)是怎么说的:

返回指定对象消耗的存储量的特定于实现的近似。结果可能包括部分或全部对象的开销,因此对于在实现中进行比较非常有用,而不是在实现之间进行比较。在JVM的单个调用过程中,估计值可能会发生变化。(我强调)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27317185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档