写在前面的话
Java中的不同数据存储在不同的存储区中,今天是将Java的面向对象,所以只介绍和其相关的三种内存区:栈、堆、方法区。
栈
栈特点
栈的特点的先进后出,响应速度特别快。
存储速度快的原因:
栈内存, 通过 ‘栈指针’ 来创建空间与释放空间 !
指针向下移动, 会创建新的内存, 向上移动, 会释放这些内存 !以此实现先进后出
这种方式速度特别快 , 仅次于PC寄存器 !
值得注意的是,这种移动的方式, 必须要明确移动的大小与范围 ,明确大小与范围是为了方便指针的移动 , 这是一个对于数据存储的限制, 存储的数据大小是固定的 , 影响了程序的灵活性 ~
所以我们把更大部分的数据 存储到了堆内存中。
栈存储
在面向对象中,栈存储的是基本数据类型的数据,以及引用数据类型的引用!
例如:
int a =10;
Person p = new Person(); 存储了p的地址。
栈存储数据类型的引用,就是存储了该数据类型的起始地址,而该数据类型真正这存储在其他存储区中。并通过先进后出的特点来实现对数据的调用顺序。
堆
存放的是类的对象。
Java是一个纯面向对象语言, 限制了对象的创建方式。所以所有类的对象都是通过new关键字创建。new关键字, 是指告诉JVM , 需要明确的去创建一个新的对象 , 去开辟一块新的堆内存空间:
堆内存与栈内存不同, 优点在于我们创建对象时 , 不必关注堆内存中需要开辟多少存储空间 , 也不需要关注内存占用时长 !
堆内存中内存的释放是由GC(垃圾回收器)完成的。垃圾回收器回收堆内存的规则:
当栈内存没有对象名称指向该内存时,就会自动垃圾回收器回收 !
方法区
存放的是
-
类信息,就是class文件。
-
静态的变量
-
常量
-
成员方法
方法区中包含了一个特殊的区域 ( 常量池 )(存储的是使用static修饰的成员)