本文从 JVM 布局入手,先容了 Java 内存打点、工具建设、常量池等基本常识,劈口试中 JVM 相关的基本题目举办了讲授。
写在前面(常晤口试题)
1 概述
对付 Java 措施员来说,在虚拟机自动内存打点机制下,不再需要像C/C++措施开拓措施员这样为内一个 new 操纵去写对应的 delete/free 操纵,不容易呈现内存泄漏和内存溢出问题。正是因为 Java 措施员把内存节制权利交给 Java 虚拟机,一旦呈现内存泄漏和溢出方面的问题,假如不相识虚拟机是奈何利用内存的,那么排查错误将会是一个很是难题的任务。
2 运行时数据区域
Java 虚拟机在执行 Java 措施的进程中会把它打点的内存分别成若干个差异的数据区域。
这些构成部门一些是线程私有的,其他的则是线程共享的。
线程私有的:
线程共享的:
措施计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码表明器事情时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、轮回、跳转、异常处理惩罚、线程规复等成果都需要依赖这个计数器来完。
别的,为了线程切换后能规复到正确的执行位置,每条线程都需要有一个独立的措施计数器,昆山软件开发,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。
从上面的先容中我们知道措施计数器主要有两个浸染:
留意:措施计数器是唯不会呈现 OutOfMemoryError 的内存区域,它的生命周期跟着线程的建设而建设,跟着线程的竣事而灭亡。
与措施计数器一样,Java虚拟机栈也是线程私有的,它的生命周期和线程沟通,描写的是 Java 要领执行的内存模子。
Java 内存可以粗拙的区分为堆内存(Heap)和栈内存(Stack)个中栈就是此刻说的虚拟机栈,可能说是虚拟机栈中局部变量表部门。 (实际上,Java虚拟机栈是由一个个栈帧构成,而每个栈帧中都拥有局部变量表、操纵数栈、动态链接、要领出口信息)
局部变量表主要存放了编译器可知的各类数据范例(boolean、byte、char、short、int、float、long、double)、工具引用(reference范例,它差异于工具自己,大概是一个指向工具起始地点的引用指针,也大概是指向一个代表工具的句柄或其他与此工具相关的位置)。
Java 虚拟机栈会呈现两种异常:StackOverFlowError 和 OutOfMemoryError。
Java 虚拟机栈也是线程私有的,每个线程都有各自的Java虚拟机栈,并且跟着线程的建设而建设,跟着线程的灭亡而灭亡。
2.3 当处所法栈
和虚拟机栈所发挥的浸染很是相似,区别是: 虚拟机栈为虚拟机执行 Java 要领 (也就是字节码)处事,而当处所法栈则为虚拟机利用到的 Native 要领处事。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。
当处所法被执行的时候,在当处所法栈也会建设一个栈帧,用于存放应当处所法的局部变量表、操纵数栈、动态链接、出口信息。
要领执行完毕后相应的栈帧也会出栈并释放内存空间,也会呈现 StackOverFlowError 和 OutOfMemoryError 两种异常。
2.4 堆
Java 虚拟机所打点的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时建设。此内存区域的独一目标就是存放工具实例,险些所有的工具实例以及数组都在这里分派内存。