第一部分:基础
一、JVM初始认知
一、Java文件编译的过程 :
1.程序员编写的.java文件
2.由javac编译成字节码文件.class:(为什么编译成class文件,因为JVM只认识.class文件)
3.在由JVM编译成电脑认识的文件 (对于电脑系统来说 文件代表一切)
二、Java是跨平台语言 :
1.这个夸平台是中间语言(JVM)实现的夸平台 java有JVM从软件层面屏蔽了底层硬件、指令层面的细节让他兼容各种系统;
2.难到 C 和 C++ 不能夸平台吗 其实也可以 C和C++需要在编译器层面去兼容不同操作系统的不同层面,写过C和C++的就知道不同操作系统的有些代码是不一样;
三、为什么学习JVM :
1:为什么Java可以霸占企业级开发那么多年 因为:内存管理
(1)我们在java开发中何时考虑过内存管理
(2)不像c和c++还要考虑什么时候释放资源
(3)我们java只需要考虑业务实现就行了
2.出现问题后该如何解决,这就好像一个人一样,我一般情况吃什么从来不用考虑进入了身体那一个部位,可是总有一天,假如吃了不该吃的也是要进医院的
3.写出更优秀的程序,就像了解了我们身体内部原理,我们知道吃什么对身体好。
二、Jave SE Platform:Jdk和Jre和JVM的区别
官网:https://www.oracle.com/java/technologies/platform-glance.html
总结:
1.Jdk中包括了Jre,Jre中包括了JVM;
2.Jvm在倒数第一层 ,JVM下面是各类OS;
3.Jre大部分都是 C 和 C++ 语言编写的,他是我们在编译java时所需要的基础的类库;
4.Jdk还包括了一些Jre之外的东西 ,就是这些东西帮我们编译Java代码的, 还有就是监控Jvm的一些工具;
第二部分:运行时数据区
三、JVM运行时数据区
JVM主要包括两个子系统和两个组件。
子系统分别是Classloader子系统和Executionengine(执行引擎)子系统;
两个组件分别是Runtimedataarea(运行时数据区域)组件和Nativeinterface(本地接口)组件。
Classloader子系统:根据给定的全限定名类名(如java.lang.Object)来装载class文件的内容到Runtimedataarea中的methodarea(方法区域)。Java程序员可以extendsjava.lang.ClassLoader类来写自己的Classloader。
Executionengine子系统:执行class中的指令。任何JVMspecification实现(JDK)的核心都是Executionengine,不同的JDK例如Sun的JDK和IBM的JDK好坏主要就取决于他们各自实现的Executionengine的好坏。
Nativeinterface组件:与nativelibraries交互,是其它编程语言交互的接口。当调用native方法的时候,就进入了一个全新的并且不再受虚拟机限制的世界,所以也很容易出现JVM无法控制的nativeheapOutOfMemory。 RuntimeDataArea:这就是我们常说的JVM的内存了。
四、类和对象去哪了
五、方法是怎么执行的
六、追本溯源—堆和栈
第三部分:JVM生命周期
七、JVM生命周期
八、双亲委派模式
双亲委派模型是一种组织类加载器之间关系的一种规范,他的工作原理是:如果一个类加载器收到了类加载的请求,它不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,这样层层递进,最终所有的加载请求都被传到最顶层的启动类加载器中,只有当父类加载器无法完成这个加载请求(它的搜索范围内没有找到所需的类)时,才会交给子类加载器去尝试加载.
第四部分:GC
九、JVM的垃圾回收机制
十、JVM垃圾回收分代内存机制
十一、Minor GC、Major GC、Full GC区别及触发条件
十二、GC标记算法或标记策略