Java在運行時,可以根據聲明週期大致把內存分爲兩部分:與JVM聲明週期一致的內存,與線程生命週期一致的內存。根據Java虛擬機規範第二版,Java在運行時內存可以分爲以下6個部分:
- PC計數器
- 棧
- 堆
- 方法區
- 運行時常量池
- 本地方法棧
PC計數器
每個線程都有自己的PC計數器。在不是本地方法的時候,PC計數器始終記着下一條需要執行的指令。在執行本地方法的時候,PC計數器裏面是undefined。
棧
每個線程對應着一個棧。棧(stack)是用來存儲幀(frame)的,棧只對幀進行pop和push的操作,每個方法對應一個幀。
堆
堆(heap)的生命週期和JVM是一致的,所有的線程都可以共享堆。當堆裏面的東西沒有被引用時,垃圾回收器就會回收他們。
方法區
方法區也是和JVM的生命週期一致,邏輯上是堆的一部分。裏面存着每個class的數據,包括常量池,字段,方法等等。
運行時常量池
是方法區的一部分。存儲着類或者接口的常量。
本地方法棧
也就是在執行本地方法時所需的棧。