ヒープ領域








ヒープ領域(heap memory)はコンピュータープログラミングにおいて、動的に確保可能なメモリの領域。ヒープ (heap) とは、『山積み』という言葉の中の『山』をさす英単語である。


データ構造のヒープと直接的な関係があるかどうかは、ヒープ領域の構造の設計、保守にデータ構造のヒープの技術を使うかどうかに依る(あらゆるデータ構造とヒープ領域の関係について「直接的な関係があるかどうかは、ヒープ領域の構造の設計、保守にそのデータ構造の技術を使うかどうかに依る」ということが言えるので、データ構造のヒープについても、こう主張することが絶対的な間違いだとは言い切れない)。


ヒープ領域は、2種類のラベルを持つ双方向リストによって構成されている。初期状態では、リストはひとつの「未使用」ノードが全体を占めていて、メモリ確保関数(C言語のmalloc, C++のnew等)によって、「未使用」ノードから必要な分を切り取って「使用中」ノードと「未使用」ノードに分ける。確保したメモリが不要になった場合には、メモリ解放関数(C言語のfree, C++のdelete等)によってノードのラベルを「未使用」に書き換える。解放のつど、あるいはカウンタによって一定水準に達した時、連続した個々の「未使用」ノードを結合し、大きな「未使用」ノードに還元する。「未使用」ノードが不足した場合には、オペレーティングシステムに領域拡大を要求しヒープ領域を拡大するか、飛び飛びの未使用領域を連続な未使用領域に統合する。これをごみ集め(garbage collection)という。
ヒープ領域により、変数を動的に確保できる利点がある。欠点としては領域の確認・確保の時間にばらつきがあり処理時間の見積もりが困難になることと、領域の確保と解放の繰り返しによりヒープ上にどこからも参照しない領域が発生することがある。この領域を塵(garbage)という。
「未使用ノード」と「使用中」ノードが混在、つまり塵によりヒープの未使用領域がバラバラに分断された状態をフラグメンテーション状態と呼ぶ。



関連項目



  • 動的メモリアロケーション

  • ガベージコレクション

  • メモリリーク

  • コールスタック








Popular posts from this blog

MongoDB - Not Authorized To Execute Command

How to fix TextFormField cause rebuild widget in Flutter

in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith