前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java堆内存和栈内存的区别

Java堆内存和栈内存的区别

作者头像
PhoenixZheng
发布2018-08-07 16:29:57
1.9K0
发布2018-08-07 16:29:57
举报

堆栈,这个名词很多Java开发者在一开始学习Java的时候就经常听说了。

对于这个名词来说,它描述的其实是JVM的内存模型, 如果面试中问到,堆栈具体对应着什么,不知道是否了解?

堆和栈

其实堆栈是两个东西,在JVM中分别对应两个不同的内存部分。 对于JVM内存模型来说,只要记住下面这张图就足够了,

对于左边黄色的部分,就是JVM中的“堆”,相对应的右边的则是"栈"。

在Java中,Heap用来表示 堆。我们不作深入的研究,毕竟JVM是个庞大复杂的东西, 这里只基本介绍 JVM的基础知识部分。 比如 Heap是用来干啥的?

提示一下,平时经常实例化对象吧?

代码语言:javascript
复制
Student student = new Student();

这里实例化了的对象,就是存放在堆中。 具体的说,是存放在 Heap Memory中。

还有,静态变量也是在这里,还记得上面那张图嘛,黄色部分分了上下两个区, 其中一个叫 Method Area的区域,是用来存放静态变量的。

你应该知道大名鼎鼎的爆栈吧, StackOverFlow, 这个网站可能解决了平时我们开发中遇到的90%的问题。 其实 stack over flow本身是一种异常,这里的 stack 说的就是JVM里的栈。

而栈是用来干什么的呢, 举个例子,平时我们写的非静态方法,执行时就在栈里。 虽然这么说不够准确,因为要说明白方法的执行,需要了解栈帧的概念,但我们这里不作深入的分析。

现在不知道你是否明白,之前见过的 stack over flow异常是怎么回事。 如果足够好奇的话, 可以尝试写一个递归方法,

代码语言:javascript
复制
public boolean recursive() {
    ....
    return recursive();
}

然后尝试让这个递归无限的嵌套下去, 你就会看到 StackOverFlowException了, 原因就是因为 stack内存不足以运行方法。

总结

所以总的来说,JVM分为Head和Stack两个部分 对于初学者,只要初步了解了这个基础,基本能应付开发中遇到的问题。 但如果想要提高自己,最终都需要深入了解 JVM的内存模型。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 堆和栈
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档