これらは, 実行時に動的生成されるマシン語コードを格納するためのメモリ領域を管理するクラス (See: here and here for details).
実行時に動的生成されるマシン語コードのためのメモリ領域を管理するクラス (つまり, CodeCache 用のメモリ領域を管理するクラス) (See: CodeCache).
((cite: hotspot/src/share/vm/memory/heap.hpp))
class CodeHeap : public CHeapObj {
CodeCache クラスの _heap フィールド (static フィールド) に(のみ)格納されている.
((cite: hotspot/src/share/vm/code/codeCache.hpp))
class CodeCache : AllStatic {
...
// CodeHeap is malloc()'ed at startup and never deleted during shutdown,
// so that the generated assembly code is always there when it's needed.
// This may cause memory leak, but is necessary, for now. See 4423824,
// 4422213 or 4436291 for details.
static CodeHeap * _heap;
起動時に(のみ)生成されている.
((cite: hotspot/src/share/vm/code/codeCache.cpp))
CodeHeap * CodeCache::_heap = new CodeHeap();
See: here for details
CodeHeap クラス内で使用される補助クラス.
CodeHeap が管理している各メモリ領域のメタ情報を記録しておくクラス (現状で記録しているのは, 「その領域の領域長」および「その領域が使用中かどうか」).
((cite: hotspot/src/share/vm/memory/heap.hpp))
class HeapBlock VALUE_OBJ_CLASS_SPEC {
CodeHeap が管理している各メモリ領域の先頭に埋め込まれている. (より具体的には, CodeHeap から確保された各メモリ領域の先頭, 及び CodeHeap 内で管理されている各空き領域の先頭)
CodeHeap からメモリが確保される際には, 要求サイズより HeapBlock 分だけ大きい領域が確保され, 先頭部分にその領域のメタ情報を表す HeapBlock が埋め込まれる.
(<= 要は malloc() が使用するメタ情報のようなもの)
((cite: hotspot/src/share/vm/memory/heap.cpp))
void* CodeHeap::allocate(size_t size) {
size_t length = number_of_segments(size + sizeof(HeapBlock));
...
HeapBlock* block = search_freelist(length);
内部には以下の 2つのフィールドのみを持つ. それぞれ「その領域の領域長(length)」および「その領域が使用中かどうか(used)」を表す.
(なお, 実際には padding も入れた分の大きさが HeapBlock オブジェクトの大きさになる)
((cite: hotspot/src/share/vm/memory/heap.hpp))
public:
struct Header {
size_t _length; // the length in segments
bool _used; // Used bit
};
protected:
union {
Header _header;
int64_t _padding[ (sizeof(Header) + sizeof(int64_t)-1) / sizeof(int64_t) ];
// pad to 0 mod 8
};
See: here for details
CodeHeap クラス内で使用される補助クラス.
CodeHeap 内の空き領域を管理するためのフリーリスト.
((cite: hotspot/src/share/vm/memory/heap.hpp))
class FreeBlock: public HeapBlock {
各 CodeHeap オブジェクトの _freelist フィールドに(のみ)格納されている.
((cite: hotspot/src/share/vm/memory/heap.hpp))
FreeBlock* _freelist;
HeapBlock のフィールドに加えて, リストを構成するための _link フィールドを持つ
(<= つまり, 各空き領域の先頭に HeapBlock が埋め込まれているので, さらにその直後の 1 word をリンクに使ってフリーリストを構成する).
((cite: hotspot/src/share/vm/memory/heap.hpp))
FreeBlock* _link;
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.