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进制地址。