java基础概念
基本概念
JDK:包括编译器(javac.exe)、开发工具(javadoc.exe、jar.exe、keytool.exe、jconsole.exe)和更多的类库(如tools.jar)等。总结就是Java语言、Java虚拟机、Java API类库
JRE: 支持java运行的基本环境
JIT:just in time
运行时数据区:
JVM的内存结构
程序计数器:
当前代码行号指示器。各个线程计数器互不影响,独立存储。如果是执行Java方法,是虚拟机字节码地址。如果是native方法,计数器为空。唯一一个没有OOM的区域。是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有”的内存。
程序计数器是指CPU中的寄存器,它保存的是程序当前执行的指令的地址(也可以说保存下一条指令的所在存储单元的地址),当CPU需要执行指令时,需要从程序计数器中得到当前需要执行的指令所在存储单元的地址,然后根据得到的地址获取到指令,在得到指令之后,程序计数器便自动加1或者根据转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令。
在JVM规范中规定,如果线程执行的是非native方法,则程序计数器中保存的是当前需要执行的指令的地址;如果线程执行的是native方法,则程序计数器中的值是undefined。由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的。
Java虚拟机栈:
描述Java方法执行的内存模型:每个执行时会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等。每个方法调用到执行完成过程,对应一个栈帧在虚拟机栈中入栈到出栈的过程。线程私有。
局部变量表:
存放编译期可知的各种基本数据类型、对象引用类型(一个指向对象起始地址的引用指针)、returnAddress类型(一个字节码指令地址)。其中64位长度long和double会占用2个局部变量空间,其余占一个。局部变量表所需内存大小是在编译期间完成分配的,方法运行期间不会改变。如果栈深度大于虚拟机允许的深度,将抛出StackOverflowError异常;如果虚拟机栈动态扩张时无法申请到足够的内存,就会抛出OutOfMemoryError异常。