1. Java程序运行时,内存是如何分配的。
Java虚拟机在执行Java程序时,会把它所管理的内存划分为若干个区域,这些区域各有各的用处、创建销毁的时间。如图所示:
Java虚拟机运行时数据区
1.1 程序计数器
程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码行号指示器。在虚拟机的模拟概念里,字节码解释器工作室就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
每个线程都有一个独立的程序计数器。这是因为,Java虚拟机的多线程,是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(单个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。各条线程之间的计数器互不影响,独立存储,是线程私有的内存。
如果线程正在执行的是一个Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是Native方法,程序计数器为空(Undifined)。
1.2 Java虚拟机栈
这里就是我们通常所说的栈内存。Java虚拟机栈也是线程私有的,它的生命周期与线程相同。每个Java方法在执行的同时,会创建一个栈帧,用于完成存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完毕,对应着一个栈帧在虚拟机栈中入栈和出栈的过程。
虚拟机栈中的局部变量表存放了编译器克制的各种基本数据类型、对象引用(是指向对象其实地址的引用指针,)
网友评论