记得上一次看jvm相关的知识还是在大四的时候,两年过去了,记忆已经逐渐模糊。现在来重识一下jvm,希望温故而知新,一些重要的知识点我会在博客上把学习的知识记录下来。 想要了解jvm,就一定需要了解java虚拟机是如何使用内存的,要不在出现内存泄漏和内存溢出等问题时,我们是没法准确地排查出错误的,下面就让我一起来重新认识一下java虚拟机在执行java程序的过程中的运行时数据区。 参照上图,我们来进一步了解一下运行时数据区中各个区域的作用和详细情况。 一.程序计数器 1.从最简单的程序计数器说起,程序计数器就是当前线程执行字节码的 行号指示器 ,字节码解释器工作时就是通过改变这个计数器的值来选去下一跳需要执行的字节码指令, 分支, 循环, 跳转, 异常处理,线程恢复等基础功能都需要依赖这个计数器 来完成。 2.每条线程都需要有一个独立的程序计数器, 各条线程之间的计数器 互不影响, 独立存储 , 我们称这类内存区域为"线程私有内存"。 3.如果线程正在执行的是一个Java方法, 这个计数器记录的是正在执行的虚拟机字节码指令的地址; 如果正在执行的是Native方法, 这个计数器值则为空(Undefined)。 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。 二.java虚拟机栈 1.与程序计数器一样, Java虚拟机栈也是线程私有的