一、介绍:
JVM 是用于识别.class ,jar等字节码文件,将字节码翻译成操作系统可以识别的机器码的虚拟机,主要充当的是翻译的工作。
特点:跨平台,跨语言的。
JRE:提供了我们开发所需要的基础类库,也就是允许所需要的基本类库
JDK:提供了一套工具集(如javac ,javap,javah ,javaw等工具)
二、JVM加载字节码文件的运行过程:
1、运行时数据区
运行时数据区主要包括一下内容:方法区、堆、虚拟机栈,本地方法栈、程序计数器 五部分的内容
1.1 程序计数器
由于操作系统的时间片轮转机制,程序线程会在运行过程中进行切换轮流执行,这时候程序计数器就是保存字节码在程序线程运行执行的偏移量地址(也就是在字节码文件签名的序号)
说白了,就是在操作系统切换线程执行时,保存当前线程执行的位置,方便下次恢复执行时可以继续执行
程序计数器是唯一不会发生OOM的内存区。
1.2 虚拟机栈
存储当前线程运行方法所需要的数据,指令,返回地址等信息。虚拟机栈大约是1M大小。
执行顺序:先进后出
虚拟机栈就像是一个子弹夹,而线程的方法就像是每一颗子弹,在运行过程中不停的进栈出栈,完成方法的执行。
一个方法就是一个栈帧。
1.3 本地方法栈:用于保存C/C++实现的本地native的方法
1.4 方法区(元空间)
主要保存类的信息,常量,静态变量,编译期编译生成的代码,该区域比较难回收。
1.5 堆
用于存放java的对象实例,数组等内容,该区域的对象回被频繁的回收
2、 直接内存:
不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,NIO会使用直接内存,不受java堆大小的限制
3、运行时内存关系图:
三、JVM允许Java类的内存步骤:
1)申请内存
2)类加载---将.class放入到方法区
3)将常量,静态变量放入方法区
4)虚拟机栈:将方法加入栈帧,将new出来的对象引用加入到局部变量表中
5)入堆:将new出来的对象加入到堆中
四、内存溢出的场景分析:
常见的出现内存溢出的场景有:
五、虚拟机优化技术:
六、堆和栈辨析:
关于JVM内存管理的一些知识点就先介绍到这里,下一节我们着重讲一下虚拟机是如何管理对象的。