1.JVM简介
1.1JVM概念
虚拟机简介:JVM(Java Virtual Machine的简称。Java虚拟机。),JVM是一台被定制过的现实中不存在的计算机。
虚拟机:指通过软件模拟的完整的硬件环境功能的、运行在一个完全隔离的环境中的完整计算机系统。
常见虚拟机:JVM、VMwave、Virtual Box
JVM和其他两个虚拟机的区别:
a.VMwave与VirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器
b.JVM则是通过软件模拟Java字节码指令集,JVM中只是主要保留了PC寄存器,其他寄存器都进行了裁剪
JVM发展史:
最广泛的JVM为HotSpot,在JDK8时整合HotSpot和JRockit VM,优势互补在HotSpot的基础上移植JRockit的优秀特性
2.Java内存区域与内存溢出溢出
2.1运行时数据区域
线程私有区域:程序计数器、Java虚拟机栈、本地方法栈
线程共享区域:Java堆、方法区、运行时常量池
2.1.1程序计数器(线程私有)
记录当前正在执行的虚拟机字节码指令的地址,即线程执行的代码的位置。
在执行一个Native方法时,计数器为空
程序计数器不会出现内存溢出,因为虚拟机中没有规定OOM情况的区域
2.1.2Java虚拟机栈(线程私有)
虚拟机栈描述的是Java方法执行的内存模型:每当方法执行时都会创建一个栈帧用于存储数据,在每个方法从调用直至执行完成的过程,对应一个栈帧在虚拟机栈的出栈与入栈,生命周期与线程相同。
常见异常:
a.StackOverFlowError,栈溢出异常
b.OutOfMemoryError(OOM),动态扩展时无法申请到足够的空间
2.1.3本地方法栈(线程私有)
在HotSpot虚拟机中,本地方法栈与虚拟机栈时同一块区域
2.1.4Java堆(终端java -X 可以设置堆区大小)
Java堆用于存储对象实例
2.1.5方法区
用于存储已被虚拟机加载的类信息,即编译器编译后的代码等数据。
2.1.6运行时常量池(方法区的一部分)
存放字面量与符号引用。
JDK1.7之前在方法区,之后被移到了堆区。
2.2Java堆异常
a.内存泄露
b.内存溢出
2.3虚拟机栈和本地方法栈溢出
a.栈溢出
b.OOM
可以使用递归无出口尝试一下,一般可以递归深度1000-2000.