上一篇文章简单整理了栈(stack), 堆(heap), 队列(queue)的结构
这一篇继续整理java中的 占内存,堆内存。
Java把内存划分成两种:一种是栈内存,一种是堆内存。
这里需要解释一下, 这里的堆内存是跟数据结构的堆是完全两码事。
一、栈内存
存放基本类型的变量,以及对象的引用值和函数主体,遵循先入后出的原则。
栈内存在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时:
Java在栈中为变量分配内存空间,当超过变量的作用在域后,
Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
Java中的代码是在函数体中执行的,每个函数主体都会被放在栈内存中,
举例子有一个main()函数。
main()函数里调用了save()函数,那么栈低存储的是main()函数其上面是save()函数。
等save()函数执行后,先销毁save()函数,再销毁main()函数。
栈的优势是,栈内存与堆内存相比是非常小的,存取速度比堆要快,栈数据可以共享。
但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
二、堆内存
给我的感觉是所有的引用类型的值是存在堆内存中,地址(指针)是存在栈内存中。
堆内存是区别于栈区、全局数据区和代码区的另一个内存区域。
堆内存在程序运行中,可以动态的调整申请大小。
堆内存的分配过程
当接收到程序的内存申请时:
1. 先游遍