Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。
Class loader子系统的作用:根据给定的全限定名类名(如 java.lang.Object)来装载class文件的内容到 Runtime data area中的method area(方法区域)。Java程序员可以extends java.lang.ClassLoader类来写自己的Class loader。
Execution engine子系统的作用:执行classes中的指令。任何JVM specification实现(JDK)的核心都是Execution engine,不同的JDK例如Sun 的JDK 和IBM的JDK好坏主要就取决于他们各自实现的Execution engine的好坏。
Native interface组件:与native libraries交互,是其它编程语言交互的接口。当调用native方法的时候,就进入了一个全新的并且不再受虚拟机限制的世界,所以也很容易出现 JVM无法控制的native heap OutOfMemory。
1、PROGRAM COUNTER REGISTER
程序计数器可以当前字节码执行的行号指示器,它跟字节码解释器一起工作。程序计数器可以得到字节码的位置,然后可以得到字节码。通过解释器又可以改变程序计数器的值。去得到下一个字节码。所以分支、循环、转跳、异常处理、线程恢复等基础功能都需要依赖这个程序计数器来完成。
2、JAVA STACK
用于存储局部变量表(局部变量表存放了编译器可知的各种基本数据类型)、操作数栈、动态链接、方法出口等信息。
3、NATIVE MOTHED STACK
它跟JAVA STACK差不多,不过NATIVE MOTHED STACK只是为本地虚拟机使用到的Native方法服务的。
4、HEAP
Java堆是被所有线程共享的一块区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实际都在这里分配内存。Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”。如果从内存回收的角度来看,由于收集器基本都采用分代收集算法,所以Java堆中还可以细分为:新生代和老年代。由于这个过分复杂,这里就不讨论了。
5、METHOD AREA
方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量表。
参考书籍:深入理解Java虚拟机