java中的堆和栈

        最近一段时间面试经常被问到java中堆和栈的问题,为了后面不会忘,于是整理一份。其实这是java内存区域划分的问题,也就是jvm内存区域划分的问题(如何分配和回收内存空间)。

        java数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)

        程序计数器:用于指示需要执行的指令,每个进程各自拥有独立的程序计数器。

        Java栈:由栈帧组成。栈帧在一个方法被调用时创建,并压栈。在方法结束时出栈。故当前java栈顶部的栈帧必对应正在执行的方法。每个进程各自拥有独立的java栈栈帧中记录的内容包含:局部变量表(Local Variables)、操作数栈(Operand Stack)、指向当前方法所属的类的运行时常量池的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些额外的附加信息

                局部变量表:对于基本数据类型的变量直接存储它的值,对于引用类型的变量则存储指向对象的引用。

                操作数栈:可理解为java虚拟机栈中的一个用于计算的临时数据存储区,用于方法执行时零时存储数据的。

                指向常量池的引用:常量不存储在java栈中,所以栈用需要使用常量就需要存储常量的引用。

                方法返回地址:方法完成后,需要返回之前调用该方法的方法,所以需要存储方法返回前的地址。

        本地方法栈:与java栈作用类似,一个用于执行java方法,一个用于执行本地方法。

        :用于存储对象实例和数组实例的。由所有线程共享。

        方法区:存储类信息(类名、方法信息、字段信息)、静态变量、常量(运行时常量池)、以及编译器编译后的代码。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多...
    南莎_2508阅读 299评论 0 1
  • 堆和栈都是Java在Ram中存放数据的地方,Java自动管理堆和栈,开发者不能直接地设置堆或栈。 Java的堆是一...
    A_Coder阅读 126评论 0 0
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,764评论 3 83
  • 第6章类文件结构 6.1 概述 6.2 无关性基石 6.3 Class类文件的结构 java虚拟机不和包括java...
    kennethan阅读 985评论 0 2
  • 第二部分 自动内存管理机制 第二章 java内存异常与内存溢出异常 运行数据区域 程序计数器:当前线程所执行的字节...
    小明oh阅读 1,216评论 0 2