`
tooby
  • 浏览: 110711 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java中的堆、栈和常量池

阅读更多

说到java中堆、栈和常量池,首先还是看看他们各自存放的数据类型吧!

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

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

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

   举个例子吧!

   String str1="abc";

   String str2="abc";

   String str3="abc";

   String str4=new String("abc");

   String str5=new String("abc");java中的堆、栈和常量池
对于浅蓝色箭头,通过new操作产生一个字符串(“abc”)时,会先去常量池中查找是否有“abc”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此“abc”对象的拷贝对象,所以,对于String str=new String("abc"),如果常量池中原来没有"abc"则产生两个对象,否则产生一个对象。

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

   java中的堆、栈和常量池

java中的堆、栈和常量池
      对于成员变量和局部变量来说,成员变量是方法外部,类得内部定义的变量。局部变量就是方法或语句块内部定义的变量,注意,局部变量必须初始化。

     局部变量(形式参数)的数据存于栈内存中,并且它(局部变量)随方法的消失而消失。

    

 

分享到:
评论

相关推荐

    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内存分配机制详解

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

    JAVA内存分配精讲.docx

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

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

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

    java虚拟机规范(java SE7)

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

    APP界面帧率测试结果

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

    Java常见面试问题整理.docx

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

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

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

Global site tag (gtag.js) - Google Analytics