JVM学习笔记-基础知识

本文详细介绍了JVM、JDK和JRE之间的关系,指出JVM的跨平台特性源于其对字节码的支持。类加载过程包括加载、校验、准备、解析和初始化五个步骤。双亲委派模型描述了类加载器的工作流程,以防止核心类被篡改和重复加载。此外,还讲解了如何自定义类加载器以及打破双亲委派机制的方法。
摘要由CSDN通过智能技术生成

JVM JDK JRE三者关系

JDK = JRE + 一众工具

JRE = JVM + 一众lib jar

JVM 为什么是跨平台的

  1. 由于它编译出字节码文件 class
  2. 每种平台都有对应的JVM 可以对class 文件加载解释生成机器运行指令

类加载入JVM 过程

1.加载;通过IO流的方式把字节码文件读入到JVM中的方法区

2.校验:通过校验字节码文件内容的头4位16进制是否是java 魔数café babe

3 准备:为类中静态部分开辟空间并赋初始值

4 解析 :将符号引用转成直接引用(静态链接)

5 初始化: 为类中的静态部分指定值并执行静态代码块

类被加载后,类中的类型信息,方法信息,属性信息,运行时常量池,类加载的引用等信息会被加载到元空间中

双亲委派

JVM 类加载器有BootStrapClassLoader, ExtClassLoader, AppClassLoader

前者为后者的父类加载器

BootStrapClassLoader (C++ 编写) :加载 /jre/lib

Launcher.ExtClassLoader (DCL):加载 /jre/lib/ext

Launcher.AppClassLoader (参数paraent =ExtClassLoader ):加载classpath

工作过程,首先底层AppClassLoader 去查看类是否被加载否,没被加载就找上一级父类加载器ExtClassLoader ,调用父类的classLoad() 方法,其实这个过程就是查看缓存中是否有被加载过,如果没有继续调用BootStrapClassLoader 的classLoad() ,没如果还没有,那就查自己加载的路径是否存可以加载在这个class 。如果没有,就找下一级ExtClassLoader 去加载是否有,如果没有再找AppClassLoader 去加载。如果还是没有就报错了NotClassFoundException

1.如何定义自己的classLoader: 继承classLoader,AppClassLoader  成为父类加载器(即是内部parent 变量), 和重写findClass 方法

2.如何打破双亲委派机制: 继承classLoader, 和重写findClass 和 loadClass方法

3. 为什么有双亲委派这个机制,主要是为了防止核心类被随意篡改,例如String 不被篡改。防止类被重复加载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值