JVM内存模型:堆与栈

版权声明:本文为博主原创文章,欢迎转载。 https://blog.csdn.net/tanhongwen13/article/details/81474399

前言:写这篇文章的目的在于解答自己对于虚拟机中堆、栈内存的疑问!

待解答疑问:
1、堆和栈的区别,及各自的职责?
2、局部变量为什么放栈中,而对象为什么放堆中?
3、无限递归为什么最终会内存溢出?

那么此文将从五个方面来说明堆和栈的异同:

  • why: 为什么要划分堆与栈?
  • what: 堆和栈什么?
  • who: 谁负责分配堆和栈?
  • when: 何时分配堆和栈?
  • how:怎样分配?

why:为什么要划分堆和栈?

区分线程间共享内存(堆),和线程私有内存(栈)。

what:堆和栈是什么?

......

who:谁负责分配堆和栈?

......

when:何时分配堆和栈?

......

how:怎样分配?

......
堆和栈的区别,以及各自的职责?
  • 堆:线程共享的区域。故存放的是对象、方法等信息;
  • 栈:线程私有的区域。故存放的是基本类型变量、对象或方法的引用;
局部变量为什么放栈中,而对象为什么放堆中?
  • 局部变量都是线程私有的,执行完成生命周期完成。符号栈的先进后出原则,不需要回收;
  • 实例对象空间大小不确定,而栈的内存的大小有限制。故堆上分配内存,栈中存放引用地址;
无限递归为什么最终会内存溢出?
  • 受栈的大小限制(栈桢大小可参数配置),一旦分配的内存空间满了就会抛出StackOverFlow异常;
展开阅读全文

没有更多推荐了,返回首页