1、学之前存在的问题
1、你被JVM伤害过吗?
你是否也遇到过这些问题?
- 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM!
- 想解决线上JVM GC问题,但却无从下手。
- 新项目上线,对各种JVM参数设置一脸茫然,直接默认吧,然后就JJ了
- 每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优JVM参数,如何解决GC、OOM等问题,一脸懵逼。
2、架构师每天都在思考什么?
- 应该如何让我的系统更快?
- 如何避免系统出现瓶颈?
2、Java语言及Java生态圈
1、Oracle JDK与Open JDK什么关系?
image-20231119230300935
官方的说明:https://www.oracle.com/cn/java/technologies/javase-downloads.html Oracle Customers and ISVs targeting Oracle LTS releases: Oracle JDK is Oracle's supported Java SE version for customers and for developing, testing, prototyping or demonstrating your Java applications. End users and developers looking for free JDK versions: Oracle OpenJDK offers the same features and performance as Oracle JDK under the GPL license .
Oracle JDK下载路径:https://www.oracle.com/java/technologies/javase-jdk15-downloads.html Open JDK下载路径:https://cn.azul.com/downloads/zulu-community/?version=java-11-lts&os=windows&architecture=x86-64-bit
Oracle与OpenJDK之间的主要区别
- Oracle JDK版本将每三年发布一次LTS版本,而OpenJDK版本每三个月发布一次。
- Oracle JDK将更多地关注稳定性,它重视更多的企业级用户,而OpenJDK经常发布以支持其他性能,这可能会导致不稳定。
- Oracle JDK支持长期发布的更改,而Open JDK仅支持计划和完成下一个发行版。
- Oracle JDK根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。使用Oracle平台时会产生一些许可影响。如Oracle 宣布的那样,在没有商业许可的情况下,在2019年1月之后发布的Oracle Java SE 8的公开更新将无法用于商业,商业或生产用途。但是,OpenJDK是完全开源的,可以自由使用。
- Oracle JDK的构建过程基于OpenJDK,因此OpenJDK与Oracle JDK之间没有技术差异。
- 顶级公司正在使用Oracle JDK,例如Android Studio,Minecraft和IntelliJ IDEA开发工具,其中Open JDK不太受欢迎。
- Oracle JDK具有Flight Recorder,Java Mission Control和Application Class-Data Sharing功能,Open JDK具有Font Renderer功能,这是OpenJDK与Oracle JDK之间的显着差异。
- Oracle JDK具有良好的GC选项和更好的渲染器,而OpenJDK具有更少的GC选项,并且由于其包含自己的渲染器的分布,因此具有较慢的图形渲染器选项。
- 在响应性和JVM性能方面,Oracle JDK与OpenJDK相比提供了更好的性能。
- 与OpenJDK相比,Oracle JDK的开源社区较少,OpenJDK社区用户的表现优于Oracle JDK发布的功能,以提高性能。
- 如果使用Oracle JDK会产生许可影响,而OpenJDK没有这样的问题,并且可以以任何方式使用,以满足完全开源和免费使用。
- Oracle JDK在运行JDK时不会产生任何问题,而OpenJDK在为某些用户运行JDK时会产生一些问题。
- 根据使用方的使用和许可协议,现有应用程序可以从Oracle JDK迁移到Open JDK,反之亦然。
- Oracle JDK将从其10.0.X版本将收费,用户必须付费或必须依赖OpenJDK才能使用其免费版本。
- Oracle JDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本。
- Oracle JDK以前的1.0版以前的版本是由Sun开发的,后来被Oracle收购并为其他版本维护,而OpenJDK最初只基于Java SDK或JDK版本7。
- Oracle JDK发布时大多数功能都是开源的,其中一些功能免于开源,并且根据Sun的许可授权,而OpenJDK发布了所有功能,如开源和免费。
- Oracle JDK完全由Oracle公司开发,而Open JDK项目由IBM,Apple,SAP AG,Redhat等顶级公司加入和合作。
2、JDK与JVM是什么关系?
这又不得不掏出这张图了
image-20231119230352246
如何理解Java是跨平台的语言?
image-20231119230443996
“write once, run anywhere.”
- 当Java源代码成功编译成字节码后,如果想在不同的平台上面运行,则无须再次编译
- 这个优势不再那么吸引人了。Python、PHP、Perl、Ruby、Lisp等有强大的解释器。跨平台似乎已经快成为一门语言必选的特性。
如何理解JVM跨语言的平台?
image-20231119230522743
Java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。
Java不是最强大的语言,但是JVM是最强大的虚拟机。
3、Java不存在内存溢出?内存泄漏?
image-20231119230556820
java = (c )--;
垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。
4、Java发展的几个重大事件?
1、说说你认识的JVM?
JVM的种类有哪些呢?
- Sun Classic VM -->解释型
- Exact VM --> Solaris
- SUN公司的 HotSpot VM
- BEA 的 JRockit --> 不包含解释器,服务器端,JMC
- IBM 的 J9
- KVM和CDC/CLDC Hotspot
- Azul VM
- Liquid VM
- Apache Harmony
- Microsoft JVM
- TaobaoJVM
- ==Graal VM --> 2018年,“Run Programs Faster Anywhere”==
![image-20231119230814227](https://javaxiaobear-1301481032.cos.ap-guangzhou.myzijiebao.com/picture-bed/image-20231119230814227.png)
- 谷歌公司开发的Dalvik VM
- 其他JVM:Java Card VM、Squawk VM、JavaInJava、Maxine VM、Jikes RVM、IKVM.NET、Jam VM、Cacao VM、Sable VM、Kaffe、Jelatine JVM、Nano VM、MRP、Moxie JVM
2、JVM的生命周期
虚拟机的启动
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
虚拟机的退出有如下的几种情况:
- 某线程调用Runtime类或System类的exit方法,或 Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
- 程序正常执行结束
- 程序在执行过程中遇到了异常或错误而异常终止
- 由于操作系统出现错误而导致Java虚拟机进程终止
3、JVM的架构与知识脉络图
1、JVM架构图
不同颜色说明:
线程共享区域:方法区、堆
线程私有区域:程序计数器、本地方法站、虚拟机栈
这个架构可以分成三层看:
- 最上层:javac编译器将编译好的字节码class文件,通过java 类装载器执行机制,把对象或class文件存放在 jvm划分内存区域。
- 中间层:称为Runtime Data Area,主要是在Java代码运行时用于存放数据的,从左至右为方法区(永久代、元数据区)、堆(共享,GC回收对象区域)、栈、程序计数器、寄存器、本地方法栈(私有)。
- 最下层:解释器、JIT(just in time)编译器和 GC(Garbage Collection,垃圾回收器)