Javaと.純ヒープ架
-
21-08-2019 - |
質問
いか、ヒープ、ガベージコレクタ製作所ごみ収集が起こり、世代メモリの割り当てが順次、ゴミの無料/未使用のスペース圧縮による移動データの形成と継続ブロック等
あヘッダーに割り当てられたメモリチャンクが存在するが、できない(してしまうという話を聞き、8-16バイトです。純CLR)がバイト、クアッドワードの配列です。私が興味をもった情報のためのJIT(Java)、CLR(.NETフレームワークやモノ)の実装x86、x64プロセッサのアーキテクチャ.
解決
Iは、ヘッダサイズは、2つの単語であると考えています。パディングは、(私は信じて)言葉の全体数に合計サイズを切り上げるためにちょうど十分。である
例えば、わずか「INT」との参照型は、ここで示されているように、x86で12のバイトを要する
using System;
public class Foo
{
int x;
public Foo(int x)
{
this.x = x;
}
}
public class Test
{
static void Main(string[] args)
{
int length = int.Parse(args[0]);
Foo x = new Foo(0);
Foo[] array = new Foo[length];
// Make sure that JITting the string constructor doesn't
// change things
long start = GC.GetTotalMemory(true);
for (int i=0; i < length; i++)
{
array[i] = new Foo(i);
}
long end = GC.GetTotalMemory(true);
GC.KeepAlive(array);
GC.KeepAlive(x);
decimal totalDecimal = end-start;
Console.WriteLine(totalDecimal / length);
}
}
一つの興味深い点は、 - いくつかの理由のSystem.Objectのインスタンスではなく、私がそう予測していた8の(x86の)12バイトになります。最小サイズは12バイトであるかのようにですが、あなたは、実際のデータの最初の4つのバイトが無料になります。)
報告されたサイズが正確に整数ではない理由を私はところで、知っていない - 私はそれが余分なマネージヒープにページごとに必要なメモリ、またはそのような何かの少しとは何かだと思います。所定の長さに依存しているようだ - 時には結果が12を超える少し、12歳、時には少しです。 (この回答の以前のバージョンでは、それが最初のコマンドライン引数を解析しますが、それを無視する場所にバグがありました。私はそれを修正しました。)とにかく、私はこのわずかな不正確さは、サイズとは何かを持っているとは思いませんメモリ内の個々のオブジェクトの
他のヒント
完全な答えというやや複雑な:はにまつわるオーバーヘッドがオブジェクト割り当てによってかなり異なっており実装に特定の仮想マシンがどもの世代のオブジェクトがある(つまり、にまつわるオーバーヘッドが特定のオブジェクトが変更有効期間中のオブジェクト
がいくつかの簡単なるユーティリティの可を推計するために用いられるオーバーヘッドの特定のオブジェクトながら堅牢(チェックアウト例 http://java.sun.com/docs/books/performance/1st_edition/html/JPRAMFootprint.fm.html).
Javaにおける情報として提供するものであり、インターフェースが、オブジェクトサイズなどのオーバーヘッドを参照 http://download-llnw.oracle.com/javase/6/docs/platform/jvmti/jvmti.html#GetObjectSize.
私は、Javaのことは知らないが、CLRのために1つのネイティブの言葉オーバーヘッドあたりの参照は、の割り当てられたタイプがあります。 32ビットシステムでは、それは8バイトになります4バイト、64ビットシステムであろう。