首页 > 试题广场 >

(Java部分)Java 中堆和栈有什么区别?

[不定项选择题]
(Java部分)Java 中堆和栈有什么区别?
  • 堆是整个JVM共享的
  • 栈是每个线程独有的
  • 栈是整个JVM共享的
  • 对象可以分配在堆上也可以分配在栈上
1java 的栈内存。它的真正名称叫做:java虚拟机栈。它和java堆内存的有一个很大的区别在于,它是线程私有的。它的生命周期也和线程的生命周期捆绑在一起。 每个java方法在执行的时候都会创建一个栈帧用来存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用直至完成执行后的过程,就对应着一个栈帧在虚拟机栈中的入栈到出栈的过程。在java虚拟机栈中,局部变量表所需要的内存空间在编译期间完成分配的。也就是说在进入一个方法时,这个方法在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。那如果这个方法的线程所需要的内存大于这个空间呢?结果是会抛出OutOfMemoryError异常。另外如果线程请求的栈深度大于虚拟机所设的深度,将抛出 StackOverflowError异常。
2同个java程序内的多线程运行在同个JVM实例上,多个线程之间共享堆内存(多线访问堆时,要实现数据的同步)。

发表于 2018-01-15 10:20:04 回复(4)