你对JVM内存结构是否了解这里和大家分享一下JVM内存结构主要包括两个子系统和两个组件这两个组件分别是Runtimedataarea(运行时数据区域)组件和Nativeinterface(本地接口)组件 JVM内存结构 近期看了看Java内存洩露的一些案例跟原来的几个哥们讨论了一下深入研究发现JVM里面还是有不少以前不知道的细节这里稍微剖析一下先看一看JVM内部结构—— 如图所示JVM内存结构主要包括两个子系统和两个组件两个子系统分别是Classloader子系统和Executionengine(执行引擎)子系统两个组件分别是Runtimedataarea(运行时数据区域)组件和Nativeinterface(本地接口)组件 Classloader子系统的作用 根据给定的全限定名类名(如javalangObject)来装载class文件的内容到Runtimedataarea中的methodarea(方法区域)Java程序员可以extendsjavalangClassLoader类来写自己的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方法进入区域的地址 以上五部分只有Heap和MethodArea是被所有线程的共享使用的而JavastackProgramcounter和Nativemethodstack是以线程为粒度的每个线程独自拥有自己的部分本节关于JVM内存结构简单介绍到这里 |