java之变量以及对象的存储位置区别
来源:互联网 发布:西岐网络 编辑:程序博客网 时间:2024/05/29 07:34
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存储用于存放持久化对象
下面来看个例子:
public class Student {/** * @author 行者摩罗 * @博客链接 http://blog.csdn.net/xingzhemoluo */private int id;private String name;private int age;//get,set方法省略public Student(int i,String n,int a) {this.id = i;this.name = n;this.age = a;}}
public class Test {public void update (int x) {x = 100;}public static void main(String[] args) {int score = 99;Test test = new Test();test.update(score);Student student = new Student(1,"行者摩罗",23);}}在这段代码中,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
声明:
1.原创内容,转载请注明原文链接
2.摩罗不写博客,所有内容只是摩罗笔记,如有错误或者您有更好的意见,欢迎指正。
欢迎关注行者摩罗微信公众号(xingzhemoluo),共同交流编程经验,扫描下方二维码即可;
- java之变量以及对象的存储位置区别
- java之变量以及对象的存储位置区别
- java变量、对象的存储位置
- java中变量、对象的存储位置
- java中变量、对象的存储位置
- java 中变量存储位置的区别
- java 中变量存储位置的区别
- java 当中变量存储位置的区别
- java 中变量存储位置的区别
- java 中变量存储位置的区别
- java 中变量存储位置的区别
- java 中变量存储位置的区别
- Java中变量存储位置的区别
- java 中变量存储位置的区别
- java 中变量存储位置的区别
- java 中变量存储位置的区别 .
- java 当中变量存储位置的区别
- java 中变量存储位置的区别
- Cocos2d-x V3.0 Sprite 和 SpriteBatchNode
- 推荐:《嵌入式系统开发之道:菜鸟成长日志与项目经理的私房菜》
- 设计简单的计算器-浙大2006年机试,参考王道机试指南
- HDU1097
- Codeforces Round #272 (Div. 2)AK报告
- java之变量以及对象的存储位置区别
- leetcode Binary Tree Maximum Path Sum 迭代算法
- Mac/Linux/Windows通过命令调用浏览器打开某网页
- 1410121949-hd-1sting
- 第7周项目--求两数的差值
- Max Points on a line ,在二维平面寻找共线的最多点
- 2035 人见人爱A^B
- 双系统启动引导项配置
- jquery——zTree, 完美好用的树插件