Electronic Joint Business

Solution for E-Business

JVM基础概念 之一 JVM基本结构剖析

JVM主要包括两个子系统和两个组件。两个子系统分别是Class loader子系统和Execution engine(执行引擎) 子系统;两个组件分别是Runtime data area (运行时数据区域)组件和Native interface(本地接口)组件。 Class loader子系统的作用:根据给定的全限定名类名(如cc.ejb.example.HelloWorld)来装载class文件的内容到 Runtime data area中的method area(方法区域)。 Execution engine子系统的作用:执行classes中的指令。任何JVM specification实现(JDK)的核心都是Execution engine,不同的厂商有自己不同的实现。 Native interface组件:与native libraries交互,是其它编程语言交互的接口。当调用native方法的时候,就进入了一个全新的并且不再受虚拟机限制的世界,所以也很容易出现JVM无法控制的native heap OutOfMemory。 最后是Runtime Data Area组件:这就是我们常说的JVM的内存了。它主要分为五个部分—— Heap (堆):一个Java虚拟实例中只存在一个堆空间 Method Area(方法区域):被装载的class的信息存储在Method area的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中。 Java Stack(java的栈):虚拟机只会直接对Java stack执行两种操作:以帧为单位的压栈或出栈。 Program Counter(程序计数器):每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。 Native method stack(本地方法栈):保存native方法进入区域的地址 以上五部分只有Heap 和Method Area是被所有线程的共享使用的;而Java stack, Program counter 和Native method stack是以线程为粒度的,每个线程独自拥有自己的部分。 方法区 在JVM实例中,加载的类型的相关信息被保存在内存的一个逻辑区域中,称为方法区 method area。当JVM加载一个类型时,它用类装载器查找需要的Class文件。类装载器读入Class文件并以二进制数据的线性流传递给VM。 虚拟机从二进制数据中提取有关类型的信息,并将之保存在方法区中。而保存类里定义的类变量(静态变量)的内存被从方法区中拿走。下面的信息存储在方法区中: 类型信息 The […]

Leave a Reply

Your email address will not be published. Required fields are marked *