[java虚拟机]--(1)java内存区域--(1)线程私有区域

声明:

Author:赵志乾

Date:2018-6-17

Declaration:All Right Reserved!!!


背景知识:

1、jvm在启动时会拉起一些守护线程,其中包括垃圾回收线程。垃圾回收线程的意义在于实现虚拟机内存区域的自管理,尤其是在堆内存的管理上。下面是C++应用和Java应用在使用堆内存上的对比:

    C++应用:堆内存的使用周期完全由应用本身来决定,其遵循“谁申请、谁释放,谁创建、谁销毁”的原则。

    Java应用:堆内存的使用周期由应用和虚拟机共同完成,应用负责堆内存的申请和使用,而虚拟机则负责堆内存的回收。

注:虚拟机中的gc(垃圾回收)线程作为守护线程,其本身也会占用CPU和内存。其所涉及的gc算法也是应用性能优化的重点。

2、虚拟机为了便于管理从操作系统拿到的内存,其将所占用的内存从概念上划分出多个不同区域。这些区域各司其职、相互协作,支撑java应用的整个生命周期。

区域:堆、虚拟机栈、本地方法栈、方法区、程序计数器(PC)。其中,虚拟机栈、本地方法栈和PC为线程私有,而堆和方法区为线程间共享。

虚拟机线程私有化内存区域:

1、程序计数器(PC)

    PC的概念源于CPU中的一个寄存器,如8086芯片中的IP寄存器,又称为指令指针。其作用是指向当前时刻需要获取指令的存放地址。

    虚拟机是个逻辑概念,其通过运行相应代码来模拟物理设备的行为。所以将物理设备中的IP寄存器的理念迁移到内存中,使用PC来表示。故PC的内容也是当前要获取指令的地址。

    虚拟机中通常会运行多个线程,如应用线程和守护线程。为了便于线程之间的快速切换,其将PC线程私有化。

注:由于PC存放的仅仅是一条指令的地址,所以其本身不会出现OutOfMemoryError异常。这也是虚拟机内存中唯一不会出现OutOfMemoryError异常的区域。

2、虚拟机栈

    微处器中最核心的两个概念:栈和中断。其中,栈的存在实现了方法调用,其依据当前线程的调用层级进行构建,位于栈顶的栈帧一定是当前方法所对应的栈帧。每个栈帧通常会包含以下几个部分:返回值、返回信息(地址)、入参、局部变量。

     C/C++中,允许将数组的完整内容以局部变量的形式存放在栈帧上。其面临的一个风险就是数组越界覆写返回信息,进而遭受攻击。当前某些型号设备号称加入了栈帧覆写校验,能够在一定程度上降低栈帧覆写攻击的风险。

    虚拟机则通过将数组、对象的实体存放于堆中,来避免栈帧覆写风险。即栈帧上存放的每一项所占空间大小非常明确,故其在编译时期就能够确定方法对应栈帧所占的最大槽数。由于虚拟机栈依据当前线程的调用层级进行构建,所以它也是线程私有的。

3、本地方法栈

本地方法栈和虚拟机栈的作用一样,只不过其服务于Native方法。


邮箱:[email protected]

参考资料:《深入理解java虚拟机》--周志明






猜你喜欢

转载自blog.csdn.net/zhaoyaxuan001/article/details/80721530