基礎數據類型(Value type)直接在棧(stack)空間分配,方法的形式參數,直接在棧空間分配,當方法調用完成后從棧空間回收。
引用數據類型,需要用new來創建,既在棧空間分配一個地址空間(reference),又在堆空間分配對象的類變量(object)。
方法的引用參數,在棧空間分配一個地址空間,並指向堆空間的對象區,當方法調用完成后從棧空間回收。
局部變量 new出來時,在棧空間和堆空間中分配空間,當局部變量生命周期結束后,棧空間立刻被回收,堆空間區域等待GC回收。
字符串常量在方法區分配 ,this在堆空間分配。數組既在棧空間分配數組名稱, 又在堆空間分配數組實際的大小!
JAVA的JVM的內存可分為3個區:堆(heap)、棧(stack)和方法區(method)
堆:1. 用於存放創建的對象本身和數組(數組也是對象)
2. JVM只有一個堆,被所有線程共享
3. 堆是一個不連續的內存空間,分配靈活,速度慢
棧:1. 描述方法執行的內存模型,每個方法都會建一個棧幀(存儲局部變量、操作數、方法出口等)
2. JVM為每個進程創建一個棧,用於存放該線程執行方法的信息 (實際參數、局部變量)
3. 還用於存放對象的引用 (例:A a = new A() ,a即為對象new A()的引用)
4. 棧屬於線程私有,不能實現線程間的共享
5. 棧是由系統自動分配,速度快,棧是一個連續的存儲空間
6. 棧分為3個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)。
方法區(靜態區):1. JVM只有一個方法區,被所有線程共享
2. 實際上也是堆,只是用於存儲類、常量相關信息
3. 用來存放程序中永遠不變或唯一的內容(類信息、靜態變量、字符串常量等)
