志在指尖
用双手敲打未来

java堆栈(java堆栈方法区图解)

java堆栈

(1)内存分配策略
根据编译原理的观点,程序运行时有三种内存分配策略,即静态,堆栈和堆。
静态存储分配意味着可以在编译时确定每个数据对象在运行时的存储空间需求,以便可以在编译时为它们分配固定的存储空间。这种分配策略要求程序代码不允许可变。数据结构(例如变量数组)的存在不允许嵌套或递归结构,因为它们将导致编译器无法计算准确的存储空间要求。
堆栈存储分配也可以称为动态存储分配,它由类似堆栈的运行堆栈实现。与静态存储分配相比,在堆栈存储方案中,程序对数据区域的要求在编译时是完全未知的。是的,只有在运行时才能知道,但规定在运行期间进入程序模块时,必须知道程序模块所需的数据区域的大小才能为其分配内存。它与我们在数据结构中熟悉的堆栈相同,堆栈存储分配是根据先进先出的原则分配的。
静态存储分配要求在编译时知道所有变量的存储要求,堆栈存储分配要求在流程开始时必须知道所有存储要求,并且堆存储分配专门在编译时或运行时负责。无法确定存储所需的数据结构(例如可变长度字符串和对象实例)的内存分配。堆由大块可用块或空闲块组成,并且堆中的内存可以按任何顺序分配和释放。java堆栈
(2)堆与栈的比较
以上定义摘自编译原理教科书。除了静态存储分配外,它似乎非常僵化且难以理解。让我们搁置静态存储分配,重点放在比较堆和堆栈上:
堆和堆栈的函数之间的流行比较。堆主要用于存储对象,而栈主要用于执行程序。而这种差异主要由堆和栈的特性决定:
在诸如C/C++的编程中,所有方法调用都是通过堆栈进行的,所有局部变量和形式参数都是从堆栈中分配的内存空间。实际上,这不是任何分配,只是从堆栈的顶部使用它,就像工厂中的传送带一样,堆栈指针会自动将您引导到放置物品的地方,您所要做的就是放下物品。退出函数时,可以修改堆栈指针以破坏堆栈的内容。此模式是最快的,当然应该使用它运行程序。应当注意的是,当分配例如要被调用的程序时,当模块分配数据区域时,应预先知道数据区域的大小。也就是说,尽管分配是在程序运行时执行的,但是分配的大小是确定的并且不变,并且“大小”是在编译时确定的,而不是在运行时确定的。
堆是应用程序在运行时请求操作系统分配自己的内存的时间。因为内存是从操作系统分配的,所以分配和销毁它需要花费时间,因此使用堆的效率非常低。但是,堆的优点是:编译器不需要知道要从堆分配多少存储空间,也不需要知道存储的数据将在堆中保留多长时间。因此,将数据存储在堆中时将具有更大的灵活性。实际上,对于面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只能在运行时创建对象之后才能确定。在C++中,当需要创建对象时,仅需要使用new命令来编译相关代码。当执行这些代码时,数据将自动保存在堆中。当然,为了实现这种灵活性,必须付出一定的代价:在堆中分配存储空间将花费更长的时间!这也是我们刚才提到的效率低下的原因,似乎列宁同志说得很好,人们的优势通常是他们的缺点,而缺点通常是他们自己的优点(Halo?)。
(3)在JVM中进行堆放
JVM是基于堆栈的虚拟机。JVM为每个新创建的线程分配一个堆栈。也就是说,对于Java程序,其操作是通过在堆栈上进行操作来完成的。堆栈以帧为单位保存线程的状态。JVM仅在堆栈上执行两项操作:以帧为单位的推入和弹出操作。
我们知道某个线程正在执行的方法称为该线程的当前方法。我们可能不知道当前方法使用的帧称为当前帧。当线程激活Java方法时,JVM会将新框架推入线程的Java堆栈中。该框架自然成为当前框架。在执行此方法期间,此框架将用于保存参数,局部变量,中间计算过程和其他数据。这里的框架类似于编译原则中的活动记录的概念。
从Java的分配机制的角度来看,可以通过以下方式理解堆栈:堆栈是在操作系统建立进程或线程(操作系统中支持多线程的线程)时为此线程创建的存储区域,该区域具有先进先出的特点。
每个Java应用程序唯一地对应一个JVM实例,每个实例唯一地对应一个堆。应用程序在操作过程中创建的所有类实例或数组都放置在此堆中,并由应用程序的所有线程共享。与C/C++不同,用Java分配的堆内存会自动初始化。Java中所有对象的存储空间都是在堆上分配的,但是此对象的引用是在堆栈上分配的,这意味着在创建对象时,将从两个位置分配内存,而在堆中分配的内存为实际上,已创建此对象,并且在堆栈上分配的内存只是对此堆对象的指针(引用)。

java堆栈方法区图解

1.Java中的堆栈和堆是Java将数据存储在内存中的位置(RAM)
2.桩面积
存储的所有对象都是对象,每个对象都包含有关相应类的信息。(上课的目的是获得操作说明);
jvm只有一个堆区,所有线程都共享该堆区,并且不存储基本类型和对象引用,仅存储对象本身。堆的优缺点:堆的优点是可以动态分配内存大小,并且不需要将生存期提前告知编译器。Java的垃圾收集器将自动收集这些未使用的数字数据,但缺点是由于在运行时动态分配内存,因此访问速度很慢。
3.堆放区
每个线程包含一个堆栈区域,该区域仅存储对基本数据类型的对象和自定义对象(非对象)的引用,并且这些对象存储在共享堆中;
每个堆栈中的数据(基本数据类型和对象引用)都是私有的,其他堆栈无法访问。
堆栈分为3部分:基本类型变量区,执行环境上下文,操作指令区(存储操作指令)
堆栈的优缺点:访问速度比堆快,仅次于直接位于CPU中的寄存器,但是必须确定必须确定堆栈中存储的数据的大小和生存期。,缺乏灵活性。单个堆栈的数据可以共享。
堆栈:这是先进先出的数据结构,通常将参数和局部变量保存在方法中。
在Java中,所有基本类型和引用类型都存储在堆栈中,并且堆栈中数据的生存空间通常在当前范围内java堆栈方法
4.方法领域
1.也称为静态区域,就像堆一样,它由所有线程共享。方法区域包含所有类和静态变量。
2.方法区域包含程序中始终存在的唯一元素
5.在JAVA中,有六个不同的位置来存储数据:
1.注册(register)。这是最快的存储区域,因为它位于处理器内部与其他存储区域不同的位置。但是寄存器的数量非常有限,所以寄存器由编译器根据要求分配。您不能直接控制,也不能感觉到程序中存在寄存器的任何迹象。
2.堆叠。位于通用RAM中,但可以通过其“堆栈指针”获得处理器的支持。如果堆栈指针向下移动,则分配新的内存;如果您向上移动,这些记忆将被释放。这是一种快速有效的分配存储的方法,仅次于寄存器。创建程序时,JAVA编译器必须知道要存储堆栈中所有数据的确切大小和生命周期,因为它必须生成相应的代码才能上下移动堆栈指针。此约束限制了程序的灵活性。,因此,尽管某些JAVA数据存储在堆栈中,尤其是对象引用,但Java对象并未存储在其中。
3.堆。通用内存池(也存在于RAM中),用于存储所有JAVA对象。堆不同于堆栈的优点是,编译器不需要知道表示应该从堆中分配多少存储区域,而不必知道存储的数据在堆中可以保留多长时间。因此,在堆中分配存储有很大的灵活性。何时需要创建对象时,只需编写带有new的简单代码即可。执行此行代码后,存储空间将自动分配到堆中。当然,这种灵活性必须需要支付相应的代码。与使用堆栈进行存储相比,使用堆进行存储分配需要更多的时间。
4.静态存储。这里的“静态”是指“处于固定位置”。静态存储器存储程序运行时始终存在的数据。您可以使用关键字static标识对象的特定元素是static,但是JAVA对象本身永远不会存储在静态存储空间中。
5.恒定存储(恒定存储)。常数值通常直接存储在程序代码中。这是安全的,因为它们永远不会被更改。有时,在在嵌入式系统中,常量本身将与其他部分分开,因此在这种情况下,您可以选择将其放入ROM中
6.非RAM存储。如果数据完全在程序外部存在,则可以不受程序的任何控制,并且可以在程序不运行时存在。在速度方面,具有以下关系:
注册<堆栈<堆<其他
运行类过程:在堆调用堆栈中的方法区域实例对象中查找方法(指向堆中的实例)

未经允许不得转载:IT技术网站 » java堆栈(java堆栈方法区图解)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载