java中栈和堆内存的区别

来源:互联网 发布:jquery ajax传递json 编辑:程序博客网 时间:2024/06/11 17:23
Java把内存划分成两种:一种是栈内存,一种是堆内存。堆是用来存放对象的,栈是用来运行程序的。<strong>一、栈</strong>
1、在函数中定义的一些<strong>基本类型的变量</strong>和<strong>对象的引用变量</strong>都在函数的栈内存中分配。例如:
<span style="white-space: pre; "></span> String str = new String("test");
<span style="white-space: pre; "></span>这条语句,它的执行过程是先在堆上new 了一个值为"test"的String对象,然后栈上又新建一个str来指向上面新建的"test"对象,即str是"test"的引用。所以Java中对象的新建都是在堆上进行的,对象的引用一般都是在栈上。一般每个方法的调用都会独立有一个栈来保存str这样的对象的引用变量,在方法返回后,栈会清空,所以引用变量会被清空掉,这是堆上的对象,如果没有其他的引用变量引用它,就会被Gc在某个合适的时候gc掉
2、当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。<strong>二、堆</strong>
堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
<strong></strong>
<strong>三,在执行效率上</strong>
<span style="color: rgb(51, 51, 51); font-family: arial, 'courier new', courier, 宋体, monospace; line-height: 24px; ">堆的优势是可以自动分配内存的大</span><span style="font-family: simsun; color: rgb(50, 62, 50); "><span style="line-height: 19px; ">小,生存期也不用实告诉编辑器,java的垃圾回收器会自动的回收这些不用的数据。缺点是由于要动态的分配内存,存储效率会比较的慢。</span></span>
<span style="font-family: simsun; "><span style="line-height: 19px; "><span style="color: rgb(50, 62, 50); ">栈的优势是存取效率比较快,仅次于寄存器,</span><strong><span style="color: rgb(255, 0, 0); ">栈数据可以共享</span></strong><span style="color: rgb(50, 62, 50); ">。但缺点是栈中的数据大小和生存期的固定的,缺乏灵活性。</span></span></span>
<span style="font-family: simsun; color: rgb(50, 62, 50); "><span style="line-height: 19px; ">栈中主要存储些基本的数据像int、short、byte等。栈的存储比较快,但是删除就不是那么好了。</span></span>

0 0
原创粉丝点击