Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java检测返回的大小单位_Java_Instrumentation - Fatal编程技术网

java检测返回的大小单位

java检测返回的大小单位,java,instrumentation,Java,Instrumentation,我使用下面的java项目来确定对象的大小 我得到的结果如下 144Kb,64Kb,72Kb 这里的“b”代表位还是字节 为什么在上述情况下,当我更改字符数时,输出没有更改?有时增加,有时不增加 它似乎在使用Java插装代码 似乎正在使用以下包:java.lang.instrument.Instrumentation 但不确定包的API是否返回以位或字节为单位的对象大小。您指向的链接指出: 使用humanReadable()方法以字节、千或兆为单位获取对象大小(如果你需要千兆,麻烦的家伙!):

我使用下面的java项目来确定对象的大小

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

  • 这里的“b”代表位还是字节
  • 为什么在上述情况下,当我更改字符数时,输出没有更改?有时增加,有时不增加
  • 它似乎在使用Java插装代码

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


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

    您指向的链接指出:

    使用humanReadable()方法以字节、千或兆为单位获取对象大小(如果你需要千兆,麻烦的家伙!):

    所以它似乎不是零零碎碎的


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

    此工具似乎有点过时。作为一个替代方案,我可以推荐优秀的,现在已经在OpenJDK下发布了。 它甚至比sizeOf更好,支持许多很酷的功能。
    另外,请查看哪个演示了此工具的使用。

    我不相信对于这样小的对象,您会得到“144Kb、64Kb、72Kb”这样的结果。很可能您得到了
    144.0b
    64.0b
    ,以及
    72.0b

    政府已经毫无疑问地说:

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

    如果您对
    SizeOf.humanReadable
    的作用持怀疑态度,您可以省略其调用,直接打印
    SizeOf.deepSizeOf
    的结果


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

    当指定了
    skipFlyweightObject
    时,插入的
    String
    s(如源代码中的literal
    String
    s)不计算在内。如果未指定,但
    skipFinalField
    为,则会计算
    字符串的平面对象存储,但会忽略其
    char[]
    内容,因为它是使用
    final
    字段引用的。如果所有的<代码> char < /代码> s都被计算,那么你必须考虑到大多数实现都有一个对象大小填充,在报告对象大小时可以考虑。 似乎在Oracle的JVM中,每个对象的大小都是8字节的倍数。因此,在
    char
    数组的对象大小增加到下一个八字节的倍数之前,您最多可以添加四个
    UTF-16
    字符


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

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


    如果是零碎的,我会很惊讶。不确定更改“字符数”时要更改什么,但请记住,
    字符串
    引用只是一个引用。这些引用必须是字节,而不是“Kb”,对吗?
    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
        }
    
    }