堆和栈的区别

栈:

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

  特定:存在栈中的数据可以共享 (在栈中定义了一个变量,如果第二次又定义了一个相同的变量那么第二次定义的变量的内存地址是第一个的内存地址)

     栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

堆:

  堆内存用来存放由new创建的对象和数组。堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,所以分配和销毁都是要占用时间的,因此用堆内存的效率非常低.但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.

 

JVM中的堆栈:

  jvm是基于堆栈的虚拟机,jvm为每个新创建的线程都分配一个堆栈,也就是说线程的运行是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态,jvm对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。堆栈可以理解成是操作系统在建立某个进程或线程的存储区域,该区域具有先进后出的特性。每一个java应用都唯一对应一个jvm实例,每一个实例唯一对应一个堆,应用程序在运行中所创建的所有类的实例或数组都放在这个堆中,并由应用所有的线程共享,java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用确是在堆栈中分配,也就是说在建立一个对象时需从两个地方都分配内存,这个对象实际存在堆中,而堆栈中分配的内存只是一个指向这个对象的指针。

  

  

posted on 2020-05-13 15:01  三尺青峰  阅读(130)  评论(0)    收藏  举报

导航