你知道如何在java堆栈中动态扩展内存吗? 这是虚拟机的概念。 现在,让我们来看看应该如何实现。
一.内存概念
java通常将java内存空间分为堆内存和堆栈内存两类。 其实这个区分是比较粗的粒度。 堆栈内存是指虚拟机堆栈,堆内存是指java堆。
堆栈存储器
实际上是虚拟机堆栈。 Java在执行每个方法的同时创建堆栈帧,并用于存储本地变量、操作堆栈、动态链接和方法出口等信息。 局部变量包含各种基本类型的变量和对对象的引用变量,它们都分配给方法的堆栈内存。 java局部变量所需的内存空间始终在编译过程中完成,并且在进入方法时,该方法所需的局部变量空间已经确定,在方法执行过程中始终保持不变。 在代码块中定义变量时,java会在堆栈中为该变量分配内存空间。 当超出变量的范围时,java会自动释放分配给该变量的内存空间,并且该内存空间可以立即用于其他用途。 如果线程请求的堆栈深度大于虚拟机允许的深度,则会抛出堆栈溢出错误异常。 如果虚拟机堆栈无法扩展,则抛出内存错误输出异常。
积累内存
堆内存的唯一目的是使new退出在虚拟机启动时创建的对象实例。 必须将所有对象实例和数组指定给堆。 因为堆由垃圾回收负责,也被称为“GC堆”,垃圾回收采用分代算法,因此堆分为新生代和老年代。 堆的优点是可以动态分配内存大小,而且生存期也不用提前告诉编译器。 由于在运行时动态分配内存,Java垃圾收集器会自动接收这些不再使用的数据。 但是,由于在运行时动态分配内存,所以存在访问速度慢的缺点。
二.内存实现
动态扩展是指在堆栈空间不足时自动增大堆栈空间,以避免堆栈溢出异常。 JVM没有实现此功能。
动态堆栈有两种方法:分段堆栈和堆栈复制。
分段堆叠
可以理解,如果通过双向链表连接多个堆栈,则最初只分配一个堆栈,如果堆栈空间不足,则分配另一个堆栈,然后通过链表逐一连接。
堆叠复制
堆栈不足时,用于分配更大的堆栈并复制原始堆栈。
函数alloca允许为堆栈动态分配内存:The
functionallocahasthesamecallingsequenceasmalloc;
however,instead
ofallocatingmemoryfromtheheap,thememoryisallocatedfromthestackframeofthecurrent
function.theadvantageisthatwedon ' thavetofreethespace;
itgoesawayautomaticallywhenthe
functionreturns.Thealloca
功能区
increasesthesizeofthestackframe.thedisadvantageisthatsomesystems
can'tsupportalloca,ifit '
simpossibletoincreasethesizeofthestackframe
afterthe
functionhasbeencalled.nevertheless,manysoftwarepackagesuseit
、andimplementationsexist
forawidevarietyofsystems。
一般只支持Linux类型的系统。 #包含
void*alloca(size_tsize );
以上是关于java堆栈内存动态扩展的内容。 关于java的入门知识,可以来我们的网站了解详细情况。
请阅读: