目录
-
-
- 2、为什么要双亲委派机制
- 3、双亲委派机制的核心源码
- 5、自定义加载器实现双亲委托机制
- 6、自定义加载器打破双亲委派机制
-
-
-
- 1、运行时数据区的介绍(也叫JVM的内存模型 JMM、内存区域)
- 2、程序在执行时运行数据区的内存变化
-
-
-
- 1、对象成为垃圾的判断依据
- 2、 对象中的finalize方法
-
-
-
- 1、标记清除算法、复制算法、标记整理算法、分代回收法
- 3、对象进⼊到⽼年代的条件
-
- 十、JVM性能调优的原则有哪些?
- 十一、什么情况下需要JVM调优?
- 十二、聊聊Java的GC机制
一、什么是JVM
Java Virtual Machine(Java虚拟机)是java程序实现跨平台的⼀个重要的⼯具(部件)。
HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是⽬前使⽤范围最⼴的Java虚拟机。
只要装有JVM的平台,都可以运⾏java程序。那么Java程序在JVM上是怎么被运⾏的?
通过介绍以下JVM的三个组成部分,就可以了解到JVM内部的⼯作机制
-
类加载系统:负责完成类的加载
-
运⾏时数据区:在运⾏Java程序的时候会产⽣的各种数据会保存在运⾏时数据区
-
执⾏引擎:执⾏具体的指令(代码)
1、jvm的三个组成部分
-
类加载系统
-
运行时数据区
-
执行引擎
二、类加载系统
1、类的加载过程
⼀个类被加载进JVM中要经历哪⼏个过程
-
加载: 通过io流的⽅式把字节码⽂件读⼊到jvm中(⽅法区)
-
校验:通过校验字节码⽂件的头8位的16进制是否是java魔数cafebabe
-
准备:为类中的静态部分开辟空间并赋初始化值
-
解析:将符号引⽤转换成直接引⽤。——静态链接
-
初始化:为类中的静态部分赋指定值并执⾏静态代码块。
类被加载后,类中的类型信息、⽅法信息、属性信息、运⾏时常量池、类加载器的引⽤等信息会被加载到元空间中。
2、类加载器
- 类是谁来负载加载的?——类加载器
- Bootstrap ClassLoader 启动类加载器:负载加载jre/lib下的核⼼类库中的类,⽐如rt.jar、charsets.jar
- ExtClassLoader 扩展类加载器:负载加载jre/lib下的ext⽬录内的类
ext 加载路径:System.getProperty("java.ext.dirs");
- AppClassLoader 应⽤类加载器:负载加载⽤户⾃⼰写的类
app 加载路径:System.getProperty("java.class.path");
-
⾃定义类加载器:⾃⼰定义的类加载器,可以打破双亲委派机制。
三、双亲委派机制
1、双亲委派机制介绍
当类加载进⾏加载类的时候,类的加载需要向上委托给上⼀级的类加载器,上⼀级继续向上委托,直到启动类加载器。启动类加载器去核⼼类库中找,如果没有该类则向下委派,由下⼀级扩展类加载器去扩展类库中,如果也没有继续向下委派,直到找不到为⽌,则报类找不到的异常。
应⽤类加载器怎么加载Student和String呢?需要通过双亲委派机制
2、为什么要双亲委派机制
防⽌核⼼类库中的类被随意篡改
防⽌类的重复加载
3、双亲委派机制的核心源码
- ClassLoader.class
4、全盘委托机制
当⼀个类被当前的ClassLoader加载时,该类中的其他类也会被当前该ClassLoader加载。除⾮指明其他由其他类加载器加载。
5、自定义加载器实现双亲委托机制
6、自定义加载器打破双亲委派机制
四、运行时数据区
1、运行时数据区的介绍(也叫JVM的内存模型 JMM、内存区域)
JMM分成了这么⼏个部分
- 堆空间(线程共享):存放new出来的对象
- 元空间(线程共享):存放类元信息、类的模版、常量池、静态部分
- 线程栈(线程独享):⽅法的栈帧
- 本地⽅法区(线程独享):本地⽅法产⽣的数据
- 程序计数器(线程独享):配合执⾏引擎来执⾏指令