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
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 计算机体系结构
遵循冯诺依曼计算机体系结构
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成神之路(一)---咱们为什么要学习JVM相关推荐
- JVM成神之路-Java内存模型(JMM)
Java 内存模型基础 什么是 Java 内存模型(JMM-共享内存模型) 内存模型描述了程序中各个变量(实例域.静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量 ...
- JVM成神之路-HotSpot虚拟机-编译原理、JIT、编译优化
Java编译原理 什么是字节码.机器码.本地代码? 字节码是指平常所了解的 .class 文件,Java 代码通过 javac 命令编译成字节码 机器码和本地代码都是指机器可以直接识别运行的代码,也就 ...
- JVM成神之路-JVM内存结构
线程私有 程序计数器 当前线程所执行的字节码的行号指示器 对于 Java 方法,记录正在执行的虚拟机字节码指令的地址:对于 native 方法,记录值为空(Undefined) 唯一一个Java 虚拟 ...
- JVM成神之路-类加载机制-双亲委派,破坏双亲委派
概述 概念 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接时候用的Java类型. 类的生命周期 类从被加载到虚拟机内存中开始,到卸载出内存 ...
- JVM成神之路-Java垃圾回收
Java垃圾回收机制 为什么要进行垃圾回收? 随着程序的运行,内存中存在的实例对象.变量等信息占据的内存越来越多,如果不及时进行垃圾回收,必然会带来程序性能的下降,甚至会因为可用内存不足造成一些不必要 ...
- JVM成神之路(二)-- JDK,JER与JVM的关系
关于文章 JVM系列每一篇文章我都录制了对应的视频,由于CSDN不能直接发送视频资料,如果想要作者录制的免费视频资料,可以加QQ:3139882589.这个是作者QQ,如果有问题想跟作者咨询,也可以加 ...
- JVM成神之路-JVM引用模型
本文通过探析Java中的引用模型,分析比较强引用.软引用.弱引用.虚引用的概念及使用场景,知其然且知其所以然,希望给大家在实际开发实践.学习开源项目提供参考. Java的引用 对于Java中的垃圾回收 ...
- JVM成神之路(十一) -- JVM常用命令解析
3.2 常用命令 3.2.1 jps 查看java进程 The jps command lists the instrumented Java HotSpot VMs on the target sy ...
- JVM成神之路-Java对象模型
首先我们要知道: 在jvm的内存结构中,对象保存在堆中,而我们在对对象进行操作时,其实操作的是对象的引用. Java对象包含三个部分 一个Java对象可以分为三部分存储在内存中,分别是:对象头(Hea ...
- (八)JVM成神路之GC分区篇:G1、ZGC、ShenandoahGC高性能收集器深入剖析
引言 在<GC分代篇>中,我们曾对JVM中的分代GC收集器进行了全面阐述,而在本章中重点则是对JDK后续新版本中研发推出的高性能收集器进行深入剖析,但在开始前,先来看看JDK的发布记录中关 ...
最新文章
- ajax和map返回数据类型,ajax请求后台返回map类型并如何展示
- 自定义表单mysql_自定义表单,计算答案然后更新mysql DB(Custom form, calculate answer then update mysql DB)...
- 最大熵模型(Maximum Etropy)—— 熵,条件熵,联合熵,相对熵,互信息及其关系,最大熵模型。。...
- Bash的基础知识man手册
- 科罗拉多州立大学计算机科学专业,美国科罗拉多州立大学有哪些好专业?
- 内存管理相关【内存布局内存管理方案】
- SpringCloud与dubbo的区别
- DSOfile,修改windows系统文件摘要
- android横向多布局约束,Android约束布局中心水平对齐Textview和Imageview不工作
- 质量故事(2)---降落伞的真实故事
- f score matlab,机器学习中如何用F-score进行特征选择
- 前端学习笔记之品优购项目(一) 3.15
- excel取消隐藏_Excel教程:一键取消隐藏工作表
- Android中屏蔽返回键,HOME键以及模拟HOME键返回效果的方法
- 计算机图书管理系统测试用例,图书管理系统测试用例设计.doc
- Linux系统网络配置动态ip地址 -连通网络
- windows10电脑如何获取administrator权限
- jenkins api使用_使用管理API和Jenkins作为IBM App Connect Professional部署自动化的持续集成引擎
- ORACLE ORA错误码大全 (备忘)
- 大数据之flink数据一致性