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的优秀特性

走进JVM

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.

走进JVM

 

 

 

 

相关文章: