6

int と Integer、long と Long、空のクラス インスタンスと long 値を持つクラス インスタンスのパフォーマンスを比較するベンチマークをいくつか行いました。

そして、自分では答えられない質問がいくつかあります。

  1. 空のクラスまたはオブジェクトのインスタンス化に 28 バイトかかるのはなぜですか?
  2. Long オブジェクトのインスタンス化には 29 バイト、プリミティブ long は 8 バイトかかるのに、空のクラスとの違いはなぜ 1 バイトしかないのですか? JVM はどのような最適化を行っていますか?

私は MacOS で JDK1.6.0_30 を使用しました。コードは https://github.com/mousator/benchmarks/blob/master/src/sk/emandem/michal/AutoboxingTypeBenchmark.javaで入手できます (プロジェクト全体をチェックアウトできます)。

答えてくれてありがとう!

4

1 に答える 1

2
  1. 私はあなたの記憶測定技術を信用しません。電話をかけるだけでruntime.gc()は、必ずしも何も起こりません。MemoryMeasurerなどのツールを使用します。
  2. 配列には独自のオーバーヘッドが発生します。通常は12バイトのオーダーです。オブジェクトヘッダー用に8つ、配列長用に4つ、そして参照用に配列エントリごとに4バイト。(これは32ビットVM上にあります。)
于 2012-04-29T03:56:59.463 に答える