环球军事
堆栈的区别(每天学Java!栈和堆的区别)

每天学Java!栈和堆的区别nerror="javascript:errorimg.call(this);">

栈(stack))是为执行线程留出的内存空间。JVM规范让每个Java线程拥有自己的独立的JVM栈,也就是Java方法的调用栈。同时JVM规范为了允许native代码可以调用Java代码,以及允许Java代码调用native方法,还规定每个Java线程拥有自己的独立的native方法栈。这俩都是JVM规范所规定的概念上的东西,并不是说具体的JVM实现真的要给每个Java线程开两个独立的栈。事实上,每个Java线程其实只有一个调用栈,融合了JVM规范的JVM栈与native方法栈这俩概念。

我们接下来再来看栈和堆的区别。

第二点,栈和堆最主要的区别就是各自的职能。栈内存用来存储局部变量和方法调用。当函数被调用的时候,栈顶为局部变量和一些 bookkeeping 数据预留块。当函数执行完毕,块就没有用了,可能在下次的函数调用的时候再被使用。栈通常用后进先出(LIFO)的方式预留空间;因此最近的保留块(reserved block)通常最先被释放。这么做可以使跟踪堆栈变的简单;从栈中释放块(free block)只不过是指针的偏移而已。

在空间大小上,栈的内存要远远小于堆内存。栈是连续的内存块,栈的大小设置是在线程被创建的时候。可以通过-Xss选项设置栈内存的大小。如果你在编译之前就明确知道你需要的分配数据大小,并且并不是太大,可以使用栈。而堆的大小设置是在应用程序启动的时候,正常情况下不需要担心它的实际大小。如果在运行期间你不知道会需要多大的数据或者你需要分配大量的内存,建议你使用堆。

其余的,像是在速度、异常错误上,栈和堆也都还有一定的区别。小华君就不一一列举了。

好了,今天小华君就说到这里。依然是欢迎大牛补充和指正的。如果你想更好更快更系统地学习Java,小华君建议你来北京华信智原实地了解或者试听一节课。毕竟这里的老师都是行业的一线项目经理,专业技能扎实,项目经验丰富,会带领你通过企业的真实项目案例来学习。


顶一下()     踩一下()

热门推荐

发表评论
0评