前言
- 我们的应用程序的架构一般都是这样 可以看出jvm是最底层
- 很多人只注重如何使用框架去搭建我们的应用程序,而不关注我们的java底层的。其实这个思想是错的,要想为什么我们的项目上线会挂, 当他出现这种情况的时候我们应该怎么解决, 而不是作为一个只会选择默认值, 出错也只会傻看着等待别人救助的小白鼠,我们如果想做个掌握雷电的人就开始着手学习jvm把!
- 我们在这思考两个问题 希望学完jvm能够解决
- 应该如何让我的系统更快?
- 如何避免系统出现瓶颈?
- 跟着这篇文章走进这个神秘的jvm!
参考书籍
- 深入理解java虚拟机
- 实战java虚拟机
- 官方的java规范
- 视频:尚硅谷jvm视频
jvm的位置
jvm是运行在操作系统之上的,它与硬件是没有交互的
java虚拟机就是二进制字节码文件的运行环境
jdk、jre、jvm三者的关系:
- jdk是程序员开发的工具包, 它包括了java的一些命令javac编译需要用到
- jre运行环境(运行时类库)VA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。
- JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
特点:
- 一次编译,到处运行
- 自动内存管理
- 自动垃圾回收功能
对于电脑来说:是基于操作系统之上
java官网的jvm
java程序要想运行成功- 写成.java的文件 编译成.class文件 叫前端编译器(javac)
- 解释运行 后端编译器(jvm做的)
jvm的整体结构
- 它采用解释器与及时编译器并存的架构(hotspot虚拟机)
- 多线程共享方法区和堆, 而栈本地方法栈和程序计数器是每个线程独有一份的。
java代码执行流程
java对字节码文件的格式要求非常严格很难攻破(可以试试哈哈)
有个有趣的事情便是 java的二进制字节码文件的开头是个cafe刚好对上jdk的吉祥物图标。用sublime-Text打开
架构模型
java的虚拟机是一种基于栈的指令集架构(只有程序计数器), 而另一种指令集架构是基于寄存器的
二者的区别:
- 基于栈
- 设计简单
- 指令集小、指令多
- 不需要硬件的支持可移植性好, 编译器容易实现
- 避开了寄存器的分配难题但是相同情况下指令多
- 执行性能差
- 基于寄存器
- 指令集庞大
- 依赖于硬件可移植性差
- 性能更加优秀
- 花费更少的指令去完成一项操作
jvm的生命周期
- 虚拟机的启动
java虚拟机的启动时通过引导类加载器创建一个初始类来完成的,,这个类是由虚拟机的具体实现指定的。 - 虚拟机的执行
- 一个运行中的java虚拟机有一个清晰的任务, 执行java程序
- 程序开始执行它才运行, 程序结束就停止
- 执行一个所谓的java程序的时候, 真真正正在执行的是一个叫做java虚拟机的进程
- 虚拟机的退出
第一章到此结束
本章主要讲的是jvm的发展历程以及重大事件,和它的重要性体系结构等, 相当于一个概述,下章主要讲内存结构
第二章已更新
链接:第二章