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

"本文深入探讨Java虚拟机JVM中的栈和堆的作用。栈主要用于执行程序和提供内存空间,与线程紧密相关;而堆作为"垃圾堆"存储各种对象实例数据,包括类信息、方法区数据等。了解这两者的区别对于理解Java内存管理至关重要。元数据、编译后的代码、常量存储在堆外的方法区,而HotSpot虚拟机中的NativeMemory则用于存储原始方法数据。"

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习目标

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

本节将一起学习

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

栈的作用

栈(Stack)作为一种先进后出的(FILO)数据结构,大家都有所了解,但在JVM角度来看大家都会给出栈时调用函数临时变量,而对象存放在堆中。这样从存储的角度来说也无可厚非,但并没有点出栈和堆的实质作用
在这里插入图片描述

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


堆的作用

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值