JVM成神之路(一)---咱们为什么要学习JVM

关于作者

作者介绍
Carl,前科大讯飞软件开发工程师。上海国民集团健康科技有限公司架构师,武汉颐道圆信息科技有限公司架构师。熟悉Java、Spring、Spring Boot、Spring Cloud、Redis、MyBatis、MQ、数据结构、设计模式等等,开发过诸多大型项目,独立架构过单日接口调用量过亿的企业级项目。有丰富的项目经验。热爱编程,乐于分享。

关于文章

JVM系列每一篇文章我都录制了对应的视频,由于CSDN不能直接发送视频资料,如果想要作者录制的免费视频资料,可以加QQ:3139882589。这个是作者QQ,如果有问题想跟作者咨询,也可以加到我们的java技术交流QQ群。加作者请备注暗号 [CSDN]

参考书籍或资料

 * 《Java 虚拟机规范(Java SE 8版)》
 * 《深入理解 Java 虚拟机  第二版》
 * 《深入理解 Java 虚拟机  第三版》
 * 《实战 Java 虚拟机》

导读

JAVA是目前用户最多,最受欢迎的软件开发技术之一,JAVA的技术体系由(Java程序设计语言、各种硬件平台上的Java虚拟机、Class文件格式、Java API类库、来自商业机构和开源社区的第三方Java类库)构成。在国内,看书太过于枯燥乏味。各类资料文献满天飞。但是系统化的知识确实少之又少,读者从中获取不到自己真正所需要的系统化,体系化的知识。所以我希望能够借助线上途径,通过我的整理,真正让读者获取到系统化的知识。避免读者由于接收信息渠道过于繁杂以及碎片化从而做无用功。

1.3 Java及JVM简介

TIOBE语言热度排行榜:https://www.tiobe.com/tiobe-index/

世界上没有最好的编程语言,如果有,我相信一定是JAVA。

1.4 Java发展的重大事件

1995年5月23日,Java语言诞生

1996年1月,第一个JDK-JDK1.0诞生

1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术

1996年9月,约8.3万个网页应用了JAVA技术来制作

1997年2月18日,JDK1.1发布

1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录

1997年9月,JavaDeveloperConnection社区成员超过十万

1998年2月,JDK1.1被下载超过2,000,000次

1998年12月8日,JAVA2企业平台J2EE发布

1999年6月,SUN公司发布Java的三个版本:标准版(J2SE)、企业版(J2EE)和微型版(J2ME)

2000年5月8日,JDK1.3发布

2000年5月29日,JDK1.4发布

2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机

2001年9月24日,J2EE1.3发布

2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升

2004年9月30日18:00PM,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0

2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名,以取消其中的数字“2”:J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME

2006年12月,SUN公司发布JRE6.0

2010年9月,JDK7.0已经发布,增加了简单闭包功能。

学习JVM的动力

我们为什么要学习JVM呢?我们来看一下官方解释:

Java官网:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-1.html#jvms-1.2

JVM成神之路(一)---咱们为什么要学习JVM_第1张图片

1.Java虚拟机是Java平台的基石,其负责其硬件和操作系统的独立性,其编译的代码很小以及保护用户免受恶意程序攻击的能力。

2.Java虚拟机是一种抽象计算机,像真正的计算机一样,它有一个指令集并在运行时操作各种内存区域。

3.Java虚拟机不承担任何特定的实现技术、主机硬件或主机操作系统,它本身并没有被解释。

4.Java虚拟机不知道Java编程语言,只知道特定的二进制格式,即class文件格式,class文件包含Java虚拟机指令(或字节码)和符号表,以及其他辅助信息。

5.出于安全考虑,Java虚拟机对class文件中的代码施加了强大的语法和结构约束,但是,任何具有可以用有效class文件表示的功能的语言都可以由Java虚拟机托管,由通用的、与机器无关的平台吸引,其他语言的实现者可以将Java虚拟机作为其语言的交付工具。

这是我针对上述语言精炼的一些翻译。这些理由就足以让一部分同学深入的学习JVM了。

但是上述这些理由可能都不足以让我们所有的同学信服,因为现在大部分的攻城狮以及程序猿可能更关注的是跟我们相关的一些问题,那么在这里我就换一种方式让你接受我们的JVM。

  • 如果你在线上遇到了OOM,你是否会束手无策。

  • 线上卡顿是否可能是因为频繁Full GC造成的。

  • 新项目上线,服务器数量以及配置不足,对于性能的扩展只能靠服务器的增加,而不能通过JVM的调优达到实现服务器性能的突破。

  • 面试经常会问到JVM的一些问题,但是当面试官问到你实际的落地点时,你就会茫然不知所措,没有条理性,或者答非所问。

我会慢慢的在学习种理解上面的这些描述。不过在学习之前,由于可能读者的水平可能会有一些不同,所以本堂课我首先会让你们了解一些基础性的知识。

1.1 编程语言

编程语言(英语:programming language),是用来定义[计算机程序]的[形式语言]。它是一种被[标准化]的交流技巧,用来向[计算机]发出指令。一种能够让[程序员]准确地定义计算机所需要使用数据的计算机语言,并精确地定义在不同情况下所应当采取的行动。

总结:就是让人类为了能跟计算机沟通,所以需要学习计算机能够懂的语言

1.2 JAVA基础知识

Java是一门面向对象的编程语言。它不仅吸收了C++语言的优点,而且摒弃了C++中难于理解的多继承和指针的概念。因此,Java语言具有功能强大、使用方便的特点。Java语言作为静态面向对象的编程语言的代表,完美地实现了面向对象的理论,并允许程序员以一种优雅的思维方式编程。

总结:JAVA是面向对象的编程语言

1.3 计算机发展史

  • 1946-1958:电子管计算机
  • 1958-1964:晶体管计算机
  • 1964-1970:集成电路计算机
  • 1970-至今:大规模集成电路计算机
  • 猜想:未来以蛋白质分子作为原材料,量子计算机[已经有了]

1.4 计算机语言发展史

  • 机器语言

    我们把CPU能够直接认识的数据指令,称为机器语言,也就是010101001这种形式

  • 汇编语言

    低级语言,通过汇编器翻译成机器语言

    单片机MOV、PUSH、ADD等指令

    汇编代码比较靠近机器语言,形式差不多,也可以被人看懂,但是相对来说对机器友好,执行效率比较高,移植性差。

    人类操作起来还是不太方便,或者需要专业的人员操作

  • 高级语言

    C、C++、Java、Python、Golang等

    人们终于设计出了像C、C++这类更加贴近人类语言的程序设计语言,由于贴近人使用的语言,称为高级语言,高级语言编写的程序,先要由计算机编译转换成低级的汇编再最终形成机器可执行的代码。

    简单理解就是编程类的语言

1.5 计算机体系结构

遵循冯诺依曼计算机体系结构

JVM成神之路(一)---咱们为什么要学习JVM_第2张图片

1.6 计算机处理数据过程

(1)提取阶段:由输入设备把原始数据或信息输入给计算机存储器存起来

(2)解码阶段:根据CPU的指令集架构(ISA)定义将数值解译为指令

(3)执行阶段:再由控制器把需要处理或计算的数据调入运算器

(4)最终阶段:由输出设备把最后运算结果输出

本质上就是CPU取数据指令然后返回

CPU=存储器+运算器+控制器

1.7 不同厂商的CPU

单核、双核、多核

Intel、AMD、IBM等

不同CPU使用的CPU指令集是不一样的,这就会有不兼容的问题

而且要是直接操作010101这种形式的,非常麻烦并且容易出错,硬件资源管理起来也不方便

1.8 操作系统(OS)

  • 向下对接指令系统、管理硬件资源

  • 向上提供给用户简单的操作命令和界面

1.9 编译型和解释型语言

  • 编译型

使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。

C、C++、GoLang

编译型语言:
	执行速度快、效率高;依靠编译器、跨平台性差些。
	把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序。 
  • 解释型

使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。

是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。

Python、Javascript

解释型语言:
	执行速度慢、效率低;依靠解释器、跨平台性好。
	把做好的源程序翻译一句,然后执行一句,直至结束。
  • JAVA属于什么类型的语言呢?

Java属于编译型+解释型的高级语言

其实并不是因为有javac将Java源码编译成class文件,才说Java属于编译+解释语言,因为在这个编译器编译之后,生成的类文件不能直接在对应的平台上运行。
那为何又说Java是编译+解释语言呢?因为class文件最终是通过JVM来翻译才能在对应的平台上运行,而这个翻译大多数时候是解释的过程,但是也会有编译,称之为运行时编译,即JIT(Just In Time)。
综上所述,Java是一门编译型+解释型的高级语言。

你可能感兴趣的:(JVM成神之路,java,jvm)