1 虚拟机的内存结构如下:
执行流程为:虚拟机的类加载器把Class文件加载到方法区,虚拟机栈中的线程使用执行引擎执行,执行时需要创建对象,创建的无论是方法区的还是本地库的对象都存在堆中。需要使用的本地库文件会通过本地库接口加载到本地方法栈中。
内存区域可以分为五个部分:程序计数器、虚拟机栈(线程栈)、本地方法栈、堆、方法区。方法区和堆所有线程共享。
java程序计数器(指向当前执行字节码地址,CPU的计数器是指向下一条的地址):每一个线程都有一个相应的程序计数器,线程结束计数器也结束。执行Native Method时使用的是Undefined程序计数器。
虚拟机栈(即线程栈):每个线程都有自己对应的栈,栈的生命周期也和线程一致。栈由栈帧组成,栈帧存放着执行方法需要用到的局部变量、操作数、方法出口等信息,线程每调用一个方法都会创建一个栈帧并把栈帧添加到栈中,栈就是一个队列。方法执行完成出栈。
在一个线程中,调用方法时,当这个方法执行时调用了其他方法,多了就会形成一个方法链。如果这个线程是活跃线程,栈顶的栈帧才是有效的,称为当前栈帧(Current Stack Frame),对应的方法为当前方法(Current Method)。
本地方法栈:Java通过JNI接口调用其他语言编写的程序,多数时候是C。在java程序中使用Native修饰的方法就是本地方法。
堆:存放所有对象实例和数组。是垃圾收集器(GC)管理的主要区域,也称GC堆。
方法区:线程共享区,存放加在过的类信息,常量,静态变量,jit编译代码。
直接内存:不是程序运行时数据区的一部分,也不是虚拟机定义的内存区域。这是在JDK1.4之后加入NIO类,使得Native方法直接分配在堆外内存,其实就是使用本机内存,避免java堆和Native 堆来回复制数据,提高性能。
执行引擎:将字节码即时编译为本地码,执行。