自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 打破双亲委派机制

先来分析ClassLoader的原理,ClassLoader中包含了4个核心方法。双亲委派机制的核心代码就位于loadClass方法中。重要类加载的入口,提供了双亲委派机制。内部会调用findClass。(重要)由类加载器子类实现,获取二进制数据调用 defineClass,比如URLClassLoader会根据文件路径去获取类文件中的二进制数据。(重要)做一些类名的校验,然后调用虚拟机底层的方法将字节码信息加载到虚拟机内存中。执行类生命周期中的连接阶段。

2024-05-10 20:18:19 1554

原创 类加载的双亲委派机制

双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会自底向上查找是否加载过,再由顶向下进行加载。类的双亲委派机制是什么?

2024-05-09 17:53:32 368

原创 JVM类加载器

类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。类加载器只参与加载过程中的字节码获取并加载到内存这一部分。

2024-05-09 10:45:52 577

原创 类的初始化代码示例

运行结果为:2new B02()方法会优先初始化父类A02,执行A02静态变量的赋值,此时a=0,再执行A02的静态代码a=1,再执行子类的静态代码块,此时a=2。

2024-04-26 17:40:03 167

原创 类的生命周期

类从加载到虚拟机开始,直到卸载为止,他的整个生命周期包括:加载、验证、准备、解析、初始化、使用、卸载,其中验证、准备、解析三个部分称为连接。

2024-04-26 17:04:13 1728 4

原创 字节码文件的组成

基本信息:魔数,字节码文件对应的Java版本号;访问标识(public final等等);父类和接口; 常量池:保存了字符串常量、类或接口名、字段名,主要在字节码指令中使用; 字段:当前类或接口声明的字段信息; 方法:当前类或接口声明的方法信息、字节码指令; 属性:类的属性,比如源码的文件名、内部类的列表等

2024-04-25 17:13:34 108 1

原创 int i=0;i=i++;最终i的值是多少?

答案是:0;

2024-04-22 11:39:19 170

原创 ConcurrentHashMap的原理

Segment 的结构 和HashMap类似,是一种数组和链表结构,一个Segment 包含一个HashEntry 数组,每个 HashEntry 是一个链表结构的元素,每个 Segment 守护着一个HashEntry数组里的元素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment的锁。在jdk1.8中的ConcurrentHashMap 做了较大的优化,性能提升了不少。JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。

2024-04-15 16:12:07 212 1

原创 HashMap的实现原理

在添加元素或初始化的时候需要调用resize方法进行扩容,第一次添加数据初始化数组长度为16,以后每次每次扩容都是达到了扩容阈值(数组长度 * 0.75) 每次扩容的时候,都是扩容之前容量的2倍;扩容之后,会新创建一个数组,需要把老数组中的数据挪动到新的数组中;

2024-04-15 16:10:08 285 1

原创 ArrayList底层实现

第二:计算数组的容量,如果当前数组已使用长度+1后的大于当前的数组长度,则调用grow方法扩容(原来的1.5倍)第三:确保新增的数据有地方存储之后,则将新元素添加到位于size的位置上。第一:确保数组已使用长度(size)加1之后足够存下下一个数据。第四:返回添加成功布尔值。

2024-04-15 16:06:57 213 1

原创 ReentrantLock的底层原理

ReentrantLock是一个可重入锁,调用 lock 方法获取了锁之后,再次调用 lock,是不会再阻塞,内部直接增加重入次数就行了,标识这个线程已经重复获取一把锁而不需要等待锁的释放。ReentrantLock是属于juc包下的类,属于api层面的锁,跟synchronized一 样,都是悲观锁。它支持公平锁和非公平锁,两者的实现类似构造方法接受一个可选的公平参数( 默认非公平锁 ),当设置为true时,表示公平锁,否则为非公平锁。公平锁的效率往往没有非公平锁的效率高。

2024-04-15 16:04:03 205 1

原创 synchronized和Lock的区别

二者均属于悲观锁、都具备基本的互斥、同步、锁重入功能,Lock 提供了许多 synchronized 不具备的功能,例如获取等待状态、公平锁、可打 断、可超时、多条件变量,同时Lock 可以实现不同的场景,如 ReentrantLock, ReentrantReadWriteLock。在没有竞争时,synchronized 做了很多优化,如偏向锁、轻量级锁,性能不赖,在竞争激烈时,Lock 的实现通常会提供更好的性能,综合来看,需要根据不同的场景来选择不同的锁。

2024-04-15 16:01:44 107 1

原创 JAVA中synchronized关键字的底层原理

synchronized 底层使用的JVM级别中的Monitor 来决定当前线程是否获得了锁,synchronized 属于悲观锁。synchronized 因为需要依赖于JVM级别的Monitor ,相对性能也比较低。

2024-04-15 15:57:08 322 1

原创 Redis常见问题及解决方案

解决方案二:布隆过滤器,可以通过Redission实现,就是初始化一个比较大的数组,里面存放的是0或1,最开始都是0,来了一个key之后,会进行三次hash和取模算法,找到三个数组下标,将数组中这三个位置的数据从0改为1,查询操作也是这样,如果要查询的key经过三次hash运算后对应的数据都是1,那么表示这个key存在,反之则不存在;如果要查询的数据在Redis和数据库中都不存在,那么每次这类数据的请求都会从数据库中查询,对数据库造成压力,如果这类请求非常多,可能会导致数据库挂掉,这就叫缓存穿透;

2024-03-18 17:23:57 154 1

原创 详解Spring Bean 循环依赖、三级缓存

singletonObjects,保存的是经过实例化和初始化的bean(成品对象)二级缓存:earlySingletonObjects,保存的是经过实例化,没有初始化的bean (半成品对象)singletonFactories,lamda表达式(执行该表达式,可以获取到半成品对象,或者代理对象)

2024-03-15 20:00:22 606 1

原创 MySQL 常用工具

错误日志是MySQL中最重要的日志之一,它记录了当mysql的启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。默认情况下,查询日志是未开启的。由于服务器生成的二进制日志文件以二进制格式保存,所以如果想要检查这些文本的文本格式,就会使用到mysqlbinlog日志管理工具。②.MySQL的主从复制。该日志是默认开启的,默认存放目录/var/log/,默认的日志文件名为mysqld.log。也可以在mysql的配置文件中配置二进制日志的过期时间,设置了之后,二进制日志过期会自动删除。

2024-03-15 18:49:05 1575 1

原创 MySQL InnoDB引擎架构

更改缓冲区(针对于非唯一二级索引页),在执行DML语句时,如果这些数据Page没有在Buffer Pool中,不会直接操作磁盘,而会将数据变更存在更改缓冲区Change Buffer中,在未来数据被读取时,再将数据合并恢复到Buffer Pool中,再将合并后的数据刷新到磁盘中。缓冲池是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),然后再以一定频率刷新到磁盘,从而减少磁盘I0,加快处理速度。

2024-03-15 18:44:15 1841 1

原创 MySQL 视图

当使用WITH CHECK OPTION子句创建视图时,Mysql会通过视图检查正在更改的每个行,例如插入、更新、删除,以使其符合视图的定义。视图(View)是一种虚拟存在的表,视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。不加WITH CASCADED CHECK OPTION:mysql不会检查插入视图的数据是否满足视图的查询范围,不满足也能插入成功。要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。

2024-03-15 18:42:03 395 1

原创 MySQL SQL优化

当页中删除的记录达到MERGE_THRESHOLD(合并页的阈值,默认为页的50%,可以自己设置,在创建表或者创建索引时指定),innoDB会开始寻找最靠近的页(前或后)看看是否将两个页合并以优化空间使用。Count()是一个聚合函数,对于返回的结果集,一行行地判断,如果count函数的参数 不是NULL,累积值就加1,否则不加,最后返回累计值。innoDB的行锁是针对索引加的锁,不是针对记录加的锁,更新条件要走索引,并且该索引不能失效,否则会从行锁升级为表锁。InnoDB引擎遍历整张表,但不取值。

2024-03-15 18:40:16 715 1

原创 MySQL InnoDB事务原理

可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些日志可能还用于MVCC。重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。

2024-03-14 15:45:06 417

原创 MySQL InnoDB MVCC

不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。ReadView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。而update、delete的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即被删除。

2024-03-14 15:34:51 340

原创 MySQL索引使用原则

尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少select *,select * 极易出现回表查询,扫描两次索引,从二级索引中查一次,从聚集索引中查一次;如果索引多列(联合索引),要遵循最左前缀法则,最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳过某一列,索引将部分失效(后面的字段索引失效)。如果仅仅是尾部模糊匹配,索引不会失效(like 'xxx%'),如果是头部模糊匹配,索引将失效(like '%xxx')。三个点:什么表需要建索引;

2024-03-14 15:27:56 397

原创 MySQL SQL性能分析

(七根下划线)2、#开启MySQL慢查询日志开关#设置慢查询的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志。

2024-03-14 15:26:12 628 2

原创 MySQL索引分类

在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种: CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name(index_col_name,...);

2024-03-14 15:21:53 209

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除