对象如何存储在内存-Java(C )中

How objects are stored in memory - Java (c++)

本文关键字:内存 -Java 存储 何存储 对象      更新时间:2023-10-16

我有一个关于在Java语言中创建对象的内存问题。

当一个人在Java中创建一个对象时,堆在某些内存空间上 - 正确吗?但是,此内存的一部分是什么?是成员变量还是构件变量和方法?难道是指几个指的对象共享某些内容?

说我有以下课程

 class MyClass {
     //Membervariables
     protected int age;
     protected long dateOfBirth;

    /**
     * Constructor  
     * @param age
     */
    public MyClass(int age) {
        this.age = age;
    }

    /**
     * 
     * @param dateOfBirth
     */
    protected void setDob(long dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    /**
     * 
     * @return
     */
    protected int getAge() {   
        return this.age;
    }

    /**
     * 
     * @return
     */
    protected long getDob() {
        return this.dateOfBirth;
    }
  }

所以在此课程中,我有以下内容: - 两个会员变量 - 一个 int 和一个 long

  • 一个构造函数

  • 一个突变器 - 方法

  • 一个登录机方法。

在主机中,我创建了此类的两台(对象):

 MyClass myClass1 = new MyClass(10);
 MyClass myClass2 = new MyClass(11);

所以我的问题是:

1)如何在计算机内存中描绘这件事?

2)是否也可以将事物存储在内存中的"架构"也可以应用于C 吗?

预先感谢!

一个对象由指向班级内部版本的指针组成,用于synchronized锁定的区域,GC标志的区域以及类中定义的实例字段。(请注意,对象参考字段只是指针 - 引用的对象是单独分配的。)

方法是通过按照类指针指向类并在内部类对象中索引一个方法表的位置。

您上面的对象在64位JVM中大致将是:

  • 类指针-8字节
  • 锁变量-8字节
  • GC标志-4个字节
  • 哈希值-4个字节
  • dateofth -8字节
  • 年龄-4字节

36个字节总数。(当然,在32位的JVM中,较少。)36个字节可能会被四舍五入48个字节,以将其放在16字节的边界上,或者至少40个字节将其放在8字节边界上。/p>

(这是一种可能的实现。可以使用一些技巧来减少/组合锁定和GC字段的空间,例如,基本原理适用。)

当一个人在Java中创建一个对象时,堆在某些内存空间上 - 正确吗?

可能,但是JVM可以将其放在堆栈上或将其完全优化。

但是,此内存的一部分是什么?

如果您有一个世代相传的收集器,则将小物体放在伊甸园空间中,并将大物体放在终身空间中。

是成员变量还是成员变量和方法?

只是变量。该对象具有指向所有加载方法的类链接。

是否可以这样指的是同一类共享的几个对象?

是的,当然。但这不是一个要求,只是一个更最佳的解决方案。

1)如何在计算机内存中描述?

64位JVM的标题为16 BIT,其中包括标签和对类的引用。其次是田地。为了改善内存访问,更宽的字段似乎可以减少所需的填充量。

2)是否也可以将事物存储在内存中的"架构"也可以应用于C 吗?

对于使用虚拟方法的C 对象,它们也将具有与VTable的链接。

对象数据在堆上,类数据和成员功能共享

Java语言规格未指定堆布局。在实践中,大多数Java对象至少将具有" VTable指针"(可疑术语),该指向方法向量表(可能是方法指针,但也可能是一系列的"跳跃"指令)和其他run-指令 - 时间类型信息,然后是数据成员。因此,用您的示例,对象的堆布局可能看起来像:

(4 bytes) vtable pointer (points to MyClass vtable)
(4 bytes) age
(8 bytes) date of birth

对于同一类的任何两个对象,VTable指针应具有相同的值。因此,方法向量表和方法本身仅在地址空间中只存在一次。

请记住,这只是一个(简化的)示例,Java的实现不必遵守。

关于问题的第二部分,C 使用相同的技术;但同样,在语言规范中并未完全指定堆布局。当然,C 中的对象不一定要存储在堆上(当某些优化开始时,Java中的对象是正确的),但是对象的内存布局通常不依赖于分配的位置。

>