JVM(Java Virtual Machine)運行時存儲區分爲4個:
一、程序計數器:線程私有。是一塊較小的內存,是當前線程所執行的字節碼的行號指示器。經過改變計數器的值來肯定下一條指令,好比循環,分支,跳轉,異常處理,線程恢復等都是依賴計數器來完成。是JVM中惟一沒有規定OOM(OutofMemory)的區域。
二、棧區:線程私有,生命週期和線程相同。
用於存儲(1)基礎數據類型 byte short int long float double char boolean (2)對象的引用變量(引用變量就至關因而爲堆中的數組或對象起的一個別名,之後就能夠在程序中使用棧中的引用變量來訪問堆中的數組或對象。)
三、堆:全部線程共享 ,JVM只有一個堆區,虛擬機啓動時建立。
用於存儲:(1)new出來的的對象 (2)數組
四、方法區(永久區、靜態區):全部線程共享,用於存儲已被JVM加載的類信息、常量、靜態變量等數據。
方法區的垃圾收集主要是回收廢棄常量和無用的類(卸載類)。可是垃圾回收其實不多光顧這個區域。
提問:String 和 stringbuffer建立的對象放在棧仍是堆呢?
String既能夠在堆中存放,也能夠在棧中存放。String對象有兩種方式來建立,一種是new,好比String str = new String("abc"),這樣的會存放在堆中,且每調用一次就會建立一個新的對象;另外一種是直接用等號賦值String str = "abc",這一種是先在棧中建立一個對String類的對象引用變量str ,而後查找棧中有沒有存放"abc",若是沒有,則將"abc"存放進棧,並令str 指向"abc",若是已經有"abc",則直接令str 指向"abc"。
stringbuffer存放在堆中。