当我用 short 替换 int 时,为什么 Java 对象的大小相差超过两个字节?

Why is the size of a Java object different more than two bytes when I replace an int with a short?

我正在开发一个红黑树并使用 Eclipse 内存分析器工具来测量它的节点占用的 space。

我注意到,当我用一个 short 变量替换我用来保持树的高度的 int 变量时,每个节点的保留堆从 40 下降到 32。

public class RedBlackBST {
  private static final boolean RED   = true;
  private static final boolean BLACK = false;

  private Node root;

public class Node {
  public int key;
  public Node left, right;
  private boolean color;
  private int N;
}

你可以在下图中看到这个效果:

对于 N(用于高度)的 int,树的随机节点的浅堆和保留堆是 40。

int1 int2

对于 N 的缩写,树的随机节点的浅堆和保留堆是 32。

short1 short2

我认为差异应该只是两个字节。为什么是 8?

我也非常感谢对关于其余变量的两个数字的解释。我很困惑两个大小堆都是 2 的除数,因为我希望布尔变量颜色的大小为 1。请记住,属性选项卡中的第一个引用是 RedBlackBST 实例。

差异是由您使用的 JVM 将对象大小对齐到 8 的原因造成的。因此您可能在 64 位架构上使用 Oracle 的 Hotspot。这样做是出于性能原因。