1,什么是JVM?
- JVM 是 java虚拟机,是用来执行java字节码(二进制的形式)的虚拟计算机。
- jvm是运行在操作系统之上的,与硬件没有任何关系。
注:字节码是Java虚拟机的机器语言。是独立于平台的,由运行在windows中的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码(二进制)是特定于平台的,如果它是在Windows x86中编译的,它将仅在Windows x86中运行。
2,JVM的分类
类加载子系统。
运行时数据区 [ 我们核心关注这里 的栈、堆、方法区 ]。
执行引擎(一般都是JIT编译器和解释器共存)
JIT编译器(主要影响性能):编译执行; 一般热点数据会进行二次编译,将字节码指令变成机器指令。将机器指令放在方法区缓存。
解释器(负责响应时间,他的响应时间很快):逐行解释字节码
3,JVM的体系结构
1、入口是编译好的字节码文件(编译器前端)-->经过类加载子系统(将我们的字节码加载到内存当中,生成一个class对象,中间经过三步:加载--->链接--->初始化)
2、在内存中,多个对象共享内存的是方法区和堆区(多个线程共享区)。
3、Java虚拟机栈,本地方法栈,程序计数器每一个线程独有一份。
4、执行引擎:解释器(解释运行),jit及时编译器(编译器后端),垃圾回收器三部分。
4、JVM内存管理
4.1、JVM内存组成结构
1)堆
所有通过new创建的对象的内存都在堆中分配,堆的大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Space和To Space组成,结构图如下所示:
- 新生代。新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例
- 旧生代。用于存放新生代中经过多次垃圾回收仍然存活的对象
- 持久带(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等。可通过-XX:PermSize和-XX:MaxPermSize来指定持久带初始化值和最大值。Permanent Space并不等同于方法区,只不过是Hotspot JVM用Permanent Space来实现方法区而已,有些虚拟机没有Permanent Space而用其他机制来实现方法区。
2)栈
每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。
-xss:设置每个线程的堆栈大小. JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话, 1M 是绝对够用了的。
3)本地方法栈
用于支持native方法的执行,存储了每个native方法调用的状态。
4)方法区
存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。
3.2、图解JVM内存