1.不同的内存区域
堆内存是不同于堆栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态申请一定大小的内存空间。函数中定义的一些基本类型的变量和对象引用变量都是在函数的堆栈内存中分配的。
2.特点不同
堆内存实际上指的是优先级队列的一种数据结构。第一个元素具有最高优先级;堆栈内存实际上是一种满足先进后出性质的数学或数据结构。栈内存的访问速度比堆快,仅次于寄存器,并且栈数据可以共享。
3.范围不同
堆内存中分配的内存需要程序员手动释放。如果不释放,系统内存管理器不会自动释放。如果堆内存被动态回收和分配,它就会一直被占用。在堆栈内存中为该变量分配内存空间。当超出变量的作用域时,Java会自动释放为该变量分配的内存空间,该内存空间可以立即用于其他用途。
参考来源:-堆内存
参考来源:-栈内存
你了解JVM内存结构吗?下面我给大家分享一下JVM内存结构。它主要包括两个子系统和两个组件。这两个组件是Runtimedataarea组件和Nativeinterface(本地接口)
JVM内存结构
我最近看了一些Java内存泄漏的案例,并与我的一些同事进行了讨论。老朋友们。经过大量研究,我发现JVM中还有很多以前不知道的细节。下面详细分析一下它们,首先看一下JVM的内部结构——
Classloader子系统的作用
加载Runtimedata中Methododarea(方法区)中的类文件内容基于提供的完全限定类名(例如javalangObject)的区域。Java程序员可以扩展javalangClassLoader类来编写自己的类加载器
执行引擎子系统的作用
执行类中的指令JVM规范(JDK)的任何实现的核心是'执行引擎。不同的JDK,例如Sun的JDK和IBM的JDK,其好坏大多取决于它们实现的Executionengine。好还是坏
原生接口组件。p>
与本机库交互是与其他编程语言交互的接口。当调用native方法时,就进入了一个不再受虚拟机限制的新世界,因此也很容易出现JVM无法控制的nativeheapOutOfMemory
RuntimeDataArea组件
这就是我们常说的JVM内存,它主要分为五个部分——
堆(heap)Java虚拟实例中只有一个堆空间
MethodAreaMethodArea内存中保存了所加载的类的信息,当虚拟机加载某个类型时,会使用该类加载器定位到对应的类文件,然后读取该类文件的内容并传输给虚拟机
JavaStack虚拟机(javastack)只会直接以帧为单位对Javastack执行两个操作。压栈或拉栈
ProgramCounter(程序计数器)每个线程都有自己的PC寄存器线程启动时创建的PC寄存器的内容总是指向下一条要执行的指令地址这里的地址可以是方法区中方法起始指令对应的本地指针或偏移量
Nativemethodstack(本地方法栈)保存的是进入该区域的native方法的地址
lishixinzhi/Article/program/Java/hx/201311/26038