1.类加载子系统
如果要手写一个java虚拟机,主要考虑两部分:类加载系统和执行引擎。
类加载系统:加载.class文件
执行引擎:逐条解释执行指令
内存结构概述:
作用:
这个里特定的文件标识是coffee baby 魔术
虚拟机借助魔数,用来识别.class 文件,虚拟机在加载类文件之前会先检查魔数,如果不是 0xCAFEBABE 则拒绝加载该文件。
运行时常量池,是Class文件中的常量池:Class文件中的常量,加载到内存里面,就变成了运行时常量池
类的加载过程
类的加载过程:加载、链接(验证、准备、解析)、初始化
加载、链接、初始化
1.加载
生成大的class对象是在加载的过程中实现的
2.链接
3.初始化
1 | package com; |
这里需要注意的是,clinit方法,不是我们定义的,而是jvm自己定义的方法
如果程序里没有类变量或者静态代码块,就不会有clinit方法
虚拟机必须保证一个类的clinit方法在多线程下被同步加锁
因为,类的类型信息在jdk8之后是存放在元空间(本地直接内存中),一个类只能被加载一次,所以一个线程在clinit的时候,别的线程是不能clinit这个类的,也就是同步加锁
2.类加载器
简要介绍
ext扩展类加载器获取它的上层,Bootstrap加载器,获取不到,结果为null
启动类加载器
扩展类加载器
系统类加载器
为什么要有用户自定义类加载器
关于ClassLoader
3.双亲委派机制
看包名,是否归某一类加载器管辖
优势
沙箱安全机制
4.其他
类的主动使用和被动使用
一个类型到另一个类型,这里在后面的动态链接的部分会有所提及,所以我们需要知道这个信息
类的主动使用和被动使用的区别:会不会导致类的初始化,主动使用回导致类的初始化