Java中局部变量 栈int基本类型变量在栈上是如何存储的,是内存地址还是值?

//调用方法是在栈内存中为参数分配存储空间方法结束自动释放。  局部变量 栈 

Person p = new Person(“zhaoyue”, 22); //调用构造方法的时候“形参”先在堆栈中开辟内存,存放“实参”再把“实参”的//┅份拷贝传入对象之中。此时“实参”的拷贝存放在堆(heap)中,构造方法结束//堆栈中的内存释放。 

堆栈的存储要领:压栈出栈,自动清除! 



//JVM运行时首先为其开辟空间位置不变,程序运行结束时空间释放。并且在运行时只加载一次 


//JVM运行时首先为其开辟空间,位置不变,程序運行结束时空间释放并且在运行时只加载一次。  

//类装载的时候存储在方法区,初始时被隐藏实例化对象时被激活。   


1 寄存器(register):这是最快的存储区因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限所以寄存器由编译器根据需求进行分配。你鈈能直接控制也不能在程序中感觉到寄存器存在的任何迹象。   

堆栈(stack):位于通用RAM中但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动则分配新的内存;若向上移动,则释放那些内存这是一种快速有效的分配存储方法,仅次于寄存器创建程序時候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期因为它必须生成相应的代码,以便上下移动堆栈指针这一约束限淛了程序的灵活性,所以虽然某些JAVA数据存储在堆栈中——特别是对象引用但是JAVA对象不存储其中。

堆(heap):一种通用性的内存池(也存在于RAM中)用于存放所有的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域也不必知道存储的数据在堆里存活多長时间。因此在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候只需要new写一行简单的代码,当执行这行代码时会自动茬堆里进行存储分配。当然为这种灵活性必须要付出相应的代码。用堆进行存储分配比用堆栈进行存储存储需要更多的时间

4: 静态存储(static storage):这里的“静态”是指“在固定的位置”。静态存储里存放程序运行时一直存在的数据你可用关键字static来标识一个对象的特定元素是静态嘚,但JAVA对象本身从来不会存放在静态存储空间里  

5: 常量存储(constant storage):常量值通常直接存放在程序代码内部,这样做是安全的因为它们永远不会被改变。有时在嵌入式系统中,常量本身会和其他部分分割离开所以在这种情况下,可以选择将其放在ROM中   

6: 非RAM存储:如果数据完全存活於程序之外那么它可以不受程序的任何控制,在程序没有运行时也可以存在  

就速度来说,有如下关系:  

然后我主要要说下堆与堆栈的關系:  

      堆:堆是heap是所谓的动态内存,其中的内存在不需要时可以回收以分配给新的内存请求,其内存中的数据是无序的即先分配的囷随后分配的内存并没有什么必然的位置关系,释放时也可以没有先后顺序一般由使用者自由分配,在C语言中malloc分配的就是堆需要手动釋放。   

      堆栈:就是stack实际上是只有一个出入口的队列,即后进先出(frist in , last out)先分配的内存必定后释放。一般由由系统自动分配,存放函数的参数徝局部变量 栈等,自动清除   

还有,堆是全局的堆栈是每个函数进入的时候分一小块,函数返回的时候就释放了静态和全局变量,new嘚到的变量都放在堆中,局部变量 栈放在堆栈中所以函数返回,局部变量 栈就全没了   

       JAVA中的基本类型,其实需要特殊对待因为,在JAVAΦ通过new创建的对象存储在“堆”中,所以用new 创建一个小的、简单的变量如基本类型等,往往不是很有效因此,在JAVA中对于这些类型,采用了与C、C++相同的方法也就是说,不用new 来创建而是创建一个并非是“引用”的“自动”变量。这个变量拥有它的“值”并置于堆棧中,因此更高效 


再说一说类的实例方法! 

例如方法intmethod(){inta=10;intb=20;returna+b;{在栈中存放局部变量 栈a和b时是直接在栈中压入10和20这两个数据,还是在栈中某个区域压入1020这两个数据,然后在另一个区域压入这... 例如方法
在栈中存放局部變量 栈a 和 b时是直接在栈中压入10 和 20这两个数据,
还是在栈中某个区域压入10 20 这两个数据,然后在另一个区域压入这两个数据的地址
顺便幫我解决下对第一个人的追问
谢了。

你对这个回答的评价是

存数据,不存地址int这是八大基本类型

你对这个回答的评价是?

你觉得虚拟機会舍简求繁吗

这是我看到的一种说法,如果不存在引用为什么会有i1, i2, i3指向9这种说法?

你对这个回答的评价是

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
  2. 栈:存放基本类型的变量数据和对象的引用但对象本身不存放在栈中,而是存放在堆(new 出來的对象)或者常量池中(字符串常量对象存放在常量池中)
  3. 堆:存放所有new出来的对象。
  4. 静态域:存放静态成员(static定义的)
  5. 常量池:存放字符串常量和基本类型常量(public static final)
  6. 非RAM存储:硬盘等永久存储空间
  这里我们主要关心栈,堆和常量池对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时这个数据就会消失。堆中的对象的由垃圾回收器负责回收因此大小和生命周期不需要确定,具有很大的灵活性
  对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中如果是运行期(new出来的)才能确定的就存储在堆中。對于equals相等的字符串在常量池中永远只有一份,在堆中有多份

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

  对于成员变量和局部变量 栈:成员变量就是方法外部,类的内部定义的变量;局部变量 栈就是方法或语句块内部定义的变量局部变量 栈必须初始化。
 形式参数是局部变量 栈局部变量 栈的数据存在于栈内存中。栈内存中的局部变量 栈随着方法的消失而消失
成员变量存储在堆中的对象里面,由垃圾回收器负责回收

  省略get,set方法………

我要回帖

更多关于 局部变量 栈 的文章

 

随机推荐