`
mywhy
  • 浏览: 63419 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

详细介绍Java中的堆、栈和常量池

阅读更多
下面主要介绍JAVA中的堆、栈和常量池:


1.寄存器


最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制。


2. 栈


存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)


3. 堆


存放所有new出来的对象。


4. 静态域


存放静态成员(static定义的)


5. 常量池


存放字符串常量和基本类型常量(public static final)。


6. 非RAM存储


硬盘等永久存储空间


这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。


对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。


如以下代码:
String s1 = "china"; String s2 = "china"; String s3 = "china"; String ss1 = new String("china"); String ss2 = new String("china"); String ss3 = new String("china");


对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。


如以下代码:
int i1 = 9; int i2 = 9; int i3 = 9; public static final int INT1 = 9; public static final int INT2 = 9; public static final int INT3 = 9;


对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化。形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。


成员变量存储在堆中的对象里面,由垃圾回收器负责回收。


如以下代码:
class BirthDate { privateint day; privateint month; privateint year; public BirthDate(int d, int m, int y) { day = d; month = m; year = y; } 省略get,set方法…… } publicclass Test{ publicstaticvoid main(String args[]){ int date = 9; Test test = new Test(); test.change(date); BirthDate d1= new BirthDate(7,7,1970); } publicvoid change1(int i){ i = 1234;


对于以上这段代码,date为局部变量,i,d,m,y都是形参为局部变量,day,month,year为成员变量。下面分析一下代码执行时候的变化:


1. main方法开始执行:
int date = 9;
date局部变量,基础类型,引用和值都存在栈中。


2. test为对象引用,存在栈中,对象(new Test())存在堆中。
Test test = new Test();


3.test.change(date);
i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。


4.BirthDate d1= new BirthDate(7,7,1970);


d1为对象引用,存在栈中,对象(new BirthDate())存在堆中,其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中。day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。


5.main方法执行完之后,date变量,test,d1引用将从栈中消失,new Test(),new BirthDate()将等待垃圾回收。


希望通过以上内容的介绍,能够给你带来帮助。
转载:http://news.newhua.com/news/2011/0802/128795.shtml
分享到:
评论

相关推荐

    Java堆、栈和常量池——内存剖析

    Java堆、栈和常量池——内存剖析

    java堆、栈和常量池

    java堆、栈和常量池

    java 内存中 堆、栈、常量池、方法区的总结

    详细的总结了java中在内存中创建的堆、栈、方法区、常量池的区别和用途

    java内存分配之常量池,栈,堆1

    Java内存分配之堆、栈和常量池 Java内存分配主要包括以下几个区域:1. 寄存器:我们在程序中无法控制2. 栈:存放基本类型的数据和对象的引用,但对象本身不

    Java堆、栈和常量池详解

    易混点完美解析

    Java中的堆、栈和常量池_.docx

    Java中的堆、栈和常量池_.docx

    Java堆,栈和常量池详解

    很好的解释了Java中内存的分配,使用,和回收的一些过程,让我们在理解和开发是能够的心应手。

    Java堆、栈和常量池

    2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中.) 3. 堆:存放所有new出来的对象. 4. 静态域:存放静态成员...

    java堆-栈-堆栈常量池的区别,史上最全总结

    java堆-栈-堆栈常量池的区别,史上最全总结

    java堆栈常量池笔记

    清楚的介绍了java中基本数据类型和引用数据类型在内存中的分配

    深入Java核心 Java内存分配原理精讲

     ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中  ◆堆:存放用new产生的数据  ◆静态域:存放在对象中用static定义的静态成员  ◆常量池:存放常量  ◆非RAM存储:...

    JAVA内存分配精讲.docx

    Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到...

    java内存分配机制详解

    文档中介绍了: 寄存器 栈 堆 静态域 常量池 帮助java学习者从本质上理解java的运行机制。

    Java内存分配分析/栈内存、堆内存

    首先学习JVM相关需要需要内存的组成。  基本内容  · 堆  java动态创建对象,即对于new的一个...  首先明确的是:常量池存在于堆中。  即JVM为每个已加载的类型开辟一块区域,包括基本类型和String类型(其

    java虚拟机规范(java SE7)

    第二章:java虚拟结构(运行时区域内存:寄存器,java虚拟机栈,java堆,方法去,运行时常量池,本地方法栈); 第三章:为java虚拟机编译; 第四章:Class文件格式; 第五章:加载、链接与初始化

    Java常见面试问题整理.docx

    运行时常量池是方法区的一部分,class文件除了有类的字段、接口、方法等描述信息之外,还有常量池用于存放编译期间生成的各种字面量和符号引用。在老版jdk,方法区也被称为永久代。在1.8之后,由于永久代内存经常...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

     本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行引擎等;第5-20章深入描述了java技术的内部细节,包括垃圾收集、java安全模型、java的连接模型和动态扩展机制、class文件、运算及...

    APP界面帧率测试结果

    栈(Stack):存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆(Heap):堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器(GC)来管理。 静态...

Global site tag (gtag.js) - Google Analytics