Java的内存分配

来源:互联网 发布:vr制作软件 编辑:程序博客网 时间:2024/06/05 02:55

初学Java语言的人总是声称Java中没有指针。每次听到这种说法,我都是不做过多争辩。Java语言只是表面上没有了C/C++中的指针符号“*”。而其这种机制依然是存在的,只是换了个表现形式而已。其目的都是为了操作内存。还有些人经常说Java语言多么优秀,程序员不用关心底层的内存云云……。我们的语言还没有到那种程度,只是对于内存等细节的处理比以前更优秀了而已。下面整理了Java中内存的分配问题。

(1)寄存器。特点:快,处理器内部。程序中控制不到。可以忽略。

(2)栈空间。大家最熟悉。通常的局部变量都存储在这里。注意这些局部变量包括基本类型的数据以及引用!而真正的Java对象是不存在于其中的。

(3)堆空间。 用于存放所有的Java对象。都是被new出来的。但是指向这个对象的引用却是存储在栈空间的。如果出现堆中的某个对象没有被哪个引用指向的话,那么这个对象所占空间将会被垃圾收集器回收销毁。

(5)常量存储区。例如常量字符串等等。

例子1:

String a = new String("1234");//a是一个引用,存储在栈空间。 String对象"1234"存储在堆空间,因为他是被new出来的。String b = new String("1234");//同上。if(a == b){ //a指向的内存空间和b指向的内存空间虽然都在堆空间, 但不是同一块内存地址。所以肯定不相等了。System.out.println("YES");  //当真正要比较这两个字符串对象是否相等,就要用到equals方法了。刚好String对象实现了这个方法。}

例子2:

String a = "1234";//a是引用,栈空间。但他这次指向的是常量区,而不是堆空间。String b = "1234";//b是引用,栈空间。他也是指向常量区。由于"1234"字符串常量已经在常量区存在了。所以a,b指向的都是常量区的同一块内存。if(a == b){System.out.println("YES");}

 

理解浅显,错误难免,大家交流下。