当前位置:  开发笔记 > 编程语言 > 正文

Java对象的内存分配过程中的步骤

如何解决《Java对象的内存分配过程中的步骤》经验,为你挑选了2个好方法。

当类实例化以下对象时,内存中会发生什么?

public class SomeObject{

    private String strSomeProperty;

    public SomeObject(String strSomeProperty){
        this.strSomeProperty = strSomeProperty;
    }
    public void setSomeProperty(String strSomeProperty){
        this.strSomeProperty = strSomeProperty;
    }
    public String getSomeProperty(){
        return this.strSomeProperty;
    }
}

在课堂上SomeClass1:

SomeObject so1 = new SomeObject("some property value");

在课堂上SomeClass2:

SomeObject so2 = new SomeObject("another property value");

如何将内存分配给新实例化的对象及其属性?



1> slim..:

让我们一步一步:

SomeObject so1 = new SomeObject("some property value");

...实际上比它看起来更复杂,因为你正在创建一个新的String.可能更容易想到:

String tmp = new String("some property value");
SomeObject so1 = new SomeObject(tmp);
// Not that you would normally write it in this way.

(绝对准确 - 这些并不是真正等效的.原来,'new String'是在编译时创建的,是.class映像的一部分.你可以把它想象成一个性能破解.)

因此,首先JVM为String分配空间.您通常不知道或不关心String实现的内部,所以只需要相信一块内存被用来表示"某些属性值".此外,您还有一些临时分配的内存,其中包含对String的引用.在第二种形式中,它被明确地称为tmp; 在您的原始形式Java处理它而不命名它.

接下来,JVM为新的SomeObject分配空间.这是Java内部簿记的空间,也是每个对象字段的空间.在这种情况下,只有一个字段,strSomeProperty.

请记住,这strSomeProperty只是对String的引用.目前,它将被初始化为null.

接下来,执行构造函数.

this.strSomeProperty = strSomeProperty;

所有这一切都是将对String 的引用复制到您的strSomeProperty字段中.

最后,为对象引用分配空间so1.这是通过引用SomeObject来设置的.

so2 以完全相同的方式工作.


不,它并不比看起来复杂."a"和新的String("a")不是等价的表达式.字符串文字由编译器实现.使用它们时不会产生额外的堆分配.
实习可能在概念上更复杂,但它具有正确的优点.
我将用化学来比喻.在英国的学校里,16岁的孩子被教授波尔的原子模型.它在许多情况下都很有用,而且它比在更高层次上教授的事实更简单.我会编辑文本以澄清.

2> Craig P. Mot..:

由Heinz M. Kabutz博士确定Java中的内存使用情况给出了一个精确的答案,以及一个计算内存使用情况的程序.相关部分:

    该类占用至少8个字节.所以,如果你说新的Object(); 你将在堆上分配8个字节.

    每个数据成员占用4个字节,long和double除外,占用8个字节.即使数据成员是一个字节,它仍然会占用4个字节!此外,使用的内存量以8字节块增加.因此,如果你有一个包含一个字节的类,它将占用类的8个字节和数据的8个字节,总共16个字节(呻吟!).

    数组有点聪明.基元在数组中打包,所以如果你有一个字节数组,它们每个都会占用一个字节(哇!).当然,内存使用量仍以8字节块为单位.

正如人们在评论中指出的那样,字符串是一个特例,因为它们可以被实习.您可以以相同的方式推断它们占用的空间,但请记住,看起来像同一个String的多个副本的内容实际上可能指向相同的引用.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有