メモリ構造


プロセスメモリ構造



プログラムが実行されると、オペレーティングシステムはメモリにスペースを割り当てます.
割り当てられたメモリ領域はText,Data,Heap,Stackである.

Text

  • プログラムコードと定数が定義されています.
    Readのみのため、この領域にデータを格納しようとすると、パーティション競合が発生し、プロセスが
  • 停止する.

    Data

  • データは、グローバル変数、静的変数が割り当てられる空間である.プログラム実行時に作成し、プロセス終了時に
  • を破棄する
  • データは、データドメインとbssドメインに分けられる.
    data領域には初期化データが格納され、bssには未初期化データが格納される
    なぜ
  • データをデータ領域とbss領域に分けるのですか?
    ->データ領域に格納されているデータは不揮発性ROMに格納されており、コストが高いため、RAMとROMに格納されているデータを区別する必要がある.
    初期化されていないデータをROMに格納するのは無駄です
    ではROMは読み取り専用で、どのように値を修正しますか?
    ->RAMにデータ領域をコピーし、実行時に変更した値
  • を記憶する

    Heap

  • メモリを動的に割り当てる領域
  • メモリアドレス値によって参照および使用される領域.
  • ランタイム(プログラム動作)決定サイズ
  • C言語はmalloc、freeによって動的に管理され、javaはゴミ回収管理
  • スタックは制限されません
  • メモリの低アドレス->高アドレス
  • Stack

  • 一時使用(一時)データ記憶領域
  • 、すなわち、関数呼び出し時に生成する領域パラメータおよびパラメータ
  • が格納される.
  • 関数を呼び出すときに割り当て(スタックプッシュ)、関数の終了時にメモリから解放(スタックポップアップ)
  • .
    StackFrame スタック領域に格納された関数呼び出し情報
  • コンパイル時にサイズを決定する
  • スタックのサイズは、オペレーティングシステムによって制限される
  • メモリの高アドレス->低アドレス
  • Stack vs Heap

  • StackとHeapは同じメモリ領域を使用
  • ワークスペースが高アドレス->低アドレス/heap領域が低アドレス->高アドレスに割り当てられるため、ワークスペースが大きいほどheapが小さくなり、逆に
  • スタックとHIPが相互に侵入する場合,スタックオーバーフロー,HIP-overflowはそれぞれ
  • である.
  • 速度
  • Stackのアクセス速度はHeapより速い
  • Stackコンパイル時に割り当てられたスペースを使用してスタックポインタの位置のみを変更
    (CPU効率管理->メモリ断片化x)
  • Heapは、ユーザによって個別に割り当てられる
    ->スペースの有効な使用が保証されていない場合は、メモリフラグメント
  • が発生する可能性があります.

    JAVAメモリ管理


    Java Garbage Collector


    C言語では、mallocとfreeはユーザーによってheapメモリを管理されます.
    Javaでは、Garbage Collectorが見ています.
    次のコードで理解します.
    public class Main {
    	public static void main(String[] args){
        	String a = "Hello"
        	a += "World!"
            System.out.println(a)
        ]
    最初にaを割り当てると、スタックと臀部は以下のようになります.

    そしてコード
    a += "World!"
    文字列プラス記号演算の実行中に、既存のHelloWorldへ!追加するのではなく、文字列に対してプラス記号演算を実行した結果をheap領域に再割り当てします.これは以下の通りです.

    Stackに新しい変数を割り当てるのではなく,Heap領域で文字列加算の結果を再生成することが分かる.既存のHelloを転送するa変数は、新しく生成された文字列を転送します.
    では、既存のHello文字列は何ですか.
    文字列を転送する変数がないため、Unreachableオブジェクトです.
    JVMのGarbage Collectorは、Unreachableオブジェクトをメモリから優先的に削除します.
    もしそうなら、その姿は次のようになります.

    参考資料


    https://velog.io/@cchloe2311/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0
    https://velog.io/@koyo/development-common-sense-1
    https://velog.io/@goserimgoserimgo/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0
    https://yaboong.github.io/java/2018/05/26/java-memory-management/