如何理解Java虚拟机栈?

堆是堆(heap),栈是栈(stack),堆栈是栈。

栈中分配的是基本类型和自定义对象的引用。

堆中分配的是对象,也就是new出来的东西。                 被所有线程共享。

方法区/静态区 存放的是类信息和static变量、常量。      被所有线程共享。

也可以这么理解:堆是用来存放对象的,栈是用来运行程序的。

堆:java的垃圾回收器会自动的回收这些不用的数据。缺点是由于要动态的分配内存,存储效率会比较的慢。

栈:栈的优势是存取效率比较快,仅次于寄存器,栈数据可以共享。但缺点是栈中的数据大小和生存期的固定的,缺乏灵活性。

一般每个方法的调用都会独立有一个栈来保存对象的引用变量,在方法返回后,栈会清空,当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

  • 栈区: 

  • 每个线程包含一个栈区,栈中只保存方法中(不包括对象的成员变量)的基础数据类型和自定义对象的引用(不是对象),对象都存放在堆区中

  • 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

  • 栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

  • 堆区: 

  • 存储的全部是对象实例,每个对象都包含一个与之对应的class的信息(class信息存放在方法区)。

  • jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身,几乎所有的对象实例和数组都在堆中分配。

  • 方法区: 

  • 又叫静态区,跟堆一样,被所有的线程共享。它用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

  • 这个“堆”并不是数据结构意义上的堆(Heap (data structure),一种有序的树),而是动态内存分配意义上的堆——用于管理动态生命周期的内存区域。

    JVM规范让每个Java线程拥有自己的独立的JVM栈,也就是Java方法的调用栈。

    JVM规范为了允许native代码可以调用Java代码,以及允许Java代码调用native方法,还规定每个Java线程拥有自己的独立的native方法栈。

    并不是说具体的JVM实现真的要给每个Java线程开两个独立的栈。以Oracle JDK / OpenJDK的HotSpot VM为例,它使用所谓的“mixed stack”——在同一个调用栈里存放Java方法的栈帧与native方法的栈帧,所以每个Java线程其实只有一个调用栈,融合了JVM规范的JVM栈与native方法栈这俩概念。

    JVM的堆被同一个JVM实例中的所有Java线程共享。它通常由某种自动内存管理机制所管理,这种机制通常叫做“垃圾回收”(garbage collection,GC)。JVM规范并不强制要求JVM实现采用哪种GC算法。

    linux 中一个进程的虚拟内存分布:

    以32位地址操作系统为例,一个进程可拥有的虚拟内存地址范围为0-2^32。分为两部分,一部分留给kernel使用(kernel virtual memory),剩下的是进程本身使用, 即图中的process virtual memory。

    一个程序本质上都是由 bss段、data段、text段三个组成的

    bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。

    在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。

    text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。




如何理解Java虚拟机栈?
JVM规范让每个Java线程拥有自己的独立的JVM栈,也就是Java方法的调用栈。JVM规范为了允许native代码可以调用Java代码,以及允许Java代码调用native方法,还规定每个Java线程拥有自己的独立的native方法栈。并不是说具体的JVM实现真的要给每个Java线程开两个独立的栈。以Oracle JDK \/ OpenJDK的HotSpot VM为例...

Java虚拟机栈--详解
Java虚拟机栈的深入剖析 Java虚拟机栈作为Java运行时数据区的一部分,私有于每个线程,它定义了Java方法的内存模型。栈帧结构如下:每当方法调用时,会为线程在虚拟机栈中创建一个新的栈帧,其中包含局部变量表、操作数栈、动态连接和返回地址。让我们逐一理解这些概念:局部变量表 局部变量表由Slot组成,...

Java虚拟机的堆、栈、堆栈如何去理解?
让我们一起解开Java虚拟机(JVM)堆栈的神秘面纱,这是一个关于Java对象生命轮回和代码执行路径的关键话题。首先,让我们明确:堆(heap)和栈(stack,并非我们通常理解的堆栈)在JVM中的核心角色。<\/ 每个Java线程在JVM中都拥有独立的调用栈,无论是Java方法还是潜在的native方法调用,尽管在实际实现中,...

Java虚拟机栈与栈帧详解
Java虚拟机栈是运行时单位,每个线程创建时会自动产生,包含栈帧,对应方法调用。栈帧生命周期与线程一致,主管方法运行,存储局部变量、部分结果。栈的特点:线程私有,不同栈帧无相互引用。栈运行原理:方法返回时弹出当前栈帧,前一个成为当前。栈帧内部结构包括局部变量表、操作数栈等。局部变量表中的...

请高手详细的解答一下JAVA的堆,栈,方法区,谢谢。
java堆是垃圾收集器管理的主要区域。java虚拟机栈:线程私有的,它的生命周期与线程相同。每个方法被执行的时候都会同时创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。

java技术栈是什么意思?一次认全9大主流技术栈!
Java技术栈,实质上是开发过程中常用的一套技术组合,主要包括Java语言、Java虚拟机、Java类库、Web开发框架、数据库、集成开发环境(IDE)等。在企业级Web应用开发中,Java技术栈以其高可靠性、强可维护性和良好扩展性而备受青睐。本文将深入解析Java中的9大主流技术栈:Spring Framework:作为Java应用的...

java怎样理解“堆空间”和“栈空间”
code segment:存放代码3、首先解释一下虚拟机内存:java虚拟机存在方法区,堆空间与栈空间,定义是这样的,虚拟机具体实现完全可以把它们分开在不同内存中,也可以把它们放在同一段内存中。方法区存放类与方法。堆空间存放实例化的对象。栈空间有两种,一种是方法栈,虚拟机会为每个线程所调用的方法申请...

北大青鸟java培训:java编程内存管理需要注意的问题?
Java虚拟机栈(了解)Java虚拟机栈也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链表、方法出口信息等。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程...

什么是 Java 虚拟机?
1.java虚拟机定义: 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与...2.java虚拟机的基本结构

什么是Java虚拟机?
Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 这种解释应该算是正确的,但是只描述了虚拟机的外部行为和功能,并没有针对内部原理做出说明。