简单理解Java堆栈

来源:互联网 发布:制作视频mp4软件 编辑:程序博客网 时间:2024/05/22 13:21

       Java中把变量内存区域划分成两种:一种是栈内存,一种是堆内存。

       一些基本类型的变量数据和对象的引用变量都在栈内存中分配。当定义一个变量时,在栈中会为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。每一个线程包含一个栈区,每个栈中的数据(原始类型和对象引用都是私有的,其他栈不能访问。

       由new关键字创建的对象和数组,在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能再被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器回收释放掉。这也是java比较占内存的原因。实际上,栈中的变量指向堆内存中的变量,可认为是java中的指针。需要注意的是jvm只有一个堆区(heap)被所有线程共享。

原创粉丝点击