首页 > 技术文章 > Java中的栈内存和堆内存

gaoyang2018 2018-02-26 08:54 原文

  Java把内存分成两种,一种叫栈(Stack)内存,一种叫堆(Head)内存

       每一种程序都有一个JVM栈内存为之服务,栈内存的生命周期与程序相通。程序中的每个方法 被执行时都会创建一个栈帧用来存储该方法的局部变量等信息。局部变量包括各种基本类型的变量和数据/对象的引用变量。当在方法的一段代码块中定义上述的这些变量时,Java就在栈中为它们分配内存空间,当离开变量的作用域后,Java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

  堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收机制来管理。在堆中创建的数组或者对象,通常由栈中定义一个特殊的变量指向,这个变量的取值等于数组或对象在堆内存中的首地址,在栈中的这个特殊的变量就是数组或者对象的引用变量。引用变量是普通变量,存在于栈内存中,引用变量在程序运行到作用域外时释放。

  数组和对象存在于堆内存中,即使程序运行到创建数组和对象的语句所在的代码块之外,数组和对象本身占用的堆内存也不会释放,以便重复利用(因为创建的成本通常比较大)。只有数组和对象已经没有引用变量指向、变成垃圾、不能再被使用时,其是所占的堆内存空间才会在随后的一个不确定的时间呗Java的垃圾回收器释放。作为垃圾被回收之前,数组和对象依然存在于堆内存中。

 

推荐阅读