jvm

http://java.chinaitlab.com/Jvm/906576.htmlhtml

你对JVM内存结构是否了解,这里和你们分享一下,JVM内存结构主要包括两个子系统和两个组件,这两个组件分别是Runtimedataarea(运行时数据区域)组件和Nativeinterface(本地接口)组件。java

JVM内存结构程序员

近期看了看Java内存泄露的一些案例,跟原来的几个哥们讨论了一下,深刻研究发现JVM里面仍是有很多之前不知道的细节,这里稍微剖析一下。先看一看JVM内部结构——编程

JVM内存结构


如图所示,JVM内存结构主要包括两个子系统和两个组件。两个子系统分别是Classloader子系统和Executionengine(执行引擎)子系统;两个组件分别是Runtimedataarea(运行时数据区域)组件和Nativeinterface(本地接口)组件。编程语言

Classloader子系统的做用:ide

根据给定的全限定名类名(如java.lang.Object)来装载class文件的内容到Runtimedataarea中的methodarea(方法区域)。Java程序员能够extendsjava.lang.ClassLoader类来写本身的Classloader。spa

Executionengine子系统的做用:线程

执行classes中的指令。任何JVMspecification实现(JDK)的核心都是Executionengine,不一样的JDK例如Sun的JDK和IBM的JDK好坏主要就取决于他们各自实现的Executionengine的好坏。指针

Nativeinterface组件:htm

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

RuntimeDataArea组件:

这就是咱们常说的JVM的内存了。它主要分为五个部分——

一、Heap(堆):一个Java虚拟实例中只存在一个堆空间

二、MethodArea(方法区域):被装载的class的信息存储在Methodarea的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,而后读入这个class文件内容并把它传输到虚拟机中。

三、JavaStack(java的栈):虚拟机只会直接对Javastack执行两种操做:以帧为单位的压栈或出栈

四、ProgramCounter(程序计数器):每个线程都有它本身的PC寄存器,也是该线程启动时建立的。PC寄存器的内容老是指向下一条将被执行指令的饿地址,这里的地址能够是一个本地指针,也能够是在方法区中相对应于该方法起始指令的偏移量。

五、Nativemethodstack(本地方法栈):保存native方法进入区域的地址

以上五部分只有Heap和MethodArea是被全部线程的共享使用的;而Javastack,Programcounter和Nativemethodstack是以线程为粒度的,每一个线程独自拥有本身的部分。本节关于JVM内存结构简单介绍到这里。

相关文章
相关标签/搜索