首先在谈到jvm的基本原理之前,先介绍java中堆和栈的区别:
下面部分内容是看了别人的博客转译过来的。
堆和栈在数据结构中和操作系统中有着完全不同的意义,这里主要讨论操作系统中的堆和栈:
在计算机领域,堆栈是很重要的概念,堆栈其实是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。???此处是不是堆栈都是?求指教??
要点:
堆,顺序随意。
栈,后进先出。
操作系统意义上的堆和栈的概念:
栈:由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕后立即被释放。栈也有链存储。
堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于数据结构中的链表。堆存放在二级缓存中,生命周期有虚拟机的垃圾回收算法来决定(也不一定一旦成为孤儿对象(没有被引用)就会被回收)。所以调用这些对象的速度要相对来的慢一些。在内存中是靠前后地址映射起来的链表结构???
栈有链式存储和顺序存储。
堆有链式存储。
数据结构意义上的堆和栈的概念:
堆:堆可以被看成是一棵树(二叉树),如:堆排序
栈:一种后进先出的数据结构。栈是一种特殊的线性表。
Java 中堆和栈的区别:
java把内存划分为两种区域:栈内存 和 堆内存。
栈内存:在一个函数中,定义的 基本类型的变量 和 对象的引用变量 都被分配在该函数的栈内存中。例如,当一段代码块({})中定义一个变量时(局部变量),java就在 该函数的栈中 的对应区域为这个变量分配内存空间,当运行到超过该变量的作用域后,java会自动的释放该变量所占用的内存空间,这块内存空间便可以立即被其他函数使用。
堆内存:存放new创建的对象(实体,这些实体由引用变量的内容(堆中首地址)指向他们)和数组。在堆中分配的内存,一般没有引用它的变量时,java虚拟机jvm会自动用垃圾回收器来管理这些内存空间。
java中栈和堆的一些特点:
(1)栈和堆都是java用来在ram中存放数据的区域。与C++不同的是java会自动管理栈和堆,而不能直接被程序员设置。
(2)栈的优势是,存取速度比堆快,仅此于直接位于cpu中的寄存器。缺点是,存在于栈中的数据大小与生存周期必须是确定(确定何时释放这些内存),缺乏灵活性。并且栈数据可以共享。
(3)堆的优势是可以动态地分配内存大小,生存周期不必事先告诉编译器,java的垃圾收集器会自动回收这些不在被使用的数据。缺点是,因为要在运行时动态的分配内存,存取速度就会较慢。