java中堆和栈区别

Java 把内存划分成两种:一种是栈内存,另一种是堆内存。

在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。

  • 栈内存中存放所有在方法中定义的局部变量、基本数据类型线程不共享。

栈存取速度比堆快,仅次于寄存器,栈数据是每个线程独有的,故线程不共享。栈空间不需要在高级语言里面显式的分配和释放。

  • 堆内存存放对象、成员变量(不包括static成员变量!)。线程共享。

堆可以动态分配内存大小,但存取速度较慢。

  • 方法区(静态存储区):用于存放类的基本信息(静态变量和方法信息)。java程序运行时,首先会通过类装载器载入类文件中的字节码信息,经过解析后将其装入方法区。类的各种信息(包括方法)都在方法区存储。线程共享。



局部变量的生命周期:一个运行的java程序从开始到结束会有多次方法的调用。JVM会为每一个方法的调用在栈中分配一个对应的空间,这个空间称为该方法的栈帧。

一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数,局部变量等数据。当某一个方法调用完成后,其对应的栈帧将被清除,局部变量无效。

成员变量的生命周期:当一个对象没有任何引用时,被视为废弃的对象,属于被回收的范围,该对象中的所有成员变量也随之被回收。

   成员变量的生命周期为:从对象在堆中创建开始到对象从堆中被回收结束。


至于进程中的堆区和栈区在内存中的映射,参考http://www.cnblogs.com/liulipeng/archive/2013/09/13/3319675.html

发布了34 篇原创文章 · 获赞 20 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/ChengXuYuanXingCheng/article/details/70767967