当前位置:首页 > 内存 > 正文

堆内存结构

  • 内存
  • 2024-09-06 01:30:02
  • 5167

一、堆内存和栈内存的区别

1.不同的内存区域

堆内存是不同于堆栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态申请一定大小的内存空间。函数中定义的一些基本类型的变量和对象引用变量都是在函数的堆栈内存中分配的。

2.特点不同

堆内存实际上指的是优先级队列的一种数据结构。第一个元素具有最高优先级;堆栈内存实际上是一种满足先进后出性质的数学或数据结构。栈内存的访问速度比堆快,仅次于寄存器,并且栈数据可以共享。

3.范围不同

堆内存中分配的内存需要程序员手动释放。如果不释放,系统内存管理器不会自动释放。如果堆内存被动态回收和分配,它就会一直被占用。在堆栈内存中为该变量分配内存空间。当超出变量的作用域时,Java会自动释放为该变量分配的内存空间,该内存空间可以立即用于其他用途。

参考来源:-堆内存

参考来源:-栈内存


二、编程中的堆与栈有什么区别?2.3申请大小的限制
栈:在Windows中,栈是一种向低地址延伸的数据结构
,构成一块连续的内存区域。这句话的意思是栈顶地址和栈的最大容量是系统预先确定的。在WINDOWS下,堆栈大小为2MB(有人说1MB,总之是编译时确定的)。常量),如果请求的空间超过堆栈上的剩余空间,则会请求溢出。因此,堆栈上的可用空间较小。
堆:堆是一种向高地址扩展的数据结构,是一个不连续的内存区域。确实,系统使用链表来存储空闲内存地址,这些地址自然是不连续的,并且链表的行进方向是从低地址到高地址。堆大小受计算机系统中可用的虚拟内存的限制。我们看到堆获得的空间更加灵活,也更大。
2.4应用效率对比:
堆栈由系统自动分配,速度更快。但程序员无法控制。
堆是new分配的内存。它一般速度慢,容易产生内存碎片,但使用起来最方便。
另外,在WINDOWS上,最好的方式是使用VirtualAlloc来分配。内存它不在堆或栈中,而是直接在进程的地址空间中保留一块内存,虽然使用起来最不方便。但它速度快而且非常灵活。
三、详解JVM内存结构组成

你了解JVM内存结构吗?下面我给大家分享一下JVM内存结构。它主要包括两个子系统和两个组件。这两个组件是Runtimedataarea组件和Nativeinterface(本地接口)

JVM内存结构

我最近看了一些Java内存泄漏的案例,并与我的一些同事进行了讨论。老朋友们。经过大量研究,我发现JVM中还有很多以前不知道的细节。下面详细分析一下它们,首先看一下JVM的内部结构——

如,JVM的内存结构主要包括两个子系统和两个组件。这两个子系统是Classloader子系统和Executionengine子系统,分别是Runtimedataarea组件和.Nativeinterface组件(本地接口)

Classloader子系统的作用

加载Runtimedata中Methododarea(方法区)中的类文件内容基于提供的完全限定类名(例如javalangObject)的区域。Java程序员可以扩展javalangClassLoader类来编写自己的类加载器

执行引擎子系统的作用

执行类中的指令JVM规范(JDK)的任何实现的核心是'执行引擎。不同的JDK,例如Sun的JDK和IBM的JDK,其好坏大多取决于它们实现的Executionengine。好还是坏

原生接口组件

与本机库交互是与其他编程语言交互的接口。当调用native方法时,就进入了一个不再受虚拟机限制的新世界,因此也很容易出现JVM无法控制的nativeheapOutOfMemory

RuntimeDataArea组件

这就是我们常说的JVM内存,它主要分为五个部分——

堆(heap)Java虚拟实例中只有一个堆空间

MethodAreaMethodArea内存中保存了所加载的类的信息,当虚拟机加载某个类型时,会使用该类加载器定位到对应的类文件,然后读取该类文件的内容并传输给虚拟机

JavaStack虚拟机(javastack)只会直接以帧为单位对Javastack执行两个操作。压栈或拉栈

ProgramCounter(程序计数器)每个线程都有自己的PC寄存器线程启动时创建的PC寄存器的内容总是指向下一条要执行的指令地址这里的地址可以是方法区中方法起始指令对应的本地指针或偏移量

Nativemethodstack(本地方法栈)保存的是进入该区域的native方法的地址

lishixinzhi/Article/program/Java/hx/201311/26038