一、运行时的数据区域
java虚拟机在执行java程序的时候会把管理的内存划分为多个区域进行数据管理,不同的区域的创建和销毁时间可能不同。java虚拟机会创建如下区域:
二、程序计数器
程序计数器是内存较小的一块区域,用来记录当前线程所执行到的代码行号,jvm中的解释器的作用就是通过改变计数器的值读取相应的指令。
在多线程的程序中,每个程序需要记录的执行位置不尽相同,所以就需要为每个线程分配一个计数器。因此,计数器就不能由所有程序共享。
三、虚拟机栈
虚拟机栈和程序计数器一样,是程序私有的,是随着线程的创建而创建。虚拟机栈是java方法的执行模型。每个方法对应一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等。
局部变量表存储着8种基本数据类型(byte、short、int、long、float、double、char、boolean)和对象的引用(不是实际的对象,而是指向堆区的对象信息的引用地址)和字节码指令地址。
四、本地方法栈
本地方法栈的用法和虚拟机栈非常相似,唯一的区别是本地方法栈为native方法服务。也有的虚拟机(sun hotpot)将虚拟机栈和本地方法栈合二为一。
五、java堆 (线程共享)
java堆是jvm中占有内存最大的一块,为所有的线程所共享,堆内存主要用于存储所有的对象实例和数组。
java堆是垃圾回收器主要的工作区域,也被称为gc堆,从垃圾回收器的角度:可以分为青年代,老年代。这里的区分是为了更好地清理垃圾,回收内存,提高性能。
六、方法区 (线程共享)
方法区是线程所共享的部分,用于存放类的信息,常量,静态变量,即时编译的代码等数据。
java虚拟机的设计团队把方法区以永久代的方式实现,这并不是一个好的注意,因为容易发生内存泄漏的问题,因此,在jdk1.7,已经把原来在永久代的字符串常量池移出了。
七、 运行时常量池
是方法区的一部分,在类被加载之后,一部分信息被存储到了运行时常量池中,如编译期的字面量和符号。