JVM入门看着一篇就够了
1.为什么会有JVM?
JVM是为了提供一整套完全模拟硬件计算机并进行内存管理(创建和垃圾回收)的标准规范。它是一种规定好的标准规范,定义了字节码文件在内部运行的相关标准和规范
2.JVM到底是什么?
JVM,Java Vitual Machine,中文就是Java虚拟机。和名字一样就是个虚拟机器,来模拟通用的计算机,有着一套虚拟的完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM是基于栈结构的运行方式。不符合这种要求的,不是JVM,比如Dalvik虚拟机就不能称作JAVA虚拟机,因为Dalvik是基于寄存器。至于ART虚拟机是基于_____?
3.JVM的结构是啥样的?
JVM的结构分为三部分:
类装载子系统、运行时数据区、执行引擎。如下图
三者之间的联系如下图:
(1)类装载子系统
what:
将字节码文件加载并生成在堆区的Class对象。
(1)将描述类的字节码文件加载进到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。
(2)类的加载是指将类的.class文件中的二进制数据读入到内存中,然后将其放在运行时数据区的方法区,然后在堆区创建一个Class对象,用来封装类在方法区内的数据结构。类的加载最终产品是位于堆区中的Class对象。Class对象封装类在方法区内的数据结构,并向工程师提供访问方法区的数据结构的接口。
(2)运行时数据区
虚拟机栈、堆区、方法区、本地方法栈区、程序计数器。
(a)栈区
1.保存的数据类型:
基本数据对象 对象应用
2.特点:
(1)存取速度快。
(2)数据大小和生存期确定,缺乏灵活性。
(b)堆区
1.保存的数据类型:
对象
2.特点:
(1)动态分配内存大小。
(2)存取速度慢。
( c)方法区
1.保存的数据类型:
class字节码文件 static变量 常量 常量池
2.特点:
(1)动态分配内存大小。
(2)存取速度慢。
(d)本地方法区
在本地方法栈中执行非java语言编写的代码,例如C/C
(e)程序计数器
1.what
程序计数器是一块较小的内存空间,可以看成当前线程所执行的字节码的行号指示器
2.特点
(1)线程私有
多线程执行时,会分配的是CPU的时间片,当一个线程失去时间片时,需要记录所执行的位置。
(2)JVM的规则中唯一一个没有规定OOM的区域!
记录的是字节码文件的行号,因为在执行前已经知晓范围,所以,不存在OOM
(3)如果正在执行的是Native方法,这个计数器的值为空!
Native方法并没有编译成执行的字节码文件,所以,就不存在字节码文件的行号
(3)执行引擎
1.JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。
2.字节码的执行是由JVM执行引擎来完成
4.相关知识
(1)直接内存
(1)what:
JDK1.4引入的直接操作Native内存的NIO(IO方式),避免了Java的堆内存与Native堆内存的数据复制。
(2)how
堆内存的DirectByteBuffer进行操刀。
5.巨人肩膀
1.https://blog.csdn.net/jiangyang100/article/details/90614280
2.https://www.cnblogs.com/natian-ws/p/10731270.html
3.https://www.cnblogs.com/haimishasha/p/11229379.html
4.https://www.cnblogs.com/ding-dang/p/13086092.html