logo资料库

《JVM从入门到入魔》笔记.pdf

第1页 / 共63页
第2页 / 共63页
第3页 / 共63页
第4页 / 共63页
第5页 / 共63页
第6页 / 共63页
第7页 / 共63页
第8页 / 共63页
资料共63页,剩余部分请下载后查看
01 优秀的Java开发者
1.1 什么是Java?
1.2 编程语言
1.3 计算机[硬件]能够懂的语言
1.3.1 计算机发展史
1.3.2 计算机体系结构
1.3.3 计算机处理数据过程
1.3.4 机器语言
1.3.5 不同厂商的CPU
1.3.6 操作系统
1.3.7 汇编语言
1.3.8 高级语言
1.3.9 编译型和解释型
1.3.9.1 编译型
1.3.9.2 解释型
1.3.9.3 Java呢?
1.4 So JVM是什么?
1.5 JDK JRE JVM
02 JVM到底该学习什么
2.1 源码到类文件
2.1.1 源码demo
2.1.2 前期编译
2.1.3 类文件(Class文件)
2.1.3.1 16进制
2.1.3.2 The ClassFile Structure
2.1.3.3 Simple analysis
2.1.3.4 javap验证
2.1.3.5 Continous analysis
2.2 类文件到虚拟机(类加载机制)
2.2.1 装载(Load)
2.2.2 链接(Link)
2.2.2.1 验证(Verify)
2.2.2.2 准备(Prepare)
2.2.2.3 解析(Resolve)
2.2.3 初始化(Initialize)
2.2.4 类加载器ClassLoader
2.2.4.1 分类
2.2.4.2 图解
2.2.4.3 加载原则[双亲委派]
2.2.4.4 破坏双亲委派
2.3 运行时数据区(Run-Time Data Areas)
2.3.1 官网概括
2.3.2 图解
2.3.3 初步认识
2.3.3.1 Method Area(方法区)
2.3.3.2 Heap(堆)
2.3.3.3 Java Virtual Machine Stacks(虚拟机栈)
2.3.3.4 The pc Register(程序计数器)
2.3.3.5 Native Method Stacks(本地方法栈)
2.3.4 折腾一下
2.3.4.1 栈指向堆
2.3.4.2 方法区指向堆
2.3.4.3 堆指向方法区
2.3.4.4 Java对象内存模型
2.4 JVM内存模型
2.4.1 与运行时数据区
2.4.2 图形展示
2.4.3 对象创建过程
2.4.4 常见问题
2.4.5 体验与验证
2.4.5.1 使用visualvm
2.4.5.2 堆内存溢出
2.4.5.3 方法区内存溢出
2.4.5.4 虚拟机栈
2.5 Garbage Collect(垃圾回收)
2.5.1 如何确定一个对象是垃圾?
2.5.1.1 引用计数法
2.5.1.2 可达性分析
2.5.2 什么时候会垃圾回收
2.5.3 垃圾收集算法
2.5.3.1 标记-清除(Mark-Sweep)
2.5.3.2 标记-复制(Mark-Copying)
2.5.3.3 标记-整理(Mark-Compact)
2.5.4 分代收集算法
2.5.5 垃圾收集器
2.5.5.1 Serial
2.5.5.2 Serial Old
2.5.5.3 ParNew
2.5.5.4 Parallel Scavenge
2.5.5.5 Parallel Old
2.5.4.6 CMS
2.5.5.7 G1(Garbage-First)
2.5.5.8 ZGC
2.5.5.9 垃圾收集器分类
2.5.5.10 常见问题
03 工欲善其事必先利其器
3.1 JVM参数
3.1.1 标准参数
3.1.2 -X参数
3.1.3 -XX参数
3.1.4 其他参数
3.1.5 查看参数
3.1.6 设置参数的常见方式
3.1.7 实践和单位换算
3.1.8 常用参数含义
3.2 常用命令
3.2.1 jps
3.2.2 jinfo
3.2.3 jstat
3.2.4 jstack
3.2.5 jmap
3.3 常用工具
3.3.1 jconsole
3.3.2 jvisualvm
3.3.2.1 监控本地Java进程
3.3.2.2 监控远端Java进程
3.3.3 arthas
3.3.3.1 下载安装
3.3.3.2 常用命令
3.3.4 内存分析
3.3.4.1 MAT
3.3.4.2 heaphero
3.3.4.3 perfma
3.3.5 GC日志分析
3.3.5.1 不同收集器日志
3.3.5.2 GCViewer
3.3.5.3 gceasy
3.3.5.4 gcplot
3.4 执行引擎
3.4.1 解释执行
3.4.2 即时编译器
3.4.3 JVM采用哪种方式
3.4.4 即使编译器类型
3.4.5 AOT和Graal VM
3.4.5.1 AOT
3.4.5.2 Graal VM
3.5 重新认知JVM
04 性能优化
4.1 内存
4.1.1 内存分配
4.1.2 内存溢出(OOM)
4.1.2.1 大并发[秒杀]
4.1.2.2 内存泄露导致内存溢出
4.2 GC
4.2.1 是否选用G1
4.2.2 G1调优
4.2.3 G1调优最佳实战
4.3 CPU占用率高
4.4 JVM性能优化指南
4.5 常见问题
01 优秀的Java开发者 大家都是有经验的Java开发人员,想想为何要学习JVM?[面试?调优?装逼?] 不管出于何种原因,总之你得先学好。那怎么学好呢? 因为目前课堂中有大学生和工作几年的,也就是每个人对于JVM的了解可能不一样,这就要考虑到怎么 切入 既然大家都学习过Java,那不妨就从Java开始聊起,同时也是扫盲,毕竟不是每个小伙伴都是计算机专 业 1.1 什么是Java? Java是一门面向对象的高级编程语言 1.2 编程语言 编程语言(英语:programming language),是用来定义[计算机程序]的[形式语言]。它是一种被[标 准化]的交流技巧,用来向[计算机]发出指令。一种能够让[程序员]准确地定义计算机所需要使用数据的 计算机语言,并精确地定义在不同情况下所应当采取的行动。 说白了就是让人类能够和计算机沟通,所以要学习计算机能够懂的语言 1.3 计算机[硬件]能够懂的语言 你 的 好 更 为 院 只 学 1.3.1 计算机发展史 1946-1958:电子管计算机 1958-1964:晶体管计算机 1964-1970:集成电路计算机 1970-至今:大规模集成电路计算机 猜想:未来以蛋白质分子作为原材料,量子计算机[已经有了] 泡 咕 1.3.2 计算机体系结构 遵循冯诺依曼计算机结构 1.3.3 计算机处理数据过程
(1)提取阶段:由输入设备把原始数据或信息输入给计算机存储器存起来 (2)解码阶段:根据CPU的指令集架构(ISA)定义将数值解译为指令 (3)执行阶段:再由控制器把需要处理或计算的数据调入运算器 (4)最终阶段:由输出设备把最后运算结果输出 本质上就是CPU取数据指令然后返回 CPU=存储器+运算器+控制器 1.3.4 机器语言 我们把CPU能够直接认识的数据指令,称为机器语言,也就是010101001这种形式 1.3.5 不同厂商的CPU 单核、双核、多核 Intel、AMD、IBM等 不同CPU使用的CPU指令集是不一样的,这就会有不兼容的问题 而且要是直接操作01这种形式的,非常麻烦并且容易出错,硬件资源管理起来也不方便 你 的 好 1.3.6 操作系统 向下对接指令系统、管理硬件资源 向上提供给用户简单的操作命令和界面 1.3.7 汇编语言 更 为 低级语言,通过汇编器翻译成机器语言 MOV、PUSH、ADD等 对机器友好,执行效率比较高,移植性差 学 泡 咕 1.3.8 高级语言 但是人类操作起来还是不太方便,或者需要专业的人员 院 只 C、C++、Java、Python、Golang等 最终肯定还是要转换成机器能够懂的机器语言 1.3.9 编译型和解释型 1.3.9.1 编译型 使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成 可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。 C、C++、GoLang 编译型语言: 执行速度快、效率高;依靠编译器、跨平台性差些。 把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序。
1.3.9.2 解释型 使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。 是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。 Python、Javascript 解释型语言: 执行速度慢、效率低;依靠解释器、跨平台性好。 把做好的源程序翻译一句,然后执行一句,直至结束。 1.3.9.3 Java呢? Java属于编译型+解释型的高级语言 其实并不是因为有javac将Java源码编译成class文件,才说Java属于编译+解释语言,因为在这个编译器编 译之后,生成的类文件不能直接在对应的平台上运行。 那为何又说Java是编译+解释语言呢?因为class文件最终是通过JVM来翻译才能在对应的平台上运行,而这 个翻译大多数时候是解释的过程,但是也会有编译,称之为运行时编译,即JIT(Just In Time)。 综上所述,Java是一门编译型+解释型的高级语言。 你 的 好 更 为 院 只 1.4 So JVM是什么? Java Virtual Machine(Java虚拟机) Write Once Run Anywhere 学 泡 咕 1.5 JDK JRE JVM Java官网 :https://docs.oracle.com/javase/8/ Reference -> Developer Guides -> 定位到:https://docs.oracle.com/javase/8/docs/index.html
JDK 8 is a superset of JRE 8, and contains everything that is in JRE 8, plus tools such as the compilers and debuggers necessary for developing applets and applications. JRE 8 provides the libraries, the Java Virtual Machine (JVM), and other components to run applets and applications written in the Java programming language. Note that the JRE includes components not required by the Java SE specification, including both standard and non-standard Java components. 你 的 好 更 为 02 JVM到底该学习什么 院 只 或者换句话说,JVM到底从哪边开始学习起? 学 泡 咕 (1)源码到类文件 (2)类文件到JVM (3)JVM各种折腾[内部结构、执行方式、垃圾回收、本地调用等] 2.1 源码到类文件 2.1.1 源码demo
class Person{ private String name="Jack";    private int age; private final double salary=100;    private static String address;    private final static String hobby="Programming"; private static Object obj=new Object();    public void say(){        System.out.println("person say...");   }    public static int calc(int op1,int op2){        op1=3;        int result=op1+op2; Object obj=new Object();        return result;   } public static void main(String[] args){ calc(1,2); } } 编译: javac -g:vars Person.java ---> Person.class 2.1.2 前期编译 你 的 好 更 为 Person.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析器 -> 注解抽象语法树 -> 字节码生成器 -> Person.class文件 院 只 学 2.1.3 类文件(Class文件) 2.1.3.1 16进制 cafe babe 0000 0034 003f 0a00 0a00 2b08 002c 0900 0d00 2d06 4059 0000 0000 0000 0900 0d00 2e09 002f 0030 0800 310a 0032 0033 0700 340a 000d 0035 0900 0d00 3607 0037 0100 046e 616d 6501 0012 4c6a 6176 泡 咕 612f 6c61 6e67 2f53 7472 696e 673b 0100 0361 6765 0100 0149 0100 0673 616c 6172 7901 0001 4401 000d 436f 6e73 7461 6e74 ...... 2.1.3.2 The ClassFile Structure 官网 : https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html ClassFile {   u4             magic;   u2             minor_version;   u2             major_version;   u2             constant_pool_count;   cp_info       constant_pool[constant_pool_count-1];   u2             access_flags;   u2             this_class;   u2             super_class;
你 的 好 minor_version major_version u2:003f=63(10进制) constant_pool_count: 更 为 院 只 表示常量池中的数量是62 cp_info constant_pool[constant_pool_count-1]   u2             interfaces_count;   u2             interfaces[interfaces_count];   u2             fields_count;   field_info     fields[fields_count];   u2             methods_count;   method_info   methods[methods_count];   u2             attributes_count;   attribute_info attributes[attributes_count]; } 2.1.3.3 Simple analysis u4 :cafebabe magic:The magic item supplies the magic number identifying the class file format u2+u2:0000+0034,34等于10进制的52,表示JDK8 The value of the constant_pool_count item is equal to the number of entries in the constant_pool table plus one. 学 泡 咕 The constant_pool is a table of structures representing various string constants, class and interface names, field names, and other constants that are referred to within the ClassFile structure and its substructures. The format of each constant_pool table entry is indicated by its first "tag" byte. The constant_pool table is indexed from 1 to constant_pool_count - 1. 常量池主要存储两方面内容:字面量(Literal)和符号引用(Symbolic References) 字面量:文本字符串,final修饰等 符号引用:类和接口的全限定名、字段名称和描述符、方法名称和描述符 2.1.3.4 javap验证 JDK自带的命令 javap -h 可以验证一下上述Classfile Structure前面几块内容的正确性 javap -v -p Person.class 进行反编译,查看字节码信息和指令等信息 是否有一种感觉?
JVM相对class文件来说可以理解为是操作系统;class文件相对JVM来说可以理解为是汇编语言或者机器 语言。 你 的 好 更 为 院 只 学 泡 咕
你 的 好 更 为 院 只 学 泡 咕
分享到:
收藏