开发过程中遇到问题是常态。如果遇到了JVM崩溃,就算你拿到了日志,你也不能定位到问题是什么。对于原理,对于基础的学习,能够增强我们的自信心。
课程大纲介绍:JVM是一个令人望而却步的领域,因为它博大精深,涉及到的内容与知识点非常之多。虽然Java开发者每天都在使用JVM,但对其有所研究并且研究深入的人却少之又少。然而,JVM的重要性却又是不言而喻的。基于JVM的各种动态与静态语言生态圈已经异常繁荣了,对JVM的运行机制有一定的了解不但可以提升我们的竞争力,还可以让我们在面对问题时能够沉着应对,加速问题的解决速度;同时还能够增强我们的自信心,让我们更加游刃有余。
JVM介绍
HotSpot虚拟机讲解
垃圾收集方式详解
垃圾收集算法详解
垃圾收集器详解
分代垃圾收集机制详解
新生代讲解
老年代讲解
G1收集器分析与实例
常见且重要虚拟机参数示例
栈
方法区
线程共享内存区
根搜索算法
Serial收集器
ParNew收集器
类加载机制详解
类加载的双亲委托机制
字节码文件生成与分析
魔数
常量池与方法表
各种指令详解
锁详解
线程安全
偏向锁、自旋锁与轻量级锁
JIT编译器
GC日志生成与分析
虚拟机监控工具详解
jConsole使用方式详解
何为逃逸与逃逸分析
方法内联
虚拟机内存模型详解
= = = = = = = = = = = =
以前都不知道这些工具的存在:
jConsole
Jvusualvm
jmap
类加载
在Java代码中,类型的加载、连接与初始化过程都是在程序运行期间完成的。
(类型,并不代表类产生的对象,而是类本身。类型是在程序运行期间生成出来的,run time)
提供了更大的灵活性,增加了更多的可能性
(为有创意的开发者提供了很多的功能。)
类加载器深入剖析Java虚拟机与程序的生命周期
在如下几种情况下,Java虚拟机将结束生命周期
执行了System.exit()方法
程序正常执行结束
程序在执行过程中遇到了异常或者错误而异常终止
由于操作系统出现错误而导致Java虚拟机进行终止
类的加载、连接与初始化加载: 查找并加载类的二进制数据
连接
-验证:确保被加载的类的正确性
-准备:为类的静态变量分配内存,并将其初始化为默认值
-解析:把类中的符号引用转换为直接引用
初始化:为类的静态变量赋予正确的初始值
使用
卸载
从代码来理解: class Test{ public static int a = 1; } //我们程序中给定的是 public static int a = 1; //但是在加载过程中的步骤如下: 1. 加载阶段 编译文件为class文件,然后通过类加载,加载到JVM 2. 连接阶段 第一步(验证):确保Class类文件没问题 第二步(准备):先初始化为 a=0。(因为你int类型的初始值为0) 第三步(解析):将引用转换为直接引用 3. 初始化阶段: 通过此解析阶段,把1赋值为变量a 4. 使用阶段 我们平时使用的对象,操作,方法调用,等等都是使用阶段 5. 卸载阶段 类在卸载之后,就不能够继续new对象,平时开发很少接触到这个卸载阶段。比如-OSGI技术会使用到卸载图解:
Java程序对类的使用方式可分为两种
主动使用(七种)
创建类的使用
访问某个类或者接口的静态变量,或者对该静态变量赋值
调动类的静态方法(助记符: getstatic putstatic invokestatic )
反射(如:Class.forName("com.test.Test"))
初始化一个类的子类
Java虚拟机启动时被表明为启动类的类(Java Test)
JDK1.7开始提供的动态语言支持
被动使用
除了以上七种主动使用的情况,其他使用Java类的方式都被看做是对类的被动使用,都不会导致类的初始化。
所有Java虚拟机实现必须在每个类或者接口被Java程序“首次主动使用”时才初始化他们
类的加载类的加载指的是将类的.class文件中二进制数据读入到内存中,将其放在运行时数据区内的方法去内,然后再内存中创建一个java.lang.Class对象(规范并未说明Class对象谓语哪里,HotSpot虚拟机将其放在了方法去中)用来封装类在方法区内的数据结构
加载.class文件的方式
从本地系统中直接加载
通过网络下载.class文件
从zip,jar等归档文件中加载.class文件
从专有数据库中提取.class文件