Javaのメモリ領域(スタック領域、ヒープ領域)について

# 目次
[メモリ](#メモリ)
[スタック領域とは](#%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E9%A0%98%E5%9F%9F%E3%81%A8%E3%81%AF)
[ヒープ領域とは](#%E3%83%92%E3%83%BC%E3%83%97%E9%A0%98%E5%9F%9F%E3%81%A8%E3%81%AF)
[メモリ確保のイメージ](#メモリ確保のイメージ)
[値型のメモリ確保のイメージ](#値型のメモリ確保のイメージ)
[参照型のメモリ確保のイメージ](#参照型のメモリ確保のイメージ)
[おまけ](#おまけ)
[リストとは](#リストとは)
[挿入](#挿入)
[削除](#削除)
[単方向リスト](#単方向リスト)
[循環リスト](#循環リスト)
[参考文献、参考サイト](#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88)
[関連記事](#関連記事)

# メモリ
プログラムの実行時に利用される記憶領域(メモリ領域)には
- スタック領域
- ヒープ領域

がある

# スタック領域とは
- 一般にコールスタック、制御スタック、と呼ばれている
- LIFO(Last In First Out、先入れ後出し)方式で構成されている
<details><summary>スタック領域の「スタック」が指しているのは</summary>

⭕️メモリの解放と、メモリの確保
❌データの入れ方

メモリの解放とメモリの確保が、後入れ先出しの形になっているのを表している

基本情報や、応用情報の問題でも出てくるスタックのこと
![sketch-1723695429597.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/cb504eaa-e386-3fef-2391-5d62249d3f56.png)
</details>

- プログラム実行中のサブルーチン[^1]の情報を記憶しておくメモリ領域
→スタック領域は、確保したのとは逆の順番で解放するのが特徴

- サブルーチン[^1]終了後の戻りアドレスや局所変数(ローカル変数)などを保持する
- 値型(基本データ型、プリミティブ型)の値と、参照型載(オブジェクト型)の参照値[^2]が保存される


[^1]: (他の値から呼び出される)関数
[^2]: 参照値は、値がメモリのどこに格納されているかを示す

# ヒープ領域とは

- 2つのラベルを持つ双方向リストで構成され、プログラム上から動的(任意)に確保できるメモリ領域

<details><summary>双方向リスト</summary>

次のデータへのポインタの他に、前のデータのポインタも持っているリスト構造

![sketch-1723712256131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/04f8aa49-f219-6215-b039-69fabcaddb5a.png)
前後のどちらにもリストを辿っていくことができる
ポインタは、データが保管されているメモリ位置を示す

</details>

- 動的にメモリ取得を繰り返すことによって、メモリ上にどこからも参照できない領域(ガーベージ)が発生する
- どのような順序でメモリを確保、解放するかはソフトウェア側で自由に決められる
- 参照型の値、オブジェクトのインスタンス、実際の値やメソッドが格納される

<details><summary>なぜヒープ領域というの？</summary>

ヒープ(heap)は「積み重なる」「堆積する」という意味
→プログラムの実行に伴い、動的に確保され、その領域が順次拡大する様子から「ヒープ」と呼ばれる

:::note warn
ツリー状のデータ構造のことを指す「ヒープ」とは別物
![sketch-1723712252429.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/ddc65874-e578-c1cb-c9ac-057b7b0b7b53.png)

:::

</details>

# メモリ確保のイメージ
## 値型のメモリ確保のイメージ
![20240809_005311 Copy.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/8aeedee1-c737-35b8-b1e0-5ce63701e482.jpeg)
変数を宣言すると、メモリのスタック領域に「1」という値が格納される

## 参照型のメモリ確保のイメージ
![20240809_005311_Original Copy.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/27ed6984-cf29-febb-759a-53cd117fd858.jpeg)

下記サイトにある

> 実際に値が格納されているのはロッカーの中で、変数はロッカーの番号が書いた鍵のイメージ

というのが理解しやすいかと思います。

https://freelance-jak.com/technology/java/1175/

# おまけ
## リストとは
- リストの特徴：柔軟さ
   - ポインタさえ変えれば、いくらでもデータを繋ぎ変えることが可能
→<INS>データの追加・挿入・削除などがとても簡単にできる</INS>
- リストはポインタを順に辿る必要がある
→配列のように添え字を使って個々のデータに直接アクセスすることはできない

## 挿入
- ポインタを削除した後、そこに<INS>新しいポインタを書く<INS/>

![sketch-1723712259804.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/f0a82877-b2b8-c6df-724c-67c34e22662a.png)

## 削除
- ポインタを削除した後、そこに<INS>一つ後ろへのポインタを書く</INS>

![sketch-1723712264359.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/2aeb5c71-8519-c5b8-8afd-c3e3d00e71d6.png)


## 単方向リスト
- 次のデータへのポインタを、1つだけ持っているリスト構造
- 一方通行のため、先頭から順に辿っていくしかない

![sketch-1723712269017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/4ba8820c-17e0-5ffa-d531-623599b2f1df.png)

## 循環リスト
- ポインタによってデータが環状に連結されているリスト構造
- 最後尾のデータは、先頭データへのポインタを持つ
- 全体が環状に繋がっていてグルグル回ることがでる

![sketch-1723712272625.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330584/a313fc2c-ed18-c88f-886e-09c8b95ad6d8.png)


## 参考文献、参考サイト

- きたみりゅうじ. キタミ式イラストIT塾 応用情報技術者 令和04年. ‎技術評論社, 2017, p.376-377

https://freelance-jak.com/technology/java/1204/

https://www.ap-siken.com/s/kakomon/31_haru/q17.html

https://atmarkit.itmedia.co.jp/icd/root/80/34958380.html#:~:text=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%A7%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF,%E3%81%9F%E3%81%84%E3%81%9B%E3%81%8D%EF%BC%89%E3%81%99%E3%82%8B%E3%80%8D%E3%81%A8%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%80%82

https://it-trend.jp/development_tools/article/32-0041#:~:text=%E3%83%92%E3%83%BC%E3%83%97%E9%A0%98%E5%9F%9F%E3%81%A8%E3%81%AF%E3%80%81%E5%8B%95,%E5%AD%98%E5%9C%A8%E3%81%A8%E3%81%84%E3%81%88%E3%82%8B%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%80%82

https://it-trend.jp/development_tools/article/32-0041

https://freelance-jak.com/technology/java/1175/


# 関連記事

https://qiita.com/pe-pe-desu/items/6165343f5dd2b68705a0