Java虚拟机在执行Java程序的时候会把内存划分为几种不同的区域
1) 程序计数器:Java中多线程通过线程轮流切换并分配处理器的执行时间来实现的,那么问题来了,假如一个线程第一次执行完,线程第二次执行的时候它是怎样回到第一次执行的位置的,程序计数器就是解决这个问题的,记录一个线程执行的指令,以便下次执行能够回到原位置,每个线程都有自己的程序计数器(一块较小的内存空间)。
2) 虚拟机栈:描述的是Java方法的内存模型,每执行一个Java方法就会创造一个栈,用于存储局部变量的变量表,方法出口等信息,局部变量表存放基本数据类型和引用(指向堆内存空间中对象的初始地址),也为线程私有,和线程同声明周期。
3) 本地方法栈:作用相似虚拟机栈,虚拟机栈为Java方法提供服务,本地方法栈为虚拟机的Native方法(native是一个计算机函数,一个Native Method就是一个Java调用非Java代码的接口。方法的实现由非Java语言实现,比如C或C++。)提供服务
4) Java堆:几乎所有的对象实例以及数组都要在堆上分配内存空间,为线程共享区域。也是垃圾收集器主要管理的地方。
5) 方法区:线程共享区域,主要存储虚拟机加载的类信息、常量、静态变量,垃圾收集器在这个区域较少出现,回收的主要目标是常量池和类型的卸载。
6) 运行时常量池:属于方法区的一部分,存放常量池(存放编译期生成的各种字面量和符号引用)。