您的位置:首页 > 编程语言 > Java开发

java堆栈,常量池的浅析

2016-09-14 13:26 260 查看
java中有6大存储数据的地方:寄存器、堆、栈、常量池、静态存储、固态存储。

其中寄存器是存在计算机cpu里面,处理速度最快,但是由于寄存器存储空间很有限,只能CPU进行控制存储,jvm是没有权限去存储数据在寄存器中的

栈是位于ram中的,一般用于存储基本类型的变量以及对象的引用,由于栈的里的变量是加载类的时候就放进了栈中,所以存取要比堆快,但是栈里面的存储的数据生命周期是知道的,局部变量等所在的方法不在使用就清空了,全局变量等所在的对象不在使用了就清空了。

堆也是位于ram中的,堆的存储是动态的,java中当new一个对象的时候就从堆里面分配一个内存空间用于存储对象的内容,然后把对象引用放在栈中,引用指向堆中的对象。堆中的数据的生命周期是不确定的,其中的对象由java的垃圾回收机制进行回收

当讨论常量池的时候我们需要讨论一个特殊的对象String str="你好",当我们新建一个str字符串的时候,str作为一个引用是存在栈中的,而“你好”的存储这时候需要去常量池找“你好”,如果没有找到就开辟一个内容为“你好”的存储空间,如果有str就直接指向这个存储空间,而String
str=new String("你好"),这个就跟上面那个有区别了,首先一样的str引用是存储在栈中,然后再去常量池中找内容是“你好”的存储内存,如果存在就直接指向,不存在就再新建一个,不要以为这时候就结束了,因为new了一个对象,所以它还要在堆中存储一个内容为“你好”的对象,所以String str=new String("你好")的时候可能创建了两个对象也可能创建了一个对象。常量池还可以放置final变量。常量池也是在ram中的。

静态存储是在rom中的,静态存储里存放程序运行时一直存在的数据例如static
final int i=1

固态存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。一般存在电脑硬盘上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java