本文是《深入理解Java虚拟机:JVM高级特性与最佳实践《第二版》读书笔记。
概述
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。
对于Java开发人员来说,不需要像C++程序员那样去管理内容回收的事情,Java虚拟机会干这些事情。
运行时数据区域
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。看下图:
程序计数器
程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器,在分支、循环、跳转、异常、线程恢复等都依赖这个计数器。
由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。
程序计数器是唯一一个没有 OOM 问题的区域,生命周期随线程的创建而创建,随线程结束而结束。