Java中堆,栈,堆栈的区别

来源:互联网 发布:mac chrome 导出插件 编辑:程序博客网 时间:2024/06/14 17:13

  今天我们来描述一下Java程序在运行中的堆,栈,堆栈的区别。

  1.堆区

  堆区存放的全部是Java对象,是真正new出来的东西和成员变量,堆中不会存放基本类型的数据和对象引用,只存放对象本身。每个对象都包含一个与之对应的class信息。JVM只有一个堆区,这个堆区被所有的线程共享。这些堆中的对象所占用的内存,由Java虚拟机的自动垃圾回收器来管理。堆的优势是可以动态的分配内存大小,不必在编译器告诉编译器,因为它是在程序运行时动态的分配内存的,Java的垃圾回收器会自动的回收走这些不再使用的数据。但是缺点是,由于要在运行时动态分配内存,所以堆中的对象存取的速率比较慢。

  堆中的对象的创建是在Java程序运行的时候才会创建出来。

  2.栈区

  栈中存放的是局部变量,基础数据类型和对象的引用。且每一个线程都是有一个自身独立的栈区,这个栈区的内容是这个线程私有的,其他的栈是不可以访问的。栈还有一个很特殊的性质就是同一个线程中的栈中的数据可以共享,这个共享和引用对象之间的共享是不同的。栈中的数据共享指的是基本数据类型的值是可以被基础数据类型的应用变量来同时共享的,若是修改了其中一个变量的值,是不会影响到另一个共享变量的。

  栈中的基础数据类型和对象引用是在编译期就完成的。

  栈的优势是存取速度比堆要快,仅次于寄存器,同一个线程中的栈数据是可以被栈中的变量共享的。缺点是,存在于栈中的数据大小和生存期必须是确定的,缺乏灵活性。

  栈遵循先进后出的原则,即先分配的内存必定后释放。一般由系统自动分配,存放函数的参数值,局部变量等,自动清除。堆是全局的,堆栈是每个函数进入的时候分的一小块,函数返回的时候就释放了,静态和全局变量,new得到的变量,都存放在堆中,

  3.方法区

  又叫静态区,和堆一样,被所有的线程共享。方法区包含所有的class和static变量。方法区中包含整个程序中永远唯一的元素,如class,staic变量。