陈朋-Java知识点汇总
2024-03-19 22:23:38 1 举报
AI智能生成
笔记
作者其他创作
大纲/内容
事务是不可分割的最小单元,要么同时成功,要么同时失败
原子性
事务完成时,必须保证所有数据保持一致性
一致性
保证事务在不受并发坏境的影响下独立运行
隔离性
保证事务一旦提交或者回滚,对数据库是永久性的操作
持久性
事务四大特性(ACID)
一个事务读取到另一个事务还没有提交的数据
脏读
一个事务先后读取到同一条数据,每次读到的数据都不一样
不可重复读
事务在读取时没有这条数据,在插入时发现又有了这条数据,出现了幻象
幻读
并发会出现的事务问题
会出现 脏读、不可重复读、幻读现象
Read uncommitted
会出现 不可重复读,幻读现象
Read committe
可能会出现幻读现象
Repeatable Read(Mysql默认)
Serializable
事务的隔离级别
客户端和连接对象的服务,也有验证客户端权限的功能
连接层
对sql语句的分析和优化,如果是查询语句还有缓存的功能,按照当前环境提供最高的性能
服务层
根据合适的业务使用不同的引擎,其中mysql的索引就是在引擎实现的
引擎层
存储数据、日志、索引等
存储层
Mysql体系结构
高可用,用性能存储引擎,MySQL5.5默认存储引擎
遵循ACID原则,支持事务
提供行锁,提高并发性能
支持外键约束,保证数据的完整性和正确性
特点
InnoDB
MySQL早期使用的存储引擎
不支持事务,不支持外键
支持表锁,不支持行锁
访问速度块
MyISAM
内存数据库
数据存放在内存,断电及消失
hash索引
Memory
存储引擎
帮助MySQL高效获取数据的数据结构
提高数据查询性能
降低CPU消耗
优点
索引会占用空间
更删改数据,性能会降低
缺点
InnoDB、MyISAM、Memory
最常见的索引,大部分存储都支持此索引
B+True索引
底层数据结构是用哈希结构储存的,只支持精确查询,不支持范围查询
属于MyISAM中特殊的索引,主要用于地理空间类型
R-True空间索引
倒排索引,快速匹配文档,类似于ElasticSearch
Full-Text索引
索引结构
B树
B+树
数据结构
Primary
针对表中主键所创建的索引,每个表只能有一个
主键索引
UNIQUE
字段值,保持唯一,避免重复
唯一索引
快速定位特定数据
常规索引
FULLTEXT
查询文本中的关键字,不是比较索引中的值
全文检索
索引分类
索引
2024-2-7
SHOW GLOBAL STATUS LIKE 'Com_______';
查询记录所有默认超过执行时间为10秒的SQL
慢查询日志
查询某SQL在各个阶段耗时的情况
开启profile指令
SQL操作表的顺序,id相同,执行顺序从上到下;id不同,值越大,越先执行
id
简单表
simple
主查询
primary
第二张表
union
SELECT/WHERE之后包含了子查询
suboquey
select_type
null
system
const
eq_ref
ref
range
index
all
type性能从高到低
显示可能应用在这张表上的索引,一个或多个
possible_key
实际使用的索引,如果为NULL,则没有使用索引
key
表示索引中使用的字节数在不损失精确性的前提下, 长度越短越好
key_len
sql执行需要查询的行数,在innodb中,是一个估计值
rows
表示返回结果的行数占需读取行数的百分比, filtered 的值越大越好
filtered
explain查询SQL执行执行效率
如果创建了联合索引,最左侧索引必须使用到,否则后面索引失效
最左匹配法则
尽可能使用>=活着<=查询,避免使用<>导致索引失效
索引范围查询
索引列上进行运算或者是用函数
索引关键字加模糊查询
连接条件使用or,前面有索引后面没有索引都不会用到
Mysql平局 使用索引比不适用所用性能更慢,则不用索引
索引失效情况
索引的基本概念
SQL性能分析
2024-2-11
锁住整个数据库,在事务提交前,数据库属于只读状态
概念
flush tables with read lock ;
加锁
unlock tables ;
释放锁
mysqldump -u用户名 –p密码 数据库名 > 备份名字.sql
innobd : mysqldump --single-transaction -u用户名 –p密码 数据库名 > 备份名字.sql
数据库备份
操作
如果在主库上备份,那么在备份期间都不能执行更新,业务会停止
主库备份期间,会停止同步binlog日志,导致主从同步延迟
全局锁
每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。
读锁不会阻塞其他客户端的读,但是会阻塞写
表共享读锁
写锁既会阻塞其他客户端的读,又会阻塞其他客户端的写
表独占写锁
表锁
MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上
元数据锁
使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查
由语句 select ... lock in share mode添加 。 与 表锁共享锁(read)兼容,与表锁排他锁(write)互斥
意向共享锁
由insert、update、delete、select...for update添加 。与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥
意向排他锁
分类
意向锁
表级锁
行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高
锁住单行记录的锁,防止其他事务对此进行修改和删除
行锁
锁定索引记录间隙,确保索引记录间隙不变,防止其他事务进行插入操作,产生幻读
间隙锁
行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙
临建锁
行级锁
MySQL锁
2024-2-16
隐式内连接
Select 字段 From 表A inner join 表B on 连接条件
显示内连接
内连接
Select 字段 From 表A left join 表B on 连接条件
左外连接
Select 字段 From 表A right join 表B on 连接条件
右外连接
外连接
只有两个元素表相匹配才能在结果集中显示
左边为驱动表,全是显示,另外一边不匹配的不显示
右边表为驱动表,全部显示,匹配表不匹配的不显示
连接的表中不匹配的数据全部会显示出来
全外连接
内外连接区别
多表查询
长度不可变,空格填充指定长度大小
char
长度是可变的
varchar
char对英文字符占用一个字节,汉字占用两个字节
varchar英文字符和汉字都占用两个字节
存储方式
相似的数据类型
现根据建立索引的字段查询主键ID,在根据主键ID查询数据行,性能较扫一遍索引树低
回表查询
覆盖索引
频繁作为查询条件的字段
多表关联查询中,关联字段应该创建索引 (on 两边都要创建索引)
查询中排序的字段,应该创建索引
查询中统计或者分组字段,应该创建索引
需要创建索引的情况
表记录太少
经常进⾏行行增删改操作的表
频繁更新的字段
where条件里使用频率不高的字段
不需要创建索引的情况
索引的对应情况
不需要事物、外键,读写较多的使用MyISAM储存引擎
定长用char,不定长用varchar
合适字段类型
第二范式,消除部分依赖
第三范式,消除传递依赖
遵循范式
设计方面
索引优化
缓存优化
分库分表
功能方面
主从复制
读写分离
负载均衡
架构方面
性能问题
SQL操作总结
2024-2-17
数据库定义语言,用来操作数据库、表、字段
DDL
数据库操作语言,对数据库表的增删改进行操作
DML
数据库查询语言,对表的查询进行操作
DQL
数据库控制语言,对用户,权限进行操作
DCL
SQL分类
逻辑存储结构
缓冲池是主内存的一个区域,里面可以缓存磁盘经常操作的数据
缓冲池以Page为单位,底层用链表数据结构管理Page
空闲Page 未被使用
free Page
被使用Page,数据没有被修改过
clean Page
脏页,被使用过page,数据被修改过,内存和磁盘数据不一致
dirty Page
Buffer Pool
更改缓冲区,缓存增删改操作,读取数据时合拼到Buffer Pool
Change Buffer
自适应Hash ,存储引擎观察到索引页,如果使用hash索引能提高效率,自动简历hash索引
Adaptive Hash Index
用来保存写入到磁盘上的log日志数据
日志缓存区
Log Buffer
内存结构
系统表空间,是更改缓存区Change Buffer的储存区域
System TableSpace
每个表的文件表空间包含单个innodb的表的数据和索引,并储存在文件系统中的单个数据文件中
File-Per-Table Tablespece
通用表空间,需要通过 CREATE TABLESPACE 语法创建通用表空间,在创建表时,可以指定该表空间
General Tablespaces
撤销表空间,MySQL实例在初始化时会自动创建两个默认的undo表空间(初始大小16M),用于存储undo log日志
Undo Tablespaces
InnoDB 使用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据
Temporary Tablespaces
双写缓冲区,innoDB引擎将数据页从Buffer Pool刷新到磁盘前,先将数据页写入双写缓冲区文件中,便于系统异常时恢复数据
Doublewrite Buffer Files
重做日志,用实现事务的持久性
Redo Log
磁盘结构
核心线程,负责调用其他线程,还负责将缓冲区的数据异步刷新到磁盘中
MasterThread
复杂调用线程处理IO的请求
负责读操作
Read Thread
负责写操作
Write Thread
负责将日志缓冲区刷新到磁盘
Log Thread
负责将缓冲区内容刷新到磁盘
Insert Buffer Thread
IO Thread
主要用于回收事务已经提交了的undo log,在事务提交之后,undo log可能不用了,就用它来回收
Purge Thread
协助 Master Thread 刷新脏页到磁盘的线程,它可以减轻 Master Thread 的工作压力,减少阻塞
Page Cleaner Thread
后台线程
架构
redo log 重做日志保证事务的持久性
作用
当事务提交后会把该操作提交到日志文件中,用于脏数据刷新到磁盘,发生错误时进行数据恢复使用
原理
在内存
重做日志缓冲
redo log buffer
在磁盘
重做日志文件
redo log file
redo log
提供回滚和MVCC
回滚日志,用于记录被修改前的信息
在事务执行时产生,事务提交时,并不会立马销毁,还可能用于MVCC
undo log销毁
采用段的方式进行存储和管理,内部包含1024个undo log segment
undo log 储存
状态
undo log
事务原理
加锁读,一般读取最新的数据
当前读
不加锁,非阻塞读,一般读取的是历史数据
快照读
多版本并发控制,指维护一个数据的多个版本
MVCC
基本概念
记录最后一次修改事务的ID
DB_TRX_ID
回滚指针,指向这个记录的上一个版本,用于配合undo log
DB_ROW_PTR
隐藏主键,表示没有主键,会生成这个隐藏主键
DB_ROW_ID
隐藏字段
不同事物或者相同事物对同一条记录进行修改,会导致记录的undolog生成一条记录版本链,链头的头部是是最新的旧纪录,尾部是最早的旧纪录
undo log日志版本链
快照读SQL执行时MVCC的依据,记录并维护当前活跃事物未提交的id
当前活跃事物的id集合
m_ids
最小活跃事务id
min_trx_id
预分配事务ID,当前最大事务ID+1
max_trx_id
ReadView创建者的事务ID
creator_trx_id
四个核心字段
readview
实现原理
InnoDB引擎
2024-2-18
MySQL
设计模式就是很多程序员经过相当长的一段时间的代码实践、踩坑所总结出来的一套解决方案,这个解决方案能让我们少写一些屎山代码,能让我们写出来的代码写出来更加优雅,更加可靠
设计模式
一个类只负责一项职责、只做一件事情;也就是说要做到代码功能的原子性
一个类应该只有一个发生变化的原因,否则类应该被拆分
单一职责原则 Single ResponsibilityPrinciple
尽量在已有的代码上做扩展,比如说新增模块,新增方法,而不是去修改别人已经写好的代码
对扩展开放、对修改关闭
开闭原则 Open Closed Principle
就是子类可以扩展父类的功能,但不能去改变父类原有的功能。
子类对象是可以替换程序中父类对象出现的任何地方,并且保证原来的程序逻辑不变以及运行正确
里氏替换原则 Liskov SubstitutionPrinciple
接口不要写得太臃肿了,我们需要把接口拆分得更小,更专用
接口隔离原则 Interface Segregation Principle
设计代码结构时,高层模块不应依赖低层模块,两者都应该依赖抽象,抽象不应依赖细节,细节应该依赖抽象
依赖倒置原则 Dependency Inversion Principle
保持它的简单和愚蠢
KISS 原则 keep it simple and stupid
就是不要去做一些过度设计,比如说公司只用得到MySQL,你为了以后能够支持海量数据,直接把hadoop那套体系搬过来了,各种技术都引入进来,那是完全没有必要的
你不需要它
YAGNI 原则 you ain’t gonna need it
不要写重复的代码
DRY 原则 don’t repeat your code
一个对象应该对其他对象保持最少的了解,也就是多个类之间尽量不要直接去依赖,如果你非要依赖,那也只能依赖必要的接口
迪米特法则 law of demeter
九大设计原则
创建型(5种;处理对象的创建过程;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式)
结构型(7种;处理类或者对象的组合;适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模 式、享元模式)
行为型(11种;对类或对象怎样交互和怎样分配职责进行描述;策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式)
设计模式分类
工厂(Factory),顾名思义,创建对象实例的生产工厂,以前我们创建对象都是 new Xxx(),如果我们使用工厂模式 的话,就可以用它来替代 new 操作,创建实例(对象)
简单工厂核心逻辑其实就是这样,将一堆 if else 判断从业务代码中剥离出来,然后塞到一个工厂类中,通过这个工厂来生产出我们想要的产品
简单工厂模式
工厂方法,核心思想是:将对象的创建逻辑下沉到子类里面(创建多个子工厂来创建对象)
获取对象时只需要知道具体工厂的名称,就可以得到对应的对象,无须知道具体创建过程
每增加一个类就要增加一个对应的具体工厂类,增加了系统的复杂度
工厂方法模式
提供了一种方式来创建一系列相关或依赖对象的家族,而无需指定具体的类
抽象工厂模式
工厂模式
饿汉式
单例设计模式(Singleton Design Pattern)
原型、模板、委派、策略、适配器模式、责任链以及设计模式总结
基于内存操作
k-v形式类似于hashMap,查询速度接近O(1)
同时redis自己底层数据结构支持,比如跳表、SDS
命令执行时单线程,通讯采用多路复用
为什么这么快
set key value 设置键的值
get key 获取键的值
incr key 将键的值增加 1
incr key 将键的值增加指定的数字
append key value 将字符串追加到键的值末尾
getrange key start end 获取键值的指定范围的子字符串
setnx 在数据不存在的情况存储,否则不执行
setex 添加数据 并设置有效期
常用指令
缓存数据、计数器、分布式锁、会话存储
应用场景
string 字符串
可做自增、自减
int 整数
float 浮点数
格式又可分为3类
最大空间不能超过518M
String
lpush key value 将一个或多个值插入到列表的左侧
rpush key value 将一个或多个值插入到列表的右侧
lpop key 移除并返回列表的左侧元素
rpop key 移除并返回列表的右侧元素
llen key 获取列表的长度
lrange key start end 获取列表指定范围内的元素
最新消息列表、日志记录
List
sadd key member 向集合中添加一个或多个成员
srem key member 从集合中移除一个或多个成员
smembers key 获取集合中的所有成员
sismenber key member 判断成员是否存在于集合中
scard key 获取集合的基数(成员数量)
sinter key1 key2 获取多个集合的交集
共同好友、去重
Set
zadd key score member 向有序集合中添加一个或多个成员,每个成员关联一个分数
zrem key member 从有序集合中移除一个或多个成员
zrange key start end 获取有序集合指定范围内的成员
zscore key member 获取有序集合中指定成员的分数
zcard key 获取有序集合的基数(成员数量)
zrevrange key start end 获取有序集合指定范围内的成员,并按分数从大到小排序
排行榜、热门文章
特性:可排序、元素不重复,查询速度快
ZSet
hset key field value 设置哈希中指定字段的值
hget key field 获取哈希中指定字段的值
hdel key field 删除哈希中的一个或多个字段
hgetall 获取哈希中的所有字段和值
hkeys key 获取哈希中的所有字段
hvals key 获取哈希中的所有值
用户信息、商品信息 、存储配置信息
Hash
SETBIT key offset value 设置位图中指定偏移量的位值
GETBIT key offset 获取位图中指定偏移量的位值
BITCOUNT key start end 计算位图中值为 1 的位的数量
BITOP operation destkey key1 key2 对一个或多个位图进行指定的逻辑操作
统计、用户在线状态、布隆过滤器
Bitmaps
exists 判断key是否存在
expire 给key设置有效期,到时间自动删除
ttl 查看一个key剩余的有效时间
通用命令
常用数据结构
Redis常用数据类型
2024-1-22
提供了对不同Redis客户端的整合 Lettuce jedis
支持Redis发布订阅模式
支持Redis哨兵和集群
SpringDataRedis
Redis自己操作,内存不足时自动淘汰不重要的数据
内存淘汰
根据自己设置的过期时间,Redis将到达过期时间的数据删除
超时剔除
手动删除Redis中的数据,一般数据库有更新时使用
主动更新
缓存更新策略
缓存查询者,在查询数据库时自动更新到缓存
人工编码操作
缓存和数据库整合为一个服务
系统本身操作
其他线程异步定时操作数据库和缓存一致性
异步线程操作
数据和缓存不一致解决方案
用户在查询一个Redis和Mysql都没有的数据多次请求操作数据库崩溃
含义
实现简单,便于维护
造成额外的内存消耗
可能造成短期的不一致
缓存空对象 并设置较短的过期时间
占用内存少
实现复杂
有hash就有hash冲突会有错误判断
采用hash思想,将数据库数据封装二进制数据拦截进来的请求先查询布隆过滤器
布隆过滤器 拦截查询的数据
设置ID为有一定规则的ID
加强用户权限校验
热点参数限流
解决方案
缓存穿透
指在同一个时间大量的key失效或者redis服务器宕机同时大量请求打到数据库
给key的过期时间加上随机时间
使用Redis集群方案
使用多级缓存避免直达缓存
添加限流策略避免大批量请求
缓存雪崩
高并发时一些查询数据库逻辑复杂的key数据过期了,大量请求数据库
实现简单
保证一致性
没有内存消耗
性能降低
可能出现死锁
互斥锁
保证可用性,性能好
不保证一致性
有内存消耗
逻辑过期
缓存击穿
Redis出现的问题及解决方案
2024-1-24
含义:满足分布式系统或者集群模式下多进程可见的互斥锁
利用set nx ex获取锁,并设置过期时间,保证线程标识
获取锁
释放锁时先判断线程标示是否与自己一致,一致则删除锁
实现
set nx 保持互斥性
set ex 能避免死锁
lua 保证线程拿锁,比锁,删锁原子性
特性
同一个线程无法多次获取同一把锁
不可重入
获取锁,只尝试一次,就返回,没有重试机制
不可重试
如果获取锁执行业务过长,会导致出现隐患问题
超时释放
如果Redis提供了主从集群,当主宕机时,如果从并同步主中的锁数据,则会出现锁实现
主从一致性
问题
Redis+LUA分布式锁
利用hash结构,记录线程标识和重入次数
利用看门狗机制延续锁时间
利用信号量控制锁的重试和等待
Redis挂掉可能会引起锁失效
缺陷
可重入的Redis分布式锁
多个独立的Redis节点,必须在所有节点都获取重入锁,才算获取锁成功
实现复杂,维护成本高
MutiLock原理
Redison分布式锁
2024-1-26
Redis将内存数据存储到磁盘中,当redis宕机或者重启时,从磁盘读取快照文件,恢复数据
运行save命令时(主进程执行)
运行bgsave命令时(其他独立线程执行)
Redis停机时
触发条件时
执行时机
bgsave使用fork主进程得到子进程,子进程共享主进程的内存数据,完成fork后共享数据写入RDB文件
当主进程进行读操作时,访问共享数据
当主进程执行写操作时,会拷贝一份数据,执行写操作
fork机制(copy-on write)
RDB原理
RBD执行时间过长,两次RBD执行可能会有数据丢失的风险
fork子进程、压缩、写出RDB文件都比较耗时
RDB持久化
Redis每执行一条命令都是记录一个日志文件
同步刷盘,可靠性高,几乎不丢失数据,但性能低
appendfsync always
每秒刷盘,可靠性中,性能中,最多丢失一秒数据
appendfsync everysec
系统操作,和RBD类似
appendfsync no
三种策略
AOF持久化
Redis持久化
master将完整内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog,逐个发送给slave
每一个master都有唯一的replid,slave则会继承master节点的replid
replid
lave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新
offset
重要概念
1.slave节点请求增量同步
2.mster节点判断replid,发现不一致 拒绝
3.master将完整内存数据生成RDB,发送RDB到slave
4.slave清空本地数据,加载master的RDB
5.master将RDB期间的命令记录在repl_baklog,并持续将log中的命令发送给slave
6.slave执行接收到的命令,保持与master之间的同步
流程
全量同步
slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave
这个文件类似一个环形的数组,记录master和slave的offset
环形数组 从0开始读写,如果绕过一圈,从头开始从节点slave因为某种原因被全部覆盖,那么只能再次全能同步
repl_backlog
增量同步
Redis主从架构
2024-1-29
Sentinel会不断检查master和slave是否按预期工作
监控
如果master出现故障,选举一个新的slave作为master,当故障恢复,咦slave角色出现
自动故障恢复
当发生故障转移时 会通知最新的信息给Redis客户端
通知
Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令
sentinel节点发现谋实列在规定时间内为反应就判断为主观下线
主观下线
当大部分sentinel发现某实列为主观下线就判断为客观下线,一般时大于等于sentinel集群节点的数量
客观下线
监控原理
1. 首先选定一个slave作为新的master,执行slaveof no one
2.然后让所有节点都执行slaveof 新master
3.修改故障节点配置,添加slaveof 新master
故障转移步骤
Redis哨兵
集群中有多个master,每个master保存不同数据
每个master都可以有多个slave节点
master之间通过ping监测彼此健康状态
客户端请求可以访问集群任意节点,最终都会被转发到正确节点
特征
Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上
插槽
将16384个插槽分配到不同的实例
根据key的有效部分计算哈希值,对16384取余
余数作为插槽,寻找插槽所在实例即可
Redis如何判断某个key应该在哪个实例?
分片集群
2024-1-31
只会在取出 key 的时候才对数据进行过期检查,但是可能会造成太多过期 key 没有被删除
惰性删除
每隔一段时间抽取一批 key 执行删除过期 key 操作
定期删除
Redis过期策略
从设置过期时间的数据集中挑选将要过期的数据淘汰
从设置过期时间的数据集中挑选最不经常使用的数据淘汰
从设置过期时间的数据集中挑选最近最少使用的数据淘汰
从设置过期时间的数据集中任意选择数据淘汰
淘汰具有过期时间的数据
当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key
当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key
从数据集中任意选择数据淘汰
淘汰全部数据
禁止驱逐数据
不淘汰
Redis淘汰策略
2024-2-3
Redis
一个在计算机运行的程序,职责是运行Java字节码文件
本质
执行流程:三个步骤
对字节码文件的指令,实时解析成器械码,让计算器执行
解析和运行
自动为对象,方法,内配内存
自动垃圾回收机制,回收不在使用的对象
内存管理
对热点代码进行优化,提升执行效率
即使编译
功能
加载class字节码文件到内存中
类加载子系统
JVM管理的内存,创建的对象、类的信息等等内容都会放在这块区域中
运行时数据区
包含的及时编译器,解释器,垃圾回收器
执行引擎
调用本地C/C++编译好的方法
本地接口
Java虚拟机的组成
魔术,字节码文件对应的Java版本号,访问标识,父类,接口等等
基础信息
保存了字符串常量,类或接口名,字段名,主要在字节码指令中使用
常量池
当前类或接口声明的字段信息
字段
当前类或接口声明的方法信息,核心内容为方法的字节码指令
方法
类的属性,比如源码的文件名、内部类的列表等
属性
字节码文件的组成
类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息
字节码中的信息保存到方法区中,方法区中生成一个InstanceKlass对象,保存类的所有信息
加载阶段
验证内容是否满足Java虚拟机规范
验证
给静态变量赋初值
准备
将常量池中的符号引用,替换成指向内存的直接引用
解析
连接阶段
初始化阶段会执行字节码文件中clinit(class init 类的初始化)方法的字节码指令,包含了静态代码块中的代码,并为静态变量赋值
初始华阶段
使用阶段
卸载阶段
类的生命周期
启动类加载器(Bootstrap ClassLoader)是由Hotspot虚拟机提供的、使用C++编写的类加载器
默认加载Java安装目录/jre/lib下的类文件,比如rt.jar,tools.jar,resources.jar等
启动类加载器
扩展类加载器(Extension Class Loader)是JDK中提供的、使用Java编写的类加载器。默认加载Java安装目录/jre/lib/ext下的类文件
扩展类加载器
类加载器
JVM
Java知识点总结
收藏
收藏
0 条评论
下一页