在java语言的学习和使用当中你可能已经了解或者知道堆和栈,但是你可能没有完全的理解它们。今天我们就一起来学习堆、栈的特点以及它们的区别。认识了这个之后,你可能对java有更深的理解。

Java堆内存(Heap Memory)

堆内存在Java运行时主要去回收对象和JRE的类。当我们创建了一个对象(也就是 new一个对象),在堆内存就会为对象分配一个空间,Java垃圾回收器(GC)运行在堆内存里,一旦发现没有任何地方引用到这个对象,就释放这个对象所占的内存。 
被创建的对象存在于堆内存,并且拥有全局权限,能被应用的任何地方引用到。

Java栈内存(Stack Memory)

堆内存是单线程执行的,它的空间比堆内存空间要小。它里面会包括定义在方法里的、短时间存在的局部变量,这些局部变量总是引用到堆内存的对象。堆内存还有个特点就是后进先出。当一个方法被调用之后,在栈内存就会为这个方法产生一个内存区域来保存方法里的基本数据类型数据和引用了堆内存中对象的局部变量。当这个方法执行完毕,这个块没有用了,就会被垃圾回收器回收,接着继续下一个方法。

加深理解

先来看一段简单的代码

 public class TestMemory {

     public static void main(String[] args) {
int i = 666;//line1
Object object = new Object();//line2
TestMemory testMemory = new TestMemory();//line3
testMemory.test(object);//line4
}
//line5
private void test(Object params){//line6
String str = params.toString();//line7
System.out.println(str);//line8
}
}
//line9

下面这张图片展示了上面代码的内存信息。

1、当程序运行时,JVM会先加载运行时的类和我们自己写的类信息,这些类信息加载后存在堆内存当中。

2、接着进入到main方法,第一行line1创建了一个基本数据类型i=666,所以创建了一个main方法的内存块,它里面同时存放了i=666;

3、接着line2和line3的位置 
Object object = new Object(); 
TestMemory testMemory = new TestMemory();创建了两个局部变量,object和testMemory,同时在堆里存放了两个新的对象Object和TestMemory。(每次我们new 一个对象都会在堆区产生一块内存区给它分配空间)。同时object和testMemory引用了new出来的对象。

4、现在到了line4,test方法了,当调用到test方法的时候,在栈的顶层创建了一块test()方法的内存区(我们说过栈的特点就是后进先出),由于在 Java里的传递是值传递,所以就有了参数object产生了一个新的引用。

5、最后调用了toString产生了一个字符串常量存放在了String pool里,并且str 引用了它。(如果你有String类感兴趣,你可能喜欢 》Java你可能不知道的事系列1_String类

6、当test方法结束,它里面的变量也就被GC回收掉了。接着main方法也就结束。Java在运行时释放这些内存并结束程序的运行。

总结

1、当一个对象被创建,总是会在堆内存为它分配空间并且存储,如果有赋值就会将变量引用到对象。而栈内存就是存放这些引用对象的局部变量。

2、栈内存的生命周期很短,而堆内存从程序执行开始到结束一只都需要工作。因为栈内存没当执行完一个方法,它们所占的内存区就会被释放。而堆内存里的对象只有在没有任何变量引用到它的时候才可能会被释放。

3、栈内存大小相比于堆内存非常小。但是它相对于堆内存又比较快。

java你可能不知道的事(2)--堆和栈的更多相关文章

  1. java你可能不知道的事(2)--堆和栈<转>

    在java语言的学习和使用当中你可能已经了解或者知道堆和栈,但是你可能没有完全的理解它们.今天我们就一起来学习堆.栈的特点以及它们的区别.认识了这个之后,你可能对java有更深的理解. Java堆内存 ...

  2. Java你可能不知道的事(3)HashMap

    概述 HashMap对于做Java的小伙伴来说太熟悉了.估计你们每天都在使用它.它为什么叫做HashMap?它的内部是怎么实现的呢?为什么我们使用的时候很多情况都是用String作为它的key呢?带着 ...

  3. Java你可能不知道的事系列(1)

    概述 本类文章会不段更新分析学习到的经典面试题目,在此记录下来便于自己理解.如果有不对的地方还请各位观众拍砖. 今天主要分享一下常用的字符串的几个题目,相信学习java的小伙伴们对String类是再熟 ...

  4. Java你可能不知道的事系列1

    概述 本类文章会不段更新分析学习到的经典面试题目,在此记录下来便于自己理解.如果有不对的地方还请各位观众拍砖. 今天主要分享一下常用的字符串的几个题目,相信学习java的小伙伴们对String类是再熟 ...

  5. Spring中你可能不知道的事(一)

    Spring作为Java的王牌开源项目,相信大家都用过,但是可能大家仅仅用到了Spring最常用的功能,Spring实在是庞大了,很多功能可能一辈子都不会用到,今天我就罗列下Spring中你可能不知道 ...

  6. ES6 你可能不知道的事 – 基础篇

    序 ES6,或许应该叫 ES2015(2015 年 6 月正式发布),对于大多数前端同学都不陌生. 首先这篇文章不是工具书,不会去过多谈概念,而是想聊聊关于每个特性 你可能不知道的事,希望能为各位同学 ...

  7. overflow:hidden 你所不知道的事

    overflow:hidden 你所不知道的事 overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解. ...

  8. “吃人”的那些Java名词:对象、引用、堆、栈

    记得中学的课本上,有一篇名为<狂人日记>课文:那时候根本理解不了鲁迅写这篇文章要表达的中心思想,只觉得满篇的“吃人”令人心情压抑:老师在讲台上慷慨激昂的讲,大多数的同学同我一样,在课本面前 ...

  9. 【转】Java运行时数据区简介及堆与栈的区别

    理解JVM运行时的数据区是Java编程中的进阶部分.我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机 ...

随机推荐

  1. 第23/24周 临时数据库(TempDb)

    在今天的性能调优培训里我们讨论下TempDb——SQL Server的公共厕所,在SQL Server里我是这样描述它的.我们的每个人都会经常使用TempDb.有些人直接使用它,有些人不直接使用它.今 ...

  2. 总结Unity IOC容器通过配置实现类型映射的几种基本使用方法

    网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下: unityContainer = new Un ...

  3. Architecture Pattern: Publish-subscribe Pattern

    1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Role Publisher: ...

  4. MVC中Action的执行过程

    接着上一篇:MVC控制器的激活过程 一.代码现行,该伪代码大致解析了Action的执行的过程 try { Run each IAuthorizationFilter's OnAuthorization ...

  5. QWebView在 Qt 5.x中编译出错:File not found: main.obj

    错误现象 近日由于项目需要,想要学习一下QWebView的使用.于是简单的建立了一个Qt工程,并编写了如下代码: #include <QApplication> #include < ...

  6. .Net语言 APP开发平台——Smobiler学习日志:Poplist控件在APP中的应用场景以及代码

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的”Smobil ...

  7. [转]HTML5 本地图片预览

    [原文链接] https://www.huangwenchao.com.cn/2015/03/html5-image-preview.html 问题 加入我们在 HTML 里面有一个图片上传控件: & ...

  8. 关于C#基础

    前几天帮人做个社交网站,还是用的控件方式,不过学习了ajax和一般处理程序ashx后,也用在了里面一些,今天回来继续写博客.继续上次总结下基础知识,学的内容多,总结的可能比较杂乱,分条总结为平时能自己 ...

  9. Entity Framework 的简单介绍与实例

    1.下载与引用 a) 首先需要下载一个oracle clinent 12c 发行版(我这边下载的是发行版)并进行安装,下载内容如下图 B) 创建一个项目,通过Nuget引用  添加ODP.NET    ...

  10. 孙鑫MFC学习笔记:15多线程

    15 1.进程地址空间 2.线程 3.CreateThread创建一个线程 4.CloseHandle关闭线程句柄,要在不再使用线程句柄的时候关闭,递减线程引用计数 5.编辑框默认不支持多行,需要打开 ...