Java 进阶 (一) 内存解析
一、前言
栈、堆、常量池等虽同属 Java 内存分配时操作的区域,但其适用范围和功用却大不相同。本文将深入 Java 核心,简单讲解 Java 内存分配方面的知识。
首先我们先来讲解一下内存中的各个区域。
二、stack(栈)
存放基本类型的数据和对象的引用,即存放变量。
如果存放的是基本类型数据(非静态变量),则直接将变量名和值存入 stack 中的内存中;
如果是引用类型,则将变量名存入栈,然后指向它 new 出的对象(存放在堆中)。
三、heap(堆)
存放 new 产生的数据。
四、data segment
分为静态域和常量域。
五、静态域
存放在对象中用 static 定义的静态成员(即静态变量,同理,如果该静态变量是基本类型则将变量名和值存入静态域,如果是引用类型则指向 new 出的对象)。
六、常量池
常量池指的是在编译期被确定,并被保存在已编译的.class 文件中的一些数据。除了包含代码中所定义的各种基本类型(如 int、long 等)和对象型(如 String 及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如:类和接口的全限定名;字段的名称和描述符;方法和名称和描述符。
code segment:存放代码。
下面我来举几个简单的小例子来让大家认识一下这几个区域具体存放的内容:
注:例 1 和例 2 中大家要注意 String 类型不是基本数据类型,所以它可以创建对象,并且它的值是放在常量池中的。
七、示例
7.1 例 1. 非静态和静态变量的创建
String str = "abc"; static Int a = 10; //创建 String 类型的变量 str;创建 Int 类型变量 a
内存解析:
这里的 str 是非静态变量所以将其放入到栈中,而静态变量 a 则需要放入静态域中,对于变量值"abc"和 10 则都应该放入到常量池当中
7.2 例 2. 对象的创建
String str=new String("abc"); //创建 String 类型的对象 str
内存解析:
这里的 str 是 String 类型的对象,所以放入栈中,而 new 出来的东西则放入到堆中,对于初始值"abc"则放入到常量池中即可。
7.3 例 3. 数组的创建
Int s[] = new Int[3];s[0]=3;s[1]=2;s[2]=3;
内存解析:
这里的 s[]是一个数组变量,所以放入到栈中,new 出来的东西还是放入到堆中,最后的每个元素的值则放入到常量池当中。
版权声明: 本文为 InfoQ 作者【No Silver Bullet】的原创文章。
原文链接:【http://xie.infoq.cn/article/f67dd87c520453629a6fb5c90】。文章转载请联系作者。
评论