Java内存空间划分初识(适合初学者)
前言:在编程中,自己归纳过那些变量会被初始化,可是全靠死记硬背,实际开发中还老犯错。后来在看书中,了解是自己对Java内存空间的认识不足。今天通过看视频,查阅书籍和网上查询,简单归纳了Java内存空间划分,使得自己对Java数据分类和运用有很大的提升。现在分享给大家,希望能有一些帮助和启发。
同其他软件一样,JVM从计算机获取一片内存。
JVM中的内存划分为五个区域,每个区域有着不同的数据处理方式。
分别是:
1、 寄存器。 --给CPU用的地方,一般Java程序员可不做过多学习。
2、 本地方法区。 --与所在系统相关,分不同版本。具体系统可部分学习。
3、 方法区。 --后面JAVA应该深入学习部分,初学者可暂时放一放。
4、 栈内存。 --(下面详讲。)
5、 堆内存。 --(下面详讲。)
一、 栈内存。
1、 存放的是什么?
答:存储的都是局部变量。
(局部变量所属方法也进栈中。局部变量都在方法中,方法不进栈,局部变量就没办法进栈。)
2、 变量所属的作用域一旦结束,该变量就自动释放。
(栈内存更新很快,因为变量的生命周期很短。)
(局部代码块,限定局部变量的生命周期。)
小结:栈内存更新速率很快。
二、 堆内存。
1、 存放的什么?
答:存储是数组和对象(其实数组就是对象)。凡是new建立在堆中。
2、 堆内存的特点:
(1)每一个实体都有首地址值。
(2)堆内存中的每一个变量都有默认初始化值;根据类型的不同而不同。
整数是0,小数是0.0或者0.0f,boolean是false,char是‘\u000’。
(’\u0000’指Unicode下的空格。)
(3)垃圾回收机制。
3、 堆特点的附带说明
(1)实体存在对内存中,有一个内存地址。
(2)堆中如果未赋值会默认初始化,这是堆内存特点,栈内存中变量就不行。
(3)实体首地址值存储在引用数据变量中,引用数据变量根据实体首地址指向实体。
(4)引用数据变量不像基本数据变量,基本数据变量直接把实体存放在变量空间中。
(5)引用数据变量,称为变量A引用了堆中一个实体。(或者指向,这点想C++中指针。)
(6)引用数据变量只能指向实体或null。(null取消指向。Null存放位置是引用变量首地址值所在的位置。)
(7)实体没有引用,就会被视为垃圾,等待回收,不会立即释放。JVM自有一套垃圾回收机制,不定时。所以堆内存的更新速率不是很快。
三、 附带简单说明下实体内存地址。
例如 [I@c17164
1、@左边的”[I“是指实体类型,这里的”[“指数组,”I”指int类型。
2、@右边的”c17164“是Java调用windows,通过hash算法创建的内存地址,绝对不会重复。本身是16进制地址。