内存
内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。Java虚拟机(JVM)要运行程序,必须要对内存进行空间的分配和管理。
Java虚拟机的内存划分
为了提高运算效率,Java虚拟机(JVM)就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
具体划分如下:
①寄存器:这是最快的保存区域,是处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹。
②栈:仅次于寄存器。存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中(new 出来的对象)。当在一段代码块定义一个变量时,Java就在栈中 为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。
③ 堆:存放用new产生的数据。编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。在堆里分配存储空间时会花掉更长的时间。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
④
举几个例子:
对象的内存
public class Test02Phone {
public static void main(String[] args) {
//创建对象
Phone p = new Phone();
//输出成员变量值
System.out.println("品牌:"+p.brand);//null
System.out.println("价格:"+p.price);//0
System.out.println("颜色:"+p.color);//null
System.out.println("‐‐‐‐‐‐‐‐‐‐‐‐");
//给成员变量赋值
p.brand = "锤子";
p.price = 2999;
p.color = "棕色";
//再次输出成员变量值
System.out.println("品牌:"+p.brand);//锤子
System.out.println("价格:"+p.price);//2999
System.out.println("颜色:"+p.color);//棕色
System.out.println("‐‐‐‐‐‐‐‐‐‐‐‐"); //调用成员方法
p.call("紫霞");
p.sendMessage(); } }
通过上图,我们可以理解,在栈内存中运行的方法,遵循"先进后出,后进先出"的原则。变量p指向堆内存中 的空间,寻找方法信息,去执行该方法。
数组
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr);//[I@5f150435
}
在网上找到的一篇不错的相关文章:https://www.cnblogs.com/protected/p/6419217.html