JVM虚拟机核心技术

_59_static关键字有哪些作用&方法区&运行时常量池&函数的实例属性和类属性&访问静态方法与属性&静态方法与非静态方法&分派&动态类型语言支持&方法调用和返回指令

(Javac编译原理&方法重写(A a = new B() 实例方法会重写覆盖父类方法指向子类,静态方法子类重写还是调用父类的方法与引用方法没有体现覆盖,静态方法不能覆盖。静态方法要根据引用名称来判断实际类型a.staticMethod(),类名是A)&分派(Java方法调用分为静态分派和动态分配,用于确定方法版本,静态分派允许参数列表不同的重名方法(重载),动态分配具有继承关系下,调用实例方法时自底向上查找可用方法版本)&另一种方法调用&动态类型语言支持&指令&指令invokespecial(指令有5个,调用私有方法和构造方法)&创建 Interface对象&在类中可直接运用的字段static关键字&Virtual DOM&指令invokedynamic使用实例(invokevirtual调用虚方法,一定会被子类覆盖总不是最终版本,抽象方法用来摆设的方法,父类定义被子类方法覆盖的方法,invokedynamic动态链接运行过程中确定版本)&处理链接&)

_60_常用Java虚拟机参数&JVM加载class文件的原理机制是什么& Javap生成的class文件结构&按操作码助记符排列的指令集&类加载情况&自定义高复用代码块&用static代码块实现单例模式&在类中可直接运用的字段static关键字&Class的静态属性和实例属性

(类加载/卸载的跟踪(首次用到这个类一定是由虚拟机通过classpath查找该类的class文件,读取信息保存在内存中后序使用,就是类加载,JRE是Java运行环境。加载时机,创建对象,创建子类对象,方法静态属性,访问静态方法,Class.forName())&net.Server对象&Javap生成的class文件结构(javap -verbose A > A.bytecoed 反编译class文件得到一个文件)&类属性描述&ClassLoader类结构分析&如何加载class文件&加载字节码到内存&验证与解析&初始化Class对象&编译时间和类加载时间的优化&类加载的时机&类函数和静态属性&Class.forName的作用是什么&)

_94_执行的基础:Java虚拟机常用指令介绍&局部变量压栈指令&代码如何执行:字节码执行案例&出栈装入局部变量表指令&操作数栈&操作数栈管理指令&基于栈的指令集与基于寄存器的指令集&基于栈的字节码解释执行引擎&指令invokespecial

(Javap生成的class文件结构(a开头的为对象 athrow抛出栈顶对象出栈,invokespecial调用构造方法,初始化对象要之后要把操作数栈的栈顶元素出栈,下面的变为栈顶,)&指令invokedynamic使用实例&程序计数器&操作数栈管理指令&局部变量表(局部变量表存放的是地址,)&操作数栈管理指令(istore将操作数栈存到局部变量表,iload将局部变量表值加载到栈顶,blpush 40将40压栈,ireturn 返回操作数栈顶元素,带着这个值回到方法调用位置,结束方法。3-20如果有any 问题,会跳转到25行往下执行)&对象创建与访问指令&控制转移指令&)

1.说在前面的话

2.整个部分要讲的内容说明

3.Java技术体系

4.内存泄漏排查&node-heapdump&常用Java虚拟机参数&启动内存分析会话  

5.我是你的眼:图形化虚拟机监控工具JConsole&通过JConsole连接ZooKeeper&JConsole连接Java程序&Java程序概况&查看Java进程——jps命令

6.杂谈

7Java的发展历史

8Java的发展历史续

9Java技术体系

10jdk8的新特性

11lanmbda表达式简介

12Java虚拟机-classic vm

13Java虚拟机-ExactVM

14Java虚拟机-HotSpotVM

15Java虚拟机-kvm

16Java虚拟机-JRockit

17Java虚拟机-j9

18Java虚拟机-dalvik

19Java虚拟机-MicrosoftJVM

20Java虚拟机-高性能Java虚拟机

21Java虚拟机-TaobaoVM

22自动内存管理&设置内存上限&JVM内存结构&PC寄存器&Java栈&堆&方法区&运行时常量池&本地方法栈

(运行时数据区域(线程共享区(方法区和堆),线程独占区(虚拟机栈的局部变量表,本地方法栈,程序计数器))&JVM内存管理&类数据共享&数据类型String的常量池特性&)

23程序计数器

(程序计数器(线程锁执行的字节码行号,如果是native方法计数器值为undefined,唯一没有outofMemoryError的地方)&)

24Java虚拟机栈&运行时栈帧结构&局部变量表&操作数栈

(Java虚拟机栈(方法执行都会创建一个栈帧,伴随方法创建到执行完毕,用于存放局部变量表,操作数栈,动态链接,方法出口等)&运行时栈帧结构&局部变量表(编译器可知的基本数据类型,引用类型,returnAddress类型,编译器完成分配栈帧分配多少内存是固定的,方法运行期间是不会改变局部变量表的大小)&操作数栈&动态连接&OutOfMemoryError异常(递归调用容易出现StackOverflowError异常))

25本地方法栈&

26Java堆&Java堆溢出&实战:OutOfMemoryError异常&优化新生代的大小&优化老年代的大小&缓冲区数据结构

(实例变量与线程安全(对用来存放对象的实例,Java虚拟机管理最大的一块内存区域,垃圾收集器管理的主要区域,Eden空间分为新生代和老年代)&最大堆和初始堆的设置& 新生代的配置&对象优先在Eden分配

&大对象直接进入老年代&长期存活的对象将进入老年代&缓冲区数据结构&Fields和Methods定义&类属性描述&)

27类去哪儿了:识别方法区&

(类去哪儿了:识别方法区&存放所有常数——常量池&类信息(存储运行时常量池,被虚拟机加载的类(版本,字段,方法,接口等),常量,静态变量,即时编译编译后的代码等信息,Hotspot虚拟机把GC分代收集扩展到方法区,使用永久代来实现方法区,可以管理堆的同时管理方法区)&并发永久代垃圾收集&划分代码层次&中断和异常的响应及服务)

28有关String常量池的位置

(有关String常量池的位置(运行时常量池存放字面量的值,)&对象字面量扩展&局部变量表&验证NEW、RUNNABLE和TERMINATED& Java applet与Internet(s.intern()将值扔到常量池,产生运行时常量,)&)

29对象的创建&对象的内存布局&对象的访问定位&编译时间和类加载时间的优化&创建类的实例&创建__init__()方法&创建类的成员并访问&分配内存解析配置文件&对象创建与访问指令&在TLAB上分配对象

(对象创建表达式&对象创建与访问指令(对象创建首先要类的加载,根据new的参数在常量池中定位一个符号引用,如果没有找到引用则进行类加载,解析和初始化,之后为对象在堆中分配内存,为对象分配零值,调用对象的<init>方法默认空的构造方法)&引用和符号引用&类加载/卸载的跟踪&init方法与getDefaultProcessEngine方法&在TLAB上分配对象(对象内存分配方式有空闲列表的指针碰撞两种,本地线程分配缓冲线程安全为对象分配多块独立的区域)&)

30关于jQuery对象的结构&思考:SHA1 哈希值到底是什么,是如何生成的&基于分代的垃圾收集算法

(jQuery对象和jQuery选择器——jQuery对象结构和处理方法&Java对象头(对象结构有对象头header(自身运行时数据以及类型指针,哈希值,GC分代年龄,线程私有锁)和实例数据InstanceData(对象的有效信息)以及padding三部分,)&运行时数据表 &思考:SHA1 哈希值到底是什么,是如何生成的&GC日志分析instanceof有什么作用&)

31对象的访问定位&句柄传递&类去哪儿了:识别方法区

(句柄传递(对象的访问定位,直接指针和句柄两种方式)&错误堆栈&运行时数据区域(运行时数据在堆中,类与方法的信息在方法区中,对对象操作时要同时定位堆与方法区两块区域)&方法区和运行时常量池溢出&)

32垃圾回收-概述

(引用计数算法(垃圾回收策略,标记清除,复制算法,标记整理,分代算法)&可达性分析算法& Javap生成的class文件结构&)

33引用计数法(Reference Counting)&清洁工具大PK:讨论常用的垃圾回收算法&温故又知新:常用的GC参数&

(引用计数法(Reference Counting)(判断是否为垃圾对象,引用计数法和可达性分析算法,-verbose:gc -xx:+PrintGCDetails打印详细的GC信息判断对象是否被回收)&)

34可达性分析算法&再谈引用

(可达性分析算法(对象循环引用不能分析是否为垃圾对象,)&)

35生存还是死亡&标记-清除算法

(标记-清除算法(标记为垃圾对象,并清除垃圾对象,会造成很多空洞)&)

36复制算法&新生代&快速内存分配&内存分配与回收策略&对象优先在Eden分配&大对象直接进入老年代&长期存活的对象将进入老年代&Survivor空间介绍  

(Java堆(线程共享的堆和方法区,)&对象优先在Eden分配(新生代划分为Eden,Survivor存活区,和老年代,存活率不到10%)&Survivor空间介绍&大对象直接进入老年代&长期存活的对象将进入老年代&复制算法(Copying)&空间分配担保&)

37标记-整理算法&分代收集算法

(标记-整理算法(对老年代收集的算法,老年代回收效率很低,90%的存活,不需要内存分配担保,一边都是需要回收的)&分代收集算法(根据内存分代选择不同的垃圾回收算法,)&)

38Serial收集器

39ParNew收集器

40ParallelScavenge收集器

41CMS收集器

42G1收集器

43内存分配与回收策略&对象优先在Eden分配&大对象直接进入老年代&长期存活的对象将进入老年代&动态对象年龄判定

44内存分配与回收策略&对象优先在Eden分配&Serial收集器&大对象直接进入老年代&Survivor空间介绍&禁用System.gc()&System.gc()使用并发回收 &空间分配担保&必要时的Full GC

(Serial收集器(-xx:UserSerialGC -Xms20M -Xmx20M指定堆内存大小不可扩展20M -Xmn10M指定新生代内存为10M,-XX:SurvivorRatio=8,Eden为8M,使用Serial收集器。如果Eden装不下需要进行MinorGC进行新生代内存回收进行空间分配担保,System.gc() Full GC from区域被回收)&别让性能有缺口:了解非堆内存的参数配置&interface与operation元素&)

45&大对象直接进入老年代

(大对象直接进入老年代(-XX:PretenureSizeThreshold=6M 指定大于值的对象进入老年代中,一般大的字符串或者大的数组存活时间较长)&)

46&长期存活的对象将进入老年代

(长期存活的对象将进入老年代(-XX:MaxTenuringThreshold ,复制算法长期存活进入老年代)&)

47 &空间分配担保

(空间分配担保(内存分配不够向老年代借内存,-XX:+HandlePromotionFailure禁用空间分配担保)&)

48逃逸分析

(逃逸分析(堆不是对象分配的唯一选择,栈上分配内存,使用逃逸分析把没有逃逸的对象在栈上分配,)&)

49虚拟机工具介绍

50jps虚拟机进程状况工具

(查看Java进程——jps命令(jps -mlv 查看Java的进程,显示本地虚拟机唯一ID)&)

51jstat虚拟机统计信息监视工具

(查看虚拟机运行时信息——jstat命令(jstat监视虚拟机运行的状态信息,可以监控类装载信息,内存情况,垃圾收集情况以及jit编译信息等,依赖于jps ,jstat -gcutil 6692)& jstat:虚拟机统计信息监视工具&)

52jinfoJava配置信息工具

(jinfo:Java配置信息工具(看是否为serial收集器,jinfo -flag UseG1GC 8264)&)

53jmapJava内存映射工具

(导出堆到文件——jmap命令()&)

54jhat虚拟机堆转储快照分析工具

(JDK自带的堆分析工具——jhat命令&)

55jstackJava堆栈跟踪工具

(查看线程堆栈——jstack命令(定位线程长时间出现停顿的原因,jstack -l 8264)&jstack:Java堆栈跟踪工具&)

56JConsoleJava监视与管理控制

57JConsoleJava监视与管理控制

58JConsoleJava监视与管理控制台

59VisualVM使用详解

60性能调优概述

61性能调优-案例1

62性能调优-案例2

63性能调优-案例3

64前半部分内容整体回顾

65.Class文件简介和发展历史

66.Class文件结构概述

67.Class文件设计理念以及意义

68.文件结构-魔数

69.文件结构-常量池

70.文件结构-访问标志

71文件结构-类索引

72文件结构-字段表集合

73文件结构-方法表集合

74文件结构-属性表集合

75Javap生成的class文件结构

(字节码指令简介(基于栈的指令集,)&加载和存储指令(iconst_1 iadd ireturn )&运算指令&)

76虚拟机类加载机制&虚拟机字节码执行引擎&load方法&加载和存储指令

(虚拟机字节码指令表(iload把局部变量表的int数据加载到操作数栈中,)&)

77操作数栈&局部变量表&函数如何调用:出入Java栈

(加载和存储指令(istore将一个数从操作数栈存储到局部变量表,将常量加载到操作数栈中,bipush sipush iconst。查看字节码 javap -verbose HelloWorld.class  locals局部变量表大小,statck操作数栈深度,)&ContextLoaderListener&)

78运算指令

(运算指令(iadd将栈顶两个元素相加,相加之后两个数出栈,把计算结果放到栈顶 isub imul idiv  )&)

79类型转换指令

(类型转换指令(将两种不同数值进行转化,i2b i2c int转为byte类型)&)

80对象创建与访问指令

(对象创建与访问指令(创建实例的指令new,创建数组newarray,获得类字段getfield,arraylenth数组长度指令,javac .java编译为class文件, javap -verbose .class 反编译查看class指令)&)

81操作数栈管理指令&

(操作数栈管理指令(直接操作操作数栈,将操作数栈一个或两个元素出栈 pop pop2,复制栈顶一个或两个数值并重新压入栈顶 dup dup1,将栈顶两个数值交换swap )&)

82操作数栈管理指令& LPUSH:将元素推入列表左端

(控制转移指令(修改pc寄存器的值 ifeq iflt ifle ifnull  if_icomle 20 比较如果不成功跳转20行 ldc加载一个常量进入操作数栈 invokevirtual 方法执行指令)&)

83指令invokedynamic使用实例&指令invokespecial&动态类型语言支持&函数调用与返回指令

(方法调用和返回指令(invokevirtual调用对象实例方法,根据对象的实际类型进行分配(虚分派),invokeinterface调用接口方法,在运行时搜索一个实例出现这个接口方法的对象,invokespecial指令用于调用一些特殊处理的实例方法,实例初始化方法私有方法和父类方法,invokestatic调用类的静态方法,方法返回指令ireturn 返回值可以使boolean byte char或者short和int类型,return返回void方法)&)

84异常处理指令

(异常处理指令(athrow 显示抛出异常,出现异常虚拟机会自动抛出异常)&)

85同步指令&管程

(同步指令(Monitor同步通过同步方法和同步代码块两种,monitorenter和monitorexit goto跳转到指定的行号)&)

86类加载情况&认识ClassLoader,看懂类加载&类加载情况&类加载机制&类和类加载器&Tomcat:正统的类加载器架构&编写你自己的类加载器

(虚拟机类加载机制(虚拟机把描述类的数据从静态描述性的Class文件加载到内存,进行校验解析和初始化,最终形成可以被虚拟机直接使用的Java类型)&)

87类加载情况&Class装载系统&来去都有序:看懂Class文件的装载流程&类装载的条件&加载类&验证类&准备&解析类&初始化&创建数组和子类型&类常量

(当前类、父类和接口&原子类的增强&常量入栈指令&类加载的时机(类加载的时机,连接(验证,准备,解析),初始化,使用,卸载。加载开始后连接并行执行,一定加载完毕连接才会完毕)&初始化(只有4种情况才会进行初始化,遇见new、getstatic、putstatic、invokestatic4条字节码指令时,如果类没有初始化则初始化,被final修饰的静态字段编译器放在常量池中不会初始化,使用反射对类进行反射调用,初始化一个类如果父类没有初始化会先初始化父类,虚拟机启动时要执行主类main。不被初始化,子类引用父类的静态字段、数组定义的引用类,调用类常量)&)

88使用完全限定的表名&使用完全限定的表名&使用完全限定的表名&使用完全限定的表名&获得Class对象表示实体的名称

(加载网络图片&初始化Class对象&加载(加载通过类全限定名获取定义此类的二进制流(动态代理,$Proxy),通过字节流代表的静态存储结构转为方法区的运行时数据结构,在内存中生成一个代表这个类的class对象,做为这个类的各种数据的访问入口)&)

89验证

90验证

91invokedynamic

(解析(将常量池的符号引用替换为直接引用,通过地址引用,要解析类或者接口的解析,字段解析,类方法解析,接口方法解析,invokedynamic解析动态语言每一次不同。类或接口全限定名传递给类加载器加载这个类)&)

92创建__init__()方法&接口

(静态域与静态方[0法0]&受保护访问(初始化类加载最后一个过程,static{ i=0; syso(i)} static int i=1; 类的字段已经在方法区可以赋值,但是不能访问定义在它之后的静态变量,编译器执行的顺序是语句在源文件中出现的顺序决定的。Clinit虚拟机保证父类先执行完,static代码一定会执行)&)

93类和类加载器&自定义类加载器

(一切Class从这里开始:掌握ClassLoader(类加载器通过类的全限定名获取此类的二进制字节流,把字节码文件加载为二进制字节流,相同字节码被不同类加载加载的类是不相等的。类加载器分类启动类加载器 javahome的lib目录下,扩展类加载器,应用程序类加载器,自定义类加载器。自定义类加载器,继承classLoader,重写loadClass方法,实例化class对象。In = getClass()。GetResourceAsStream(fileName) 根据class文件名去实例化class对象,byte[] buff=new byte[in,avaiable()]; in.read(buff);  return defineClass(name,buff,0,buff.length))&)

94ClassLoader的双亲委托模式&双亲委托模式的弊端&双亲委托模式的补充&突破双亲模式  

(双亲委派模型(一层一层网上扔,直到扔给启动类加载器,如果启动类加载不成功让下面扩展类加载器加载,之后让那个应用程序类加载器加载,之后是自定义类加载器去加载)&)

95运行时栈帧结构&局部变量表&操作数栈&动态连接&方法返回地址&附加信息&逃逸分析

96局部变量表&出栈装入局部变量表指令&局部变量表&原子性、可见性与有序性&Java与线程&将引用对象改为值对象(Change Reference to Value)

97操作数栈&帧数据区&操作数栈管理指令

98动态连接&存放所有常数——常量池

(引用和符号引用(动态链接,字节码文件有一部分是常量池,存在大量符号引用方法执行过程,栈帧一块结构指向该栈帧所属方法引用,支持方法调用的动态链接,)&)

99方法返回地址&附加信息

(附加信息(方法调用时通过一个指向方法的指针指向方法的地址,方法返回时将回归到调用处,这个地方就是返回地址)&)

100方法调用&解析&多态的实现机制是什么&重载和覆盖有什么区别&静态方法&使用final属性&指令invokespecial

(注册表的解析&调用方法(方法调用有解析调用和分派调用,分派调用分为静态分派,动态分配,单分配和多分配,方法调用不等于方法执行唯一任务就是确定调用方法的版本。)&目前官方支持的Java版本(方法重载重写,对同一个方法有多个不同版本,方法调用版本在运行期不能改变,如果不能确定唯一版本解析不成功)&静态方法(只有一个版本不会出现重写与重载,静态方法,构造器方法,私有方法,被final修饰的方法,能够确定唯一的版本解析调用被编译为invokestatic、invokespecial构造器,私有方法两种字节码指令。分派调用在编译阶段不能确定版本要在运行期确定版本)&构造器方法引用&实例方法引用&阻止继承:final类和方[0法0] &私有方法&指令invokespecial)

101方法调用-方法调用&解析&多态的实现机制是什么&重载和覆盖有什么区别&静态方法&使用final属性&指令invokespecial&类的静态成员变量与静态成员函数&使用静态编译以提高性能

(多态(sayHello(Parent p) sayHello(Child1 c) sayHello(Child2 c)静态分派 parent p = new Child() parent p2= new Child() d.sayHello(p),多态父类引用指向子类实例,父类引用是变量的静态类型,真实类型,方法选择通过静态类型选择。静态类型确定是在编译期间确定的invokevirtual,p= new Child2()静态类型不会发生变化。强制类型转换sayHello((Child2)p)。静态分派主要针对方法重载不能确定类型的时候sayHello(int i)sayHello(Cahracter a) 方法调用过程选择最先匹配的执行)&类型&强制类型转换&)

102动态配额分配制&

(分派(动态分派调用主要是方法重写,继承判断真实类型,invokevirtual仍然指向Parent但是执行是Child,按照继承从下往上依次对实际类型的各父类进行搜索与验证,)&)

103动态类型语言支持

104字节码执行引擎小结

105总结与回顾

106 Happens-Before原则&并发编程模型的分类&happens-before简介&监视器概念&Volatile域

(Happens-Before原则&可见性&重排序的概&指令重排序&保证内存访问的顺序性&标准模式--监视器及其范例&Volatile的使用&传递性依赖&Spring Boot Quick Start&等待线程结束(join)和谦让(yield)&)

107重排序方法&重排序&数据依赖性&as-if-serial语义&程序顺序规则&重排序对多线程的影响&顺序一致性&数据竞争与顺序一致性&顺序一致性内存模型

(重排序&数据依赖性&as-if-serial语义& 指令重排序&重排序的概念&资源争用与调度&填补处理器与内存之间的鸿沟:高速缓存&硬件缓冲区:写缓冲器与无效化队列&数据世界的交通规则:缓存一致性协议&再探内存重排序&资源争用与调度&)

108锁的内存语义&锁的释放-获取建立的happens-before关系&锁的释放和获取的内存语义&锁内存语义的实现

(内部锁:synchronized关键字&与锁相关的几个概念&线程同步机制的底层助手:内存屏障&改进型锁:读写锁&)

109volatile的内存语义&volatile的特性&volatile写-读建立的happens-before&volatile写-读的内存语义&volatile内存语义的实现&JSR-133为什么要增强volatile的内存语义

(轻量级同步机制:volatile关键字&volatile的作用&主内存与工作内存&Java内存模型&volatile写-读建立的happens-before关系&volatile内存语义的实现 &)

110final域的内存语义&final域的重排序规则&写final域的重排序规则&读final域的重排序规则&final域为引用类型&为什么final引用不能从构造函数内“溢出”&final语义在处理器中的实现&JSR-133为什么要增强final的语义&构造方法的应用& 线程同步机制的底层助手:内存屏障

(final域的内存语义&为什么final引用不能从构造函数内“溢出”&final域的重排序规则&写final域的重排序规则&读final域的重排序规则&final域为引用类型&线程同步机制的底层助手:内存屏障&对象的初始化安全:重访final与static&再探可见性&)

 

 

发布了370 篇原创文章 · 获赞 88 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/qq_35029061/article/details/105292581
今日推荐