gpt4 book ai didi

java - Java 如何为对象的成员构建内存?

转载 作者:太空宇宙 更新时间:2023-11-04 07:10:33 25 4
gpt4 key购买 nike

我试图弄清楚Java如何为对象结构/分配内存。 (是的,这是特定于实现的。我为此使用 Oracle 1.7 运行时。)我对此做了一些工作 herehere结果令人困惑。

首先,在两个引用的链接中,当我分配一个对象数组(相当于 new Object[10000])时,每个对象使用 4 个字节。在 32 位系统上,这是非常有意义的。但我使用的是 64 位系统,所以这是怎么回事?

  1. 即使在 64 位系统上,Java 也仅限于 32 位地址空间吗?
  2. Java 是否限制每个数组的 32 位地址空间,并且每个数组对象都有一个指向元素所在位置的指针?
  3. 还有别的事吗?

第二,I compared the memory footprint of 8 booleans vs. a byte as the variables in a class 。 8 个 boolean 值需要 24 个字节/对象或 3 个字节/boolean 值。单字节方法需要 10 个字节/对象。

  1. 3 个字节/boolean 值是怎么回事?我会理解 4(使每个都成为 int)并且肯定理解 1(使每个成为字节。但是 3?
  2. 将 1 个字节扩展为 10 个字节会怎样?我会理解 8 将一个字节扩展为 native int (我在 64 位系统上)。但是另外 2 个字节是什么呢?

different ways to create a RGB class it gets really weird 而言.

  1. 对于由 3 个字节变量组成的类,每个实例使用 24 个字节。昂贵但可以理解,因为每个都使用 int。
  2. 所以我尝试了每个类都是一个 int,RGB 存储在 int 的部分中(使用位移位)。而且仍然是 24 字节/实例。到底为什么Java要用3个int来存储呢?这没有任何意义。
  3. 但最奇怪的情况是该类只有一个变量“byte[] color = new byte 3 ;”请注意,该字节已分配,因此它不仅仅是一个空指针。这种方法比其他两种方法占用更少的内存。怎么办???

任何关于这里发生的事情的指导都是值得赞赏的。我有几个类被分配了很多,并且飞轮模式不起作用(这些对象的值到处都在改变)。

还有一个相关的问题,声明变量的顺序重要吗?回到过去,当我进行 C++ 编程时,声明“int, byte, int, byte”使用了 4 个 int 的空间工作,而“int, int, byte, byte”使用了 3 个。

最佳答案

这里有太多问题,但我将解决其中两个。

Is Java limited to a 32-bit address space even on 64-bit systems?

32 位 Java 仅限于 32 位地址空间。 64 位 Java 则不然。

Is Java limited to a 32-bit address space per array and each array object then has a pointer to where the elements are?

Java 数组由 32 位的 int 索引。

关于java - Java 如何为对象的成员构建内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20694137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com