java简单内存分析

Java虚拟机内存三个区域

栈stack

  1. JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(局部变量)。
  2. 栈描述的是方法执行的内存模型,每个方法的调用都会创建一个栈帧用于存储局部变量。
  3. 栈存储的特点是:先进后出。
  4. 栈是是连续的内存空间,系统自动分配空间,速度快!

堆heap

  1. JVM只有一个堆。
  2. 用于存储创建的对象。
  3. 堆是一个不连续的内存空间,动态分配空间,速度慢!

方法区(静态区)method area

  1. JVM只有一个方法区。
  2. 方法区在堆内存中。用于存储类信息(Class对象),静态变量,静态方法,常量池。
  3. 用来存放程序中唯一不变的内容。

分析代码内存图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package bcgs;

/**
* @author weishilei
*/
public class People {
int age;
String name;

public void sayHi() {
System.out.println("Hi");
}

public static void main(String[] args) {
People wangwu = new People();
wangwu.age = 35;
wangwu.name = "王五";
wangwu.sayHi();
}
}

java内存分析图

  1. 运行程序,加载People.class到方法区。常量加入到常量池中。

  2. 找到main方法创建main栈帧,顺序执行代码:

    1. new People();在堆中创建People对象。age属性默认值0,name属性默认值null。wangwu引用变量指向堆中对象的内存地址。
    2. age属性赋值35,name属性直接指向常量池中字符串常量。
    3. 执行sayHi()方法创建sayHi方法栈帧,输出“Hi”。

成员变量默认值

再总结下成员变量的默认值:

  1. 引用变量默认值:null
  2. 整数型(byte,short,int,long)默认值:0
  3. 浮点型(float, double)默认值:0.0
  4. 布尔型(boolean)默认值:false
  5. 字符型(char)默认值:\u0000(\u表示Unicode编码,一个空格)
坚持分享,您的支持将鼓励我继续努力!