虚拟机的内存布局如下
其中各部分的作用如下
1、程序计数器:
指向当前线程正在执行的字节码的地址,如果一个线程正在执行一个方法,那么当前线程的
程序计数器就指向正在执行的字节码的地址,线程的上下文切换和它有很大的关系,线程私有的,
每个线程有单独的一份,线程之间互不干扰
2、虚拟机栈:
线程私有,和线程的生命周期相同,每一个方法都会产生一个栈帧,里面存放局部变量表,操
作数栈,动态链接,方法出口等信息一个方法从调用开始到执行结束都对应着入栈和出栈的过程。
其中局部变量表存放编译期可知基本类型、引用类型和returnAddress类型
局部标量表所需要的内存在编译期就已经确定了
3、本地方法栈:
和虚拟机栈很类似,只不过服务于本地方法
4、java堆
所有线程共享
几乎所有的对象都在这里分配,但随着别的优化技术的发展,这句话不再这么绝对了
java堆还可以细分为新生代和老年代
java堆上的内存不一定物理连续,只要逻辑连续就可以了
5、方法区
所有线程共享
主要存放被虚拟机加载类信息、常量、静态变量、即时编译器编译后的代码数据等数据
虚拟机规范把方法区归类为堆的一个逻辑部分,但是它又有一个名字叫 NON-Heap,用来和堆区分
6、运行时常量池
它是方法区的一个部分,用于存放在编译器生成各种字面量和符号引用
7、直接内存:
既不属于运行时数据区的一部分也不属于java虚拟机规范中的一部分
jdk1.4引入了NEW-IO的概念,即可以直接申请物理机的一块内存,
在一些场景可以显著提高性能,因为避免了java对和物理内存的来回复制
最后附上高清壁纸一张