JVM
学习 Java 肯定会听说过 JVM,从字面上看,JVM 指的是 Java Virtual Machine(Java虚拟机),在作者之前几次面试经历中,经常会被问到什么是 JVM 和 JVM 调优的问题。也正是因为有了 JVM 的存在,才使得 Java 语言拥有跨平台的特性。
我认为,JVM 不能用Java虚拟机潦草概括,JVM 是一种Java虚拟机规范,而众多大厂家通过实现此规范研发出不同版本的 JVM。例如,sun公司的 HotSpot VM,BEA公司的JRockit,IBM公司的J9 JVM 等等。
下图是 JVM 与操作系统和硬件体系结构图,可以很清晰的看出,JVM 是运行在操作系统之上的,它与硬件没有直接交互。
JVM 内存模型
JVM 的内存模型由以下几大重要部分组成,其中的运行时数据区就是平时抛出RuntimeException的地方:
- 类加载器:将 Java 中 .class 的字节码文件加载到 JVM 的内存区域中。
- 方法区:属于线程共享区域,存储已被类加载器加载的类信息、常量、静态变量等数据。
- 堆:属于线程共享区域,主要是存放对象实例和数组,所有被 new 出来的对象都存放在堆中。
- 虚拟机栈:属于线程隔离区域,方法执行的内存模型,方法从调用直至执行结束,对应着一个栈帧从虚拟机栈中入栈到出栈的过程。
- 本地方法栈:属于线程隔离区域,为虚拟机使用到的 Native 方法服务。
- 程序计数器:属于线程隔离区域,字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成。
- GC(垃圾回收器):Java 垃圾自动回收的核心,会自动检测并销毁程序中超过生命周期的对象。