1、堆
基本所有對象都在堆上被創建,而對象的聲明在棧中,它存着堆上的引用。例如 Object object = new Object();
object爲對象的聲明,存在虛擬機棧裏面,新建的object對象存在於堆上面,包括類的成員變量。
2、虛擬機棧
虛擬機棧是線程私有的,不會出現線程安全問題,在sun公司提供的hotspot中和本地方法棧爲一個棧,每次調用方法需要執行一個Frame(幀棧)的入棧到出棧的過程,每一個棧幀都有自己的局部變量表、操作數棧、返回地址和指向運行時常量池的引用。
3、本地方法棧
和虛擬機棧是一樣的,只是裏面執行的是jvm本地方法,申明爲native的方法。
4、程序計數器
記錄了每一個線程當前執行的代碼行,線程私有的。
5、方法區(非堆)
jdk7版本:存的是類型信息,包括class被加載後的類名,屬性,方法,靜態變量等
jdk8版本:移除永久代,相當於把方法區變成了放在元空間中進行類的加載,靜態成員變量和常量池移動至java堆中。
6、常量池(方法區裏面)
存的是final的值,常量,就是在編譯的時候就已經確定的值。
7、關於線程安全問題