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

标签 java object memory heap-memory

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

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");

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

最佳答案

让我们一步一步来:

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

... 实际上比看起来更复杂,因为您正在创建一个新字符串。可能更容易理解为:

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

(绝对准确 - 这些并不完全等效。在原始版本中,“新字符串”是在编译时创建的,并且是 .class 图像的一部分。您可以将其视为性能黑客。)

所以,首先 JVM 为字符串分配空间。您通常不知道或不关心 String 实现的内部结构,因此请相信一 block 内存正在用于表示“某些属性值”。此外,您还临时分配了一些内存,其中包含对字符串的引用。在第二种形式中,它被显式称为 tmp;以您的原始形式,Java 处理它而不命名它。

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

请记住,strSomeProperty 只是对字符串的引用。目前,它将被初始化为 null。

接下来,构造函数被执行。

this.strSomeProperty = strSomeProperty;

所有这一切就是将 reference 复制到字符串中,复制到您的 strSomeProperty 字段中。

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

so2 的工作方式完全相同。

关于java - Java 对象的内存分配过程中的步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/320980/

相关文章:

java - Netty TCP 客户端异步消息

iphone - 我释放了所有的内存,但我的程序需要更多,我该怎么办?

java - 如何为 Android (java) 配置 Google Maps Distance Matrix API

java - 使用Java在PostgreSQL上的Money数据

java - 为什么对象 "person1"和对象 "person2"是相同的?

javascript - 如何通过了解对象中另一个属性的值来检索属性的值?

arrays - MATLAB 矩阵预分配比动态矩阵扩展慢

linux - 在不使用 drop_caches 的情况下清除/proc/meminfo 中的 "cached"内存

java - CMIS 保持能力

Python:如何为 MutableSequence 派生类定义 __new__ ?