java之变量以及对象的存储位置区别

  Java内存分配的时候一共涉及5个区域,分别是;寄存器、栈、堆、常量池、非RAM存储。

寄存器

        寄存器是最快的存储区,位于处理器内部,由于寄存器的数量非常有限,所以寄存器都是按需分配,我们在程序中无法控制。

        栈位于通用RAM(随机访问存储器)中,栈由编译器自动分配和释放,栈存放的是基本数据类型(基本数据类型包括:int、short、double、long、float、boolean、char、byte;注意没有String)以及对象的引用。栈的优势是存取速度比堆快,仅次于CPU中的寄存器。另外,栈还有一个很大的特点就是栈中的数据可以共享,比如定义两个int类型的变量:int a = 3; int b = 3;这里a和b是一个指向int型的引用,指向"3"这个字面值。编译器先处理int a = 3;这句语句的时候,先在栈中创建一个变量为a的引用,然后查找有没字面值为3的地址,如果没有就开辟出一个存储3的地址,然后将a指向这个3对应的地址。接着处理int b = 3;,也是先创建一个变量b的引用,由于栈中已经有字面量3了,于是就把b也指向3对应的这个地址,所以a和b都指向了一个地址。当我们执行 b = 4;的时候,首先还是去栈中查找有没字面量值为4对应的地址,如果没有就开辟个,然后将b指向这个新开辟的地址。如果已经有了就直接将b指向这个地址,此时a还是指向3,但b指向4了,而且他俩不再指向同一个地址了。实际上形参,局部变量都存储在栈中。

         堆是一种通用的内存池,也位于RAM中,堆用于存储所有的java对象。

常量池

        常量池用于存放常量

非RAM存储

        非RAM存储用于存放持久化对象

         

          下面来看个例子:

[java]  view plain  copy
 print ?
  1. public class Student {  
  2.     /** 
  3.      * @author 行者摩罗 
  4.      * @博客链接 http://blog.csdn.net/xingzhemoluo 
  5.      */  
  6.     private int id;  
  7.     private String name;  
  8.     private int age;  
  9.     //get,set方法省略  
  10.     public Student(int i,String n,int a) {  
  11.         this.id = i;  
  12.         this.name = n;  
  13.         this.age = a;  
  14.     }  
  15. }  
[java]  view plain  copy
 print ?
  1. public class Test {  
  2.     public void update (int x) {  
  3.         x = 100;  
  4.     }  
  5.   
  6.     public static void main(String[] args) {  
  7.         int score = 99;  
  8.         Test test = new Test();  
  9.         test.update(score);  
  10.         Student student = new Student(1,"行者摩罗",23);  
  11.     }  
  12. }  
         在这段代码中,score是局部变量,i、n、a、x都是形参,形参也属于局部变量,id、name、age为成员变量。当从main方法开始运行的时候,

①int score = 99;                      score是局部变量,引用(score)和值(99)都存储在栈中。
②Test test = new  Test();      test是个引用,存放于栈中,new Test()创建出来的对象存在于堆中。

③test.update(score);             update()方法里的形参x是局部变量,引用和值都存在于栈中,当update方法执行完毕以后,x会自动从栈中消失。

④Student student = new Student(1,"行者摩罗",23);               student为引用,存放于栈中,new Student(1,"行者摩罗",23)创建出来的对象存在于堆中。其中i、n、a为形参,存在于栈中,name,id,age为成员变量,他们对应的值存储于堆中(在new Student()里面)。当Student构造方法执行完毕以后,i、n、a会自动从栈中消失。

⑤main方法执行完毕以后,score、test、student都会自动从栈中消失,new Test()以及new Student(1,"行者摩罗",23)则由垃圾回收期来回收。


参考资料:http://blog.csdn.NET/rj042/article/details/6871030

http://blog.csdn.net/cuixianpeng/article/details/6892043

猜你喜欢

转载自blog.csdn.net/Fire_kr/article/details/77718424