堆栈内存基础分析
在 Java 中java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area。Java中将数组元素实例化对象信息等都存储在堆内存中,再通过堆栈空间的内存地址来进行访问和数据的读取。
栈的特点如下:
1.栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
2.JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
3.栈属于线程私有,不能实现线程间的共享
4.栈的储存特性是“先进后出,后进先出”
5.栈是有系统自动分配,速度快!栈是一个连续的内存空间!
堆得特点如下:
1.堆用于储存创建好的对象和数组(数组也是对象)
2.JVM只有一个堆,被所有线程共享
3.栈是一个不连续的内存空间,分配灵活,速度慢
方法区(又叫静态区)特点如下:
1.JVM只有一个方法区被所有线程共享
2.方法区实际也是堆,只是用来储存类、常量相关的信息!
3.用来存放永远不变或者唯一的内容,(类信息(class对象)、静态常量、字符串常量等)
实例讲解
class Demo{
String NAMEString;
int AGE;
public void tellDemo() {
System.out.println("姓名:"+NAMEString+",年齡:"+AGE);
}
}
public class MemoryAnalysis {
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo demo = new Demo();
demo.NAMEString = "join";
demo.AGE = 22;
demo.tellDemo();
}
}
在这里,new现在堆内存中开辟出一个空间,所以说在程序中的内存空间都是通过new来完成的。而堆内存中存储的是什么呢?Demo()定义堆空间中的内容。
Demo demo = new Demo();
首先我们要确定的是堆栈内容。堆内存中保存的是堆象的基本信息,栈内存中保存的是堆内存的地址,通过地址找到堆内存,再找到对象内容。简单来说的话,也就是对象名称保存在了栈内存中
demo.NAMEString = "join";
demo.AGE = 22;
当读取信息的时候就是栈里面找到堆内存的地址,然后根据堆内存的地址到堆内存中找对象内容,在对其进行读取。