Java虚拟机的内存大致可以分为三个区域:栈stack、堆heap、方法区method area。
栈的特点如下:
1. 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
2. JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
3. 栈属于线程私有,不能实现线程间的共享!
4. 栈的存储特性是“先进后出,后进先出”
5. 栈是由系统自动分配,速度快!栈是一个连续的内存空间!
堆的特点如下:
1. 堆用于存储创建好的对象和数组(数组也是对象)
2. JVM只有一个堆,被所有线程共享
3. 堆是一个不连续的内存空间,分配灵活,速度慢!
每执行一次New之后,在堆里面就会建立一个对象。
方法区(又叫静态区)特点如下:
1. JVM只有一个方法区,被所有线程共享!
2. 方法区实际也是堆,只是用于存储类、常量相关的信息!
3. 用来存放程序中永远是不变或唯一的内容。(类信息【Class对象】、静态变量、字符串常量等)
对这个程序执行过程进行内存分析:
class Computer {
String brand; //品牌
}
public class SxtStu {
// field
int id;
String sname;
int age;
Computer comp;
void study() {
System.out.println("我正在学习!使用我们的电脑,"+comp.brand);
}
SxtStu() {
}
public static void main(String[] args) { //在栈中创建栈帧
SxtStu stu1 = new SxtStu();
stu1.sname = "李四";
Computer comp1 = new Computer();
comp1.brand = "苹果";
stu1.comp = comp1;
stu1.study();
}
}
例1:
String str1 = “abc”,“abc”分配在内存哪个区域?
解析:用new创建的对象在堆区 函数中的临时变量在栈去 java中的字符串在字符串常量区 静态域:存放在对象中用static定义的静态成员
答案:字符串常量区
例2:
下列Java代码中的变量a、b、c分别在内存的____存储区存放。
class A {
private String a = “aa”;
public boolean methodB() {
String b = “bb”;
final String c = “cc”;
}
}
a是类中的成员变量,存放在堆区,线程共享
b、c都是方法中的局部变量,存放在栈区
几篇很好的面向对象内存分析的文章: