編程時你需要考慮的不是內(nèi)存的物理地址(memory address),而是一種邏輯上的內(nèi)存模型。 Java虛擬機將其管轄的內(nèi)存大致分三個邏輯部分:
  1. 方法區(qū)(Method Area)、
  2. Java棧
  3. Java堆
方法區(qū)是靜態(tài)分配(static allocation)的,編譯器將變量在綁定在某個存儲位置上,而且這些綁定不會在運行時改變。Java方法區(qū)的一個重要部分,也是靜態(tài)分配最典型的例子,是常數(shù)池,源代碼中的命名常量、String常量和static 變量保存在其中。 Java Stack是一個邏輯概念,特點是后進先出,此外沒有特別的要求。Java Stack并不代表任何特定的內(nèi)存區(qū)間,也不限制它的實現(xiàn)方式。一個棧的空間可能是連續(xù)的,也可能是不連續(xù)的。最典型的Stack應(yīng)用是方法的調(diào) 用,Java虛擬機每調(diào)用一次方法就創(chuàng)建一個方法幀(frame),退出該方法則對應(yīng)的方法幀被彈出(pop)。棧分配存在一些局限:Java棧所處理的方法幀和局部變量,都將隨著方法幀彈出而結(jié)束,顯然局部變量無法從一個幀保持到下一個幀,被調(diào)方法的幀不可能比調(diào)用方法的壽命更長。因此,從數(shù)據(jù)保存來看,棧分配適用于由作用域決定生命周期的局部變量 Java堆(Heap)堆分配(heap allocation)意味著以隨意的順序,在運行時進行存儲空間分配和收回的內(nèi)存管理模型。堆中存儲的數(shù)據(jù)常常是大小、數(shù)量和生命期在編譯時無法確定的。Java對象的內(nèi)存總是在heap中分配。
文章來源:http://localhost/wp2/?p=59