详解JVM内存结构组成
你对JVM内存结构是否了解 这里和大家分享一下 JVM内存结构主要包括两个子系统和两个组件 这两个组件分别是Runtimedataarea(运行时数据区域)组件和Nativeinterface(本地接口)组件
JVM内存结构
近期看了看Java内存泄露的一些案例 跟原来的几个哥们讨论了一下 深入研究发现JVM里面还是有不少以前不知道的细节 这里稍微剖析一下 先看一看JVM内部结构——
如图所示 JVM内存结构主要包括两个子系统和两个组件 两个子系统分别是Classloader子系统和Executionengine(执行引擎)子系统 两个组件分别是Runtimedataarea(运行时数据区域)组件和Nativeinterface(本地接口)组件
Classloader子系统的作用
根据给定的全限定名类名(如java lang Object)来装载class文件的内容到Runtimedataarea中的methodarea(方法区域) Java程序员可以extendsjava lang ClassLoader类来写自己的Classloader
Executionengine子系统的作用
执行classes中的指令 任何JVMspecification实现(JDK)的核心都是Executionengine 不同的JDK例如Sun的JDK和IBM的JDK好坏主要就取决于他们各自实现的Executionengine的好坏
Nativeinterface组件
与nativelibraries交互 是其它编程语言交互的接口 当调用native方法的时候 就进入了一个全新的并且不再受虚拟机限制的世界 所以也很容易出现JVM无法控制的nativeheapOutOfMemory
RuntimeDataArea组件
这就是我们常说的JVM的内存了 它主要分为五个部分——
Heap(堆) 一个Java虚拟实例中只存在一个堆空间
MethodArea(方法区域) 被装载的class的信息存储在Methodarea的内存中 当虚拟机装载某个类型时 它使用类装载器定位相应的class文件 然后读入这个class文件内容并把它传输到虚拟机中
JavaStack(java的栈) 虚拟机只会直接对Javastack执行两种操作 以帧为单位的压栈或出栈
ProgramCounter(程序计数器) 每一个线程都有它自己的PC寄存器 也是该线程启动时创建的 PC寄存器的内容总是指向下一条将被执行指令的饿地址 这里的地址可以是一个本地指针 也可以是在方法区中相对应于该方法起始指令的偏移量
Nativemethodstack(本地方法栈) 保存native方法进入区域的地址
lishixinzhi/Article/program/Java/hx/201311/26038
2023-11-22 广告