對於成天寫業務代碼的人也許真的很難有時間,有精力去記住這些概念性的東西。其實日常也挺喜歡看這些東西的,可是就是看過以後過不了多久就會忘記,這真是個悲傷的故事數組
Java 內存模型this
Java虛擬機將其管轄的內存大體分爲三個邏輯部分: 方法區, Java棧, Java堆對象
1.方法區是靜態分配的,編譯器將綁定在某個存儲位置上,並且這些綁定不會在運行時改變。常數池,源碼中的命名常量、String常量和static變量保存在方法區。生命週期
2.Java Stack 是一個邏輯概念,特色是後進先出。一個棧的空間多是連續的,也多是不連續的。最典型的的Stack應用是方法的調用,Java虛擬機每調用一次方法就建立一個方法幀,退出該方法則對應的方法幀被彈出。棧中存儲的數據也是運行時肯定的。內存
3.Java堆(heap)分配 意味着以隨意的順序,在運行時進行存儲空間分配和收回的內存管理模型。 堆中存儲的數據經常是大小、數量和生命週期在編譯時沒法肯定的,Java對象的內存老是在heap中分配。字符串
Java內存分配編譯器
1.基本數據類型直接在棧空間分配
2.方法的形式參數,直接在棧空間分配,當方法調用完成後從棧空間回收;
3.引用數據類型,須要用new 關鍵字來建立,既在棧空間分配一個地址空間,又在堆空間分配對象的實體空間;
4.方法的引用參數在棧空間分配一個地址空間,並指向堆空間的對象區,當方法調用完後從棧空間回收;
5.局部變量new出來時,在棧空間中和堆空間中分配空間,當局部變量生命週期結束後,棧空間馬上被回收,堆空間區域等待GC回收;
6.方法調用時傳入的實際參數,先在棧空間分配,在方法調用完成後從棧空間釋放;
7.字符串常量在常量池中分配,this 在堆內存中
8.數組既在棧空間分配數組名稱,又在堆空間分配數組實際的大小。源碼