Heap堆內存理解
一個JVM實例只有一個堆內存,堆內存的大小是可以調節的。類加載器讀取類文件后,需要把類文件、方法、常量放入到堆內存中,以便執行器執行,堆內存分為三部分:
1. Permanent Space 永久存儲區
一個JVM實例只有一個堆內存,堆內存的大小是可以調節的。類加載器讀取類文件后,需要把類文件、方法、常量放入到堆內存中,以便執行器執行,堆內存分為三部分:
1. Permanent Space 永久存儲區
永久存儲區是一個常駐內存區域,用于存放JDK自身所攜帶的Class,Interface的元數據,也就是說它存儲的是運行環境必須的類信息,被裝載進此區域的數據是不會被垃圾回收器回收掉的,關閉JVM才會釋放此區域所占用的內存。
2.Young Generation Space 新生區
新生區是類的誕生、成長、消亡的區域,一個類在這里產生,應用,最后被垃圾回收器收集,結束生命。
新生區又分為兩部分:伊甸區(Eden space)和幸存者區(Survivor pace)。
所有的類都是在伊甸區被new出來的。幸存區有兩個: 0區(Survivor 0 space)和1區(Survivor 1 space)。當伊甸園的空間用完時,程序又需要創建對象,JVM的垃圾回收器將對伊甸園區進行垃圾回收,將伊甸園區中的不再被其他對象所引用的對象進行銷毀。然后將伊甸園中的剩余對象移動到幸存0區。若幸存0區也滿了,再對該區進行垃圾回收,然后移動到1區。那如果1區也滿了呢?再移動到養老區。
3. Tenure Generation Space 養老區
養老區用于保存從新生區篩選出來的JAVA對象,一般池對象都在這個區域活躍。 三個區的示意圖如下:
本篇學習棧內存基本知識,附上JAVA代碼
1
package com.howard.jvm;
2
/**
3
* JAVA的內存管理 (一) 棧內存
4
* Stack棧 棧內存 JAVA程序的運行區。 是在線程創建時創建,它的生命周期是跟隨線程的生命周期,線程結束棧內存也就釋放,對于棧來說不存在垃圾回收問題
5
* 只要線程一結束,該棧就Over。
6
* 棧中的數據都是以棧幀(Stack Frame)的格式存在,棧幀是一個內存區塊,是一個數據集,是一個有關方法(Method)和運行期數據的數據集,當一個方法
7
* A被調用時就產生了一個棧幀F1,并壓入到棧中,A方法又調用B方法,于是產生棧幀F2也被壓入棧,執行完畢后,先彈出F2棧幀,然后再彈出F1棧幀,遵循“
8
* 后進先出”的原則。
9
* 棧幀中主要保存3類數據:
10
* 1. 本地變量(local Variables),包括輸入參數和輸出參數以及方法內變量;
11
* 2. 棧操作(Operand Stack),記錄入棧和出棧操作;
12
* 3. 棧幀數據(Frame Data),包括類文件、方法等等。
13
*
14
* @author Administrator
15
*
16
*/
17
public class StackMemory {
18
19
public void methodA() {
20
System.out.println("產生一個棧幀F1");
21
int i = 1;
22
System.out.println("變量i 放入到棧幀F1中");
23
System.out.println("準備產生一個棧幀F2");
24
methodB("hello world");
25
}
26
27
public String methodB(String arg) {
28
System.out.println("產生一個棧幀F2");
29
System.out.println("參數arg 和 方法返回值 放入到棧幀F2中");
30
return arg;
31
}
32
33
public static void main(String[] args) {
34
StackMemory sm = new StackMemory();
35
System.out.println("準備產生一個棧幀F1,因為將要調用methodA方法");
36
sm.methodA();
37
}
38
39
}
40

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40
