`

Java堆、栈和常量池

 
阅读更多

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

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

  3. 堆:存放所有new出来的对象。

  4. 静态域:存放静态成员(static定义的)

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

  6. 非RAM存储:硬盘等永久存储空间

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

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

  如以下代码:

  Java代码

  String s1 = "china";

  String s2 = "china";

  String s3 = "china";

  String ss1 = new String("china");

  String ss2 = new String("china");

  String ss3 = new String("china");

  Java堆、栈和常量池 - jontan0121 - Dream In The Forest500)this.width=500;">

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

  如以下代码:

  Java代码

  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;

  Java堆、栈和常量池 - jontan0121 - Dream In The Forest500)this.width=500;">

  对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化。

形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。

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

  如以下代码:

  Java代码

  class BirthDate {

  private int day;

  private int month;

  private int year;

  public BirthDate(int d, int m, int y) {

  day = d;

  month = m;

  year = y;

  }

  省略get,set方法………

  }

  public class Test{

  public static void main(String args[]){

  int date = 9;

  Test test = new Test();

  test.change(date);

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

  }

  public void change1(int i){

  i = 1234;

  }

  Java堆、栈和常量池 - jontan0121 - Dream In The Forest500)this.width=500;">

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

  1. main方法开始执行:int date = 9;

  date局部变量,基础类型,引用和值都存在栈中。

  2. Test test = new 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()将等待垃圾回收。

分享到:
评论

相关推荐

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

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

    java堆、栈和常量池

    java堆、栈和常量池

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

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

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

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

    Java堆、栈和常量池详解

    易混点完美解析

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

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

    Java堆,栈和常量池详解

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

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

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

    java堆栈常量池笔记

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

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

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

    java内存分配机制详解

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

    java虚拟机规范(java SE7)

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

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

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

    JAVA内存分配精讲.docx

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

    Java常见面试问题整理.docx

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

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

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

    APP界面帧率测试结果

    寄存器(Registers):速度最快的存储场所,...常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和floating point常量)和对其他类型,字段和方法的符号引用。 非RAM存储:硬盘等永久存储空间

    JVM教程吐血整理干货.md

    JVM JVM运行时内存分区 程序计数器 程序计数器的特点 Java虚拟机栈 栈帧 局部变量表 操作数栈 ...(永久代和元空间都是方法区的实现),字符串常量池也移动到了heap空间 jdk8之后的jvm内存分区 程

Global site tag (gtag.js) - Google Analytics