Java基础学习之JVM篇:说说栈和堆的区别

学习目标

当说到JVM(Java虚拟机)我们不得不理解栈和堆,面试官也会经常请你说一说这两者之间的区别和主要作用。本节文章将以HotSpot虚拟机为例,重点围绕栈和堆来让我们一起认识Java虚拟机内存的分配方式和基础原理。

本节将一起学习

  1. 栈的作用
  2. 堆的作用
  3. JVM内存分配
  4. 元数据、编译后代码是存放堆内还是堆外
  5. 常量是放在堆内还是堆外

栈的作用

栈(Stack)作为一种先进后出的(FILO)数据结构,大家都有所了解,但在JVM角度来看大家都会给出栈时调用函数临时变量,而对象存放在堆中。这样从存储的角度来说也无可厚非,但并没有点出栈和堆的实质作用
Java基础学习之JVM篇:说说栈和堆的区别_第1张图片

其实栈作为一种数据结构,就像一摞纸,后放的书总是要被最先来,而所有的程序包括JVM中都是通过这种数据结构来执行程序的。比如在前面数据结构学习中我们能够简单实现利用栈和队列完成表达式解析,有兴趣的同学可以看看
Java基础学习之JVM篇:说说栈和堆的区别_第2张图片
如上图我们在声明a=1,b=100后调用方法add计算就是一种入栈,计算,记录程序调用位置,返回的过程。所以,栈的作用是配合执行程序并提供执行程序必须的内存空间。而线程是执行程序的最小单位,也必然拥有自己的栈。


堆的作用

说到堆(Heap),大家都能说上几句。堆在JVM中的地位举足轻重,其实堆不是存储一种数据结构,而是作为“垃圾堆”的形式存储一堆数据结构,比如Java中的各种引用类型数据,Object、数组、HahsMap、List等,总而言之就是对象的实例数据都放在堆中。而应用通过堆来申请和回收内存,即GC主要处理的就是堆中的数据

Java基础学习之JVM篇:说说栈和堆的区别_第3张图片
但是类的信息,包括元数据信息,比如类定义的方法,属性,字段等是存放在堆外的(在Hotspot老版本中元数据开始是存放在堆内的,当然现在有些其它种类的虚拟机也是)。当然,编译的.class文件信息和常量也是放在堆外,这些放在堆外的Java数据统称是方法区(Method Area)。栈中一些引用的指针是指向堆的,堆中也包括了方法区数据的引用,即方法区的数据还是通过堆区访问。
Java基础学习之JVM篇:说说栈和堆的区别_第4张图片
在Java中也会引用一些比如C、C++中的原始方法,这些原始数据一般是存储在属于自己语言的堆中,在HotSpot虚拟机中我们统称为Native Memory空间。

你可能感兴趣的:(Java基础学习,java,jvm,堆栈)