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