一段时间之前,我写了两篇文章文章分别是Java的垃圾回收和Java的值传递,从那之后我收到了很多要求解释Java堆内存和栈内存的邮件,并且要求解释他们的异同点。

在Java中你会看到很多堆和栈内存的引用,JavaEE书和文章很难在程序的角度完全解释什么是堆什么是栈。

总结:
1 栈:为编译器自动分配和释放,如函数参数、局部变量、临时变量等等
2 堆:为成员分配和释放,由程序员自己申请、自己释放。否则发生内存泄露。典型为使用new申请的堆内容。
除了这两部分,还有一部分是:
3 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

Java堆内存

堆内存在Java运行时被使用来为对象和JRE类分配内存。不论什么时候我们创建了对象,它将一直会在堆内存上创建。垃圾回收运行在堆内存上来释放没有任何引用的对象所占的内存,任何在堆上被创建的对象都有一个全局的访问,并且可以在应用的任何位置被引用。

Java栈内存

Java的栈内存被用来线程的执行,他们包含生命周期很短的具体值的方法和在堆中使用这个方法对象的引用。栈内存是LIFO(后进先出)序列。当方法被调用的时候,堆内存中一个新的块被创建,保存了本地原始值和在方法中对其他对象的引用。这个方法结束之后,这个块对其他方法就变成可用的了。栈内存与堆内存相比是非常小的。
我们用下边的例子理解堆内存和栈内存
[java] view plaincopy
  1. package com.journaldev.test;
  2. public class Memory {
  3. public static void main(String[] args) { // Line 1
  4. int i=1; // Line 2
  5. Object obj = new Object(); // Line 3
  6. Memory mem = new Memory(); // Line 4
  7. mem.foo(obj); // Line 5
  8. } // Line 9
  9. private void foo(Object param) { // Line 6
  10. String str = param.toString();  Line 7
  11. System.out.println(str);
  12. } // Line 8
  13. }

下边的图片展示了上边程序堆和栈内存的引用,并且是怎么用来存储原始值、对象和变量的引用。

我们来看看程序执行的过程:
1、只要我们一运行这个程序,它会加载所有的运行类到堆内存中去,当在第一行找到main()方法的时候,Java创建可以被main()方法线程使用的栈内存。
2、当在第一行,我们创建了本地原始变量,它在main()的栈中创建和保存。
3、因为我们在第三行创建了对象,它在堆内存中被创建,在栈内存中保存了它的引用,同样的过程也发生在第四行我们创建Memory对象的时候。
4、当在第五行我们调用foo()方法的时候,在堆的顶部创建了一个块来被foo()方法使用,因为Java是值传递的,在第六行一个新的对象的引用在foo()方法中的栈中被创建
5、在第七行一个String被创建,它在堆空间中的String池中运行,并且它的引用也在foo()方法的栈空间中被创建
6、foo()方法在第八行结束,此时在堆中为foo()方法分配的内存块可以被释放
7、在第九行,main()方法结束,栈为main()方法创建的内存空间可以被销毁。同样程序也在行结束,Java释放了所有的内存,结束了程序的运行

堆内存和栈内存的区别

基于上边的解释我们可以很简单的总结出堆和栈的区别:
1、应用程序所有的部分都使用堆内存,然后栈内存通过一个线程运行来使用。
2、不论对象什么时候创建,他都会存储在堆内存中,栈内存包含它的引用。栈内存只包含原始值变量好和堆中对象变量的引用。
3、存储在堆中的对象是全局可以被访问的,然而栈内存不能被其他线程所访问。
4、栈中的内存管理使用LIFO的方式完成,而堆内存的管理要更复杂了,因为它是全局被访问的。堆内存被分为,年轻一代,老一代等等,更多的细节请看,这篇文章
5、栈内存是生命周期很短的,然而堆内存的生命周期从程序的运行开始到运行结束。
6、我们可以使用-Xms和-Xmx JVM选项定义开始的大小和堆内存的最大值,我们可以使用-Xss定义栈的大小
7、当栈内存满的时候,Java抛出java.lang.StackOverFlowError异常而堆内存满的时候抛出java.lang.OutOfMemoryError: Java Heap Space错误
8、和堆内存比,栈内存要小的多,因为明确使用了内存分配规则(LIFO),和堆内存相比栈内存非常快。

原文地址:http://www.journaldev.com/4098/java-heap-memory-vs-stack-memory-difference

java堆内存和栈内存的区别相关推荐

  1. 简述JAVA中堆内存与栈内存的区别

    Java把内存划分成两种:一种是栈内存,一种是堆内存. 一.栈内存 存放基本类型的变量,对象的引用和方法调用,遵循先入后出的原则. 栈内存在函数中定义的"一些基本类型的变量和对象的引用变量& ...

  2. java 堆内存和栈内存的区别_java中栈内存和堆内存有什么区别

    栈内存和堆内存的区别: 1.栈内存用来存放基本类型的变量和引用变量,堆内存用来存储java中的对象,无论是成员变量,局部变量,还是类变量,他们指向的对象都存储在堆内存中. (视频教程推荐:java视频 ...

  3. Java的堆内存和栈内存

    一.Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存. 堆:主要用于存储实例化的对象,数组.由JVM动态分配内存空间.一个JVM只有一个堆内存,线程是可以共享数据的. 栈 ...

  4. Java中的堆内存、栈内存和方法区总结

    Java中内存分成两种,一种叫做栈内存,一种叫做堆内存.还有一个方法区,也叫做静态区. 1.栈内存中放哪些东西?  ①基本类型的变量,例如int a=3中的a:  ②对象的引用变量,例如Thread ...

  5. Java 堆内存和栈内存

    在Java中,内存:栈内存.堆内存. 1 栈内存 栈内存主要是用来执行程序用的,比如:基本类型的变量和对象的引用变量 栈溢出(StackOverflowError) 递归溢出 2 堆内存 堆内存作用是 ...

  6. python变量存储 堆与栈内存内存_浅析JS中的堆内存与栈内存

    最近跟着组里的大佬面试碰到这么一个问题, Q:说说var.let.const的区别 A:balabalabalabla... Q:const定义的值能改么? A:你逗我?不能吧 不知道各位看官怎么想? ...

  7. js中的堆内存和栈内存

    转自:https://www.cnblogs.com/heioray/p/9487093.html 浅析JS中的堆内存与栈内存 最近跟着组里的大佬面试碰到这么一个问题, Q:说说var.let.con ...

  8. 栈和堆存储在计算机RAM中,堆内存和栈内存及C++内存分配

    1.现代操作系统内存管理主流的操作系统(Windows,Linux)都采用虚拟内存管理的方式,具体说就是:页式管理.段式管理.段页式管理. 操作系统分配资源的单位是进程,所以,内存管理的过程也是以进程 ...

  9. java动态扩展_java栈内存动态扩展要怎么理解?要如何实现?

    小伙伴们知道如何在java栈中内存动态扩展吗?这是虚拟机中的一个概念,下面让我们一起来看看该如何实现吧. 一.内存概念 在java中,我们一般会简单把java内存区域划为两种:堆内存与栈内存.其实这种 ...

最新文章

  1. 使用AIO软件清除日志
  2. 关于源代码管理的10 个问题
  3. 你不知道的vscode之空间控制
  4. 在Linux中GNU的名词解释,GNU在GNU / Linux操作系统中的主要贡献是什么...
  5. python 网络渗透_python 网络编程(渗透与编程一)
  6. 华为P40pro 手机云台_国产新旗舰华为P40Pro喜欢这款手机吗?
  7. [Misc]IE浏览器真正全屏幕操作技巧
  8. 对手机彩铃的一些想法
  9. C/C++[codeup 2018]数列
  10. postgres常用SQL
  11. android模拟器如何增加RAM
  12. C语言实现格林威治时间转北京时间+根据日期计算星期几
  13. 如何优雅的美化kali,实现双桌面环境
  14. 论单片机IO引脚驱动能力的提高
  15. python选题背景_论文的选题背景及意义-样例
  16. 当前电子计算机发展的局限性,当前高中信息技术教学现状及教学改革探究
  17. C# DirectoryInfo GetFiles()获得的文件列表与本机下文件顺序一致
  18. 电磁场与电磁波:法拉第电磁感应定律,高斯定律的高斯定律
  19. hive server2源码地址在哪_实战搭建Thinkphp二次开发威客RW平台源码粉丝关注投票发布系统...
  20. Outlook 2003中的IMAP与POP3

热门文章

  1. j-甜甜圈(第十三届icpc河南省赛)
  2. Java 实现文档在线预览功能
  3. vue 本地xlsx文件下载_vue前端项目中excel文件下载
  4. 问遍了身边的面试官朋友,我整理出这份 Java 集合高频面试题(2022年最新版)
  5. android service白名单,Android 后台运行白名单实现保活
  6. 计算机的优势和劣势_计算机二级证书的含金量不高?别小瞧,这4大优势用处不小...
  7. 元气骑士 自建服务器,七夕元气骑士联机盒子服务器官方版
  8. Vuex状态管理-mapState的基本用法详细介绍
  9. MongoDB备份/恢复方案
  10. 成为计算几何master之路——记算法竞赛中常用的计几算法及思想