目录
一、JVM内存与垃圾回收篇概述
JVM系列之1:内存与垃圾回收篇
JVM系列之2:字节码与类的加载篇
JVM系列之3:性能监控与调优篇
JVM系列之4:大厂面试题
课件:
01_JVM与Java体系结构
02_类加载子系统
03_运行时数据区概述及线程
04_程序计数器
05_虚拟机栈
06_本地方法接口
07_本地方法栈
08_堆
09_方法区
10_直接内存
11_执行引擎
12_StringTable
13_垃圾回收概述
14_垃圾回收相关算法
15_垃圾回收相关概念
16_垃圾回收器
二、如何看待Java上层技术与JVM
1、前言
作为Java工程师的你曾被JVM伤害过吗?
你是否也遇到过这些问题?
①、运行着的线上系统突然卡死,系统无法访问,甚至直接OOM!
②、想解决线上JVM GC问题,但却无从下手。
③、新项目上线,对各种JVM参数设置一脸茫然,直接默认吧,然后就JJ了
④、每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你实际项目中如何调优JVM参数,如何解决GC、OOM等问题,一脸懵逼。
(大部分Java开发人员,除会在项目中使用到与Java平台相关的各种高精尖技术,对于Java技术的核心Java虚拟机了解甚少。)
开发人员如何看待上层框架
①、一些有一定工作经验的开发人员,打心眼儿里觉得SSM、微服务等上层技术才是重点,基础技术并不重要,这其实是一种本末倒置的“病态”。
②、如果我们把核心类库的API比作数学公式的话,那么 Java 虚拟机的知识就好比公式的推导过程。
计算机系统体系对我们来说越来越远,在不了解底层实现方式的前提下,通过高级语言很容易编写程序代码。但事实上计算机并不认识高级语言
架构师每天都在思考什么?
①、应该如何让我的系统更快?
②、如何避免系统出现瓶颈?
知乎上有条帖子:应该如何看招聘信息,直通年薪50万+?
①、参与现有系统的性能优化,重构,保证平台性能和稳定性
②、根据业务场景和需求,决定技术方向,做技术选型
③、能够独立架构和涉及海量数据下高并发分布式解决方案,满足功能和非功能需求
④、解决各类潜在系统风险,核心功能的架构与代码编写
⑤、分析系统瓶颈,解决各种疑难杂症,性能调优等
2、面向人群及参考书目
3、Java及JVM简介
4、Java发展的重大事件
5、虚拟机与Java虚拟机
6、JVM的整体结构
7、Java代码执行流程
8、JVM的架构模型
9、JVM的生命周期
10、JVM的发展历程
三、为什么要学习JVM
①、面试的需要(BATJ、TMD、PKQ等面试都爱问)
②、中高级程序员必备技能:项目管理、调优的需要
③、追求极客的精神:比如:垃圾回收算法、JIT、底层原理
Java vs C++
垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。
四、面向人群和课程特点
①、拥有一定开发经验的Java平台开发人员
②、软件设计师、架构师
③、系统调优人员
④、有一定的Java编程基础并希望进一步理解Java的程序员
⑤、虚拟机爱好者,JVM实践者
这个课怎么讲?
理论 > 代码
通俗、易懂、说人话
图解
五、官方规范下载与参考书目
Oracle | Cloud Applications and Cloud Platform 官方网站或者网购《深入理解Java虚拟机》
六、跨平台的语言Java和跨语言的平台JVM
https://www.tiobe.com/tiobe-index/ TIOBE语言热度排行榜
Java是目前应用最为广泛的软件开发平台之一。随着Java以及Java社区的不断壮大,Java也早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。
①、作为一个平台,Java虚拟机扮演着举足轻重的作用。
Groovy、Scala、JRuby、Kotlin等都是Java平台的一部分
②、作为一种文化,Java几乎成为了"开源"的代名词。
第三方开源软件和框架。如Tomcat、Struts、MyBatis、Spring等。
就连JDK和JVM自身也有不少开源的实现,如OpenJDK、Harmony。
③、作为一个社区,Java拥有全世界最多的技术拥护者和开源社区支持,有数不清的论坛和资料。从桌面应用软件、嵌入式开发到企业级应用、后台服务器、中间件,都可以看到Java的身影。其应用形式之复杂、参与人数之众多也令人咋舌。
Java:跨平台的语言
JVM:跨语言的平台
随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序。
Java虚拟机根本不关心在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。也就是说Java虚拟机拥有语言无关性,并不会单纯地与Java语言“终身绑定”,只要其他编程语言的编译结果满足并包含Java虚拟机的内部指令集、符号表以及其他的辅助信息,它就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行。
Java不是最强大的语言,但是JVM是最强大的虚拟机
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-1.html#jvms-1.2
七、字节码与多语言混合编程
字节码:
我们平时说的java字节码,指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:jvm字节码。
如何真正搞懂JVM?
Java虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己动手编写一个!
自己动手写一个Java虚拟机,难吗?
天下事有难易乎?
为之,则难者亦易矣;不为,则易者亦难矣
八、Java及JVM历史上的重大事件
①
②
③OpenJDK(开源免费)与OracleJDK(商用收费的)
九、虚拟机与Java虚拟机介绍
所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机
①、大名鼎鼎的Visual Box,VMware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。
②、程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。
无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中
Java虚拟机
Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。
JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回收器以及可靠的即时编译器。
Java技术的核心就是Java虚拟机(JVM,Java Virtual Machine),因为所有的Java程序都运行在Java虚拟机内部。
作用
Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
特点
①、一次编译,到处运行
②、自动内存管理
③、自动垃圾回收功能
十、JVM的位置
①、JVM的位置
②、
十一、JVM的整体结构
①、JVM的整体结构
(类装载器子系统Class loader)将字节码文件加载到内存当中生成一个大的Class对象(加载-链接-初始化),方法区和堆是共享的,Java栈、本地方法栈、程序计数器是每个线程独有一份的,最后靠执行引擎解释运行
十二、Java代码执行流程
①、
②、Java代码执行流程
③、操作系统只能识别机器指令(需要JIT二次编译)
十三、区分栈的指令集架构和寄存器的指令集架构
JVM的架构模型
总结:
十四、JVM的生命周期
①、虚拟机的启动和执行
②、虚拟机的退出
二十六、内存结构概述
①、简图
②、英文版
③、中文版
二十七、概述类的加载器及类加载过程
1、类加载器子系统作用
2、类加载器ClassLoader角色
3、类的加载过程
4、
二十八、类的加载过程一:Loading
1、类的加载过程:
2、补充:加载.class文件的方式
二十九、类的加载过程二:Linking
三十、类的加载过程三:Initialization
三十一、几种类加载器的使用体会
JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。
从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。
无论类加载器的类型如何划分,在程序中我们最常见的类加载器始终只有3个,如下所示:
关于ClassLoader
三十二、引导类、扩展类、系统类加载器的使用及演示
1、启动类加载器
2、扩展类加载器
3、系统类加载器
三十三、为什么需要用户自定义类加载器及具体实现
实现步骤:
三十四、ClassLoader的常用方法及获取方法
1、关于ClassLoader
2、
3、获取ClassLoader的途径
三十五、双亲委派机制的工作原理及演示
1、双亲委派机制
2、工作原理
三十六、双亲委派机制的优势
1、举例
2、优势
三十七、沙箱安全机制
三十八、类的主动使用与被动使用等
1、
2、对类加载器的引用
3、类的主动使用和被动使用