元の VM 仕様は、実際にはローカル変数に関してめちゃくちゃです。各ローカル変数はスタック上の「スロット」(単にインデックス番号) に予約され、各スロットは 4 バイトを保持することになっています。したがって、各変数は 1 つの「スロット」にマップされます。ただし、4 バイト (double、long) を超える変数は、 2 つの連続するスロットを占有する必要があります。ただし、参照は1 つのスロットを占有しますが、64 ビット VM では 8 バイトになる場合があります。これが指定された時点では 64 ビット VM は存在しなかったため、仕様では 32 ビット参照が想定されていました。
実際には、現在のすべての VM が適切と思われるスタック スロットを再マップし、スタックで予約される実際のサイズも VM によって決定されると確信しています。したがって、残っているのは、バイトコード内の独特のスロット割り当てスキームだけです。実際の「スロット」はすべて、純粋にバイトコード レベルにあります。VM は、バイトコードで指定されたスロット レイアウトに物理的に準拠する必要はありません。
バイトコード仕様を調べてください: http://docs.oracle.com/javase/specs/jvms/se5.0/html/Overview.doc.html#17257