自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

MuskMelon

不积跬步无以至千里!

  • 博客(59)
  • 资源 (3)
  • 问答 (1)
  • 收藏
  • 关注

原创 Maven生命周期及插件管理

每套生命周期可以独立运行,每个生命周期包含多个phase,每个phase又是各种插件的goal来完成的,一个插件的goal可以认为是一个功能。maven的构建原理:每次执行一个生命周期,都会依次执行这个生命周期内部的多个phase,每个phase执行都会执行某个插件的goal来完成具体的功能。,在clean phase之前的所有phase和clean phase,pre clean,clean。生命周期---->phase---->plugin goal。执行这个命令行,会执行。插件的goal写法,

2023-02-15 00:06:46 238

原创 并发编程笔记

线程基本概念什么是线程操作系统在运行一个程序的时候,会创建一个进程,在这个进程里可以创建多个线程,CPU给每个线程分配时间片来进行调度执行。CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后切换到下一个任务,每次切换的时候需要保存上一个任务执行的状态,以便下一次切换回来的时候,可以再次加载这个状态。这个保存和加载的过程称为上下文切换。线程是操作系统调度的基本单元单核处理器也是支持多线程执行代码的。为什么使用多线程最大化的利用计算机多核处理器更快的响应时间RT更好的编程模型

2021-05-30 00:06:49 144

原创 Kafka入门指南

Kafka是什么是一个分布式的流式处理平台,具有高吞吐,可持久化,可水平扩展,支持流式数据处理等多种特性。主要功能• 消息系统:作为消息中间件,提供系统解耦,冗余存储,流量削锋,缓冲,异步通信,扩展性,可恢复性等功能;还支持消息顺序性保障。• 存储系统:把消息持久化到磁盘,可以配置数据长期保留• 流式处理平台:提供一个完整的流式处理类库体系结构• Zookeeper:管理Kafka元数据• Broker:Kafka服务节点,存储数据• Producer:生产者• Consumer:消费者

2021-05-25 22:43:42 181 1

原创 SpringBoot启动流程

SpringBoot启动流程public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { return new SpringApplication(primarySources).run(args);}1. 创建SpringApplicationpublic SpringApplication(ResourceLoader resourceLoader,

2021-05-25 22:15:15 86

原创 Netty学习笔记

Netty和NIO比有什么优点API简单,开发门槛低功能强大,支持多种主流协议,可靠性强定制能力强,可以通过ChannelHandler对通信框架进行灵活的定制成熟,稳定,修复了NIO的epoll 空轮询 bug社区活跃,版本迭代周期短经历了大规模商业应用的考验,质量高Netty内存模型主从Reactor模型NioEventLoopGroup boss = new NioEventLoopGroup(1);NioEventLoopGroup worker = new NioEven

2021-05-05 21:11:06 129 1

原创 JVM学习笔记

Java程序是如何运行起来的编写java代码编译java代码,编译成class字节码文件JVM类加载器加载class文件JVM字节码执行引擎执行class文件类加载器JVM通过类加载器加载class字节码文件类加载过程加载—》验证—》准备—》解析—》初始化—》使用—》卸载加载:按需加载,当代码中用到这个类的时候验证阶段:根据JVM规范,验证加载进来的class文件是否符合规范,内容是否完整【核心】准备阶段:给类分配内存空间,给static变量分配内存空间,设置初始

2021-05-04 16:39:49 188 1

原创 IO模型学习笔记

系统调用追踪指令# 跟踪SocketBIO程序strace -ff -o out java SocketBIO# 模拟客户端,连接服务器nc localhost 9090# 查看系统连接状态netstat -natpIO模型无论BIO、NIO、多路复用器,都是同步 IO 模型BIOJava代码public static void main(String[] args) { try { ServerSocket serverSocket = new Server

2021-05-04 16:35:55 138 2

原创 网络学习笔记

网络模型OSI七层网络模型自上向下分别为:应用层、表示层、会话层、运输层、网络层、数据链路层、物理层一次HTTP请求流程第一阶段:客户端发送数据浏览器中输入一个网址,根据DNS服务器解析出域名所在服务器所在的IP和端口应用层将请求数据组装成HTTP报文传输层接收应用层的报文,加上TCP首部,用来区分应用进程,实现可靠传输网络层接收传输层的数据报,加上IP首部,组成IP数据报数据链路层接收网络层的IP数据报,加上数据报头尾加上帧头帧尾,组成帧物理层把帧看做是比特流,加上前导码,让目的

2021-05-02 14:42:41 219

原创 记录一次不合理的线程池使用

问题现象压测持续了一段时间,很多接口响应逐渐超时,无法提供服务,于是停止压测,重启机器,开始排查问题观察线上日志,发现有大量线程池拒绝任务的抛出的异常java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@662948ab rejected from java.util.concurrent.ThreadPoolExecutor@59a46c25[Terminated, pool s

2021-02-15 21:21:27 393

原创 深入理解volatile关键字

volatile 是什么保证线程之间可见性,不保证原子性禁止指令重排Java内存模型Java Memory Model,简称 JMMhappen-before 规则内存屏障四种屏障:LoadLoad,LoadStore,StoreLoad,StoreStore谁来添加屏障硬件级别底层语义lock addl...

2021-02-12 20:33:29 167

原创 RocketMQ、Kafka、RabbitMQ、ActiveMQ各自特点及对比

有哪些MQ,各自特点是什么1、RocketMQ优点:高性能低延迟存储,高可用,支持事务消息,延迟消息,顺序消息,广播消息,重试,批量处理,消息过滤,可视化监控界面,消息跟踪开源,社区活跃,多语言,多协议,扩展性高支持万亿级消息存储,低延迟,高可用,开源分布式消息中间件,堆积能力非常好缺点:不支持消息优先级,因为所有数据都是持久化的,如果按优先级来排序开销很大。可以通过一些变通来处理优先级:用不同的topic来表示不同优先级,区别于普通队列,搞一个优先级高的队列,将优先级高的消息塞到这

2021-02-08 21:39:10 729

原创 深入理解synchronized关键字

概念是 java 中的一个关键字,作用于对象,多线程并发访问此对象时起到同步互斥的作用,可重入基本用法作用在对象给实例对象加锁作用在方法给实例对象加锁作用在静态方法给类对象加锁实现原理作用在对象上编译成字节码时会生成2个指令,monitorenter和monitorexistmonitorenter标识加锁,monitorexist 标识解锁加解锁需要一个位置来记录对象的解决锁状态每个对象有一个对象头,对象头中有2个关键数据mark wordklass pointe

2021-02-06 21:45:03 154 1

原创 InnoDB存储引擎——锁

锁介绍

2021-02-01 12:25:46 91

原创 InnoDB存储引擎——MVCC机制

what:什么是MVCC,用来解决什么问题when:在哪些场景会用到where:哪里会用到MVCCwhy:为什么要用MVCCwho:mysql 的 innodb存储引擎how:mysql是怎么实现mvcc 的how much:用了mvcc提升了多少性能========================什么是mvcc,解决什么问题问题是怎么背景mvcc是怎么解决的,通过什么原理用了mvcc会带来新的问题吗,能解决幻读不背景多事务并发的时候会有4种并发场景:读读,读写,写读,写写;最早的

2021-01-28 18:01:07 213

原创 binlog简介

概念binlog 用于记录数据库执行的写入性操作信息,以二进制的形式保存在磁盘上。binlog 是 MySQL 的逻辑日志,由 Server 层记录,使用任何存储引擎都会记录binlog日志逻辑日志:可以简单理解为记录的就是SQL语句物理日志:MySQL 最终的数据都存在数据页中,物理日志记录的就是数据页的变更binlog 通过追加的方式写入,可以通过 max_binlog_size 参数配置binlog文件的大小,当文件大小达到给定的定值后,会生成新的文件来保存日志使用场景主从复制:在

2021-01-27 18:09:40 1779

原创 InnoDB存储引擎——redo log

redo log 作用事务有一个重要特性:持久性,意思是说,只要事务提交成功,那么对数据库的修改就被永久保存了下来。怎么来保证持久性呢?简单的做法是在每次事务提交的时候,将该事务涉及到的数据页全刷回磁盘,但是这么做会导致严重的性能问题,主要体现在以下两点:InnoDB 中是以页为单位进行磁盘IO的,一个事务的修改可能只是修改数据页里的几个字节,这时候将整个数据页全部刷磁盘的话,太浪费资源了一个事务的修改可能涉及多个数据页,并且这些数据页在物理上并不连续,使用随机IO写入性能差为了解决这些问题,

2021-01-27 17:06:06 319

原创 InnoDB存储引擎——索引

二叉查找树左子树比根节点小右子树比根节点大通过中序遍历,得到从小到大的排序数据查找方式,如查询 5 的记录,先找根节点 8,8大于5;查找8的左子树,找到4,4小于5;查找4的右子树,找到5;一共找了3次二叉查找树可以任意构造,极端情况下会退化成链表,如图所示如果想要查询9,需要遍历整个链表,查询6次,查询效率就低了。这时候就需要这棵树是平衡的,于是就有了平衡二叉树,也叫AVL树平衡二叉树(AVL树)首先,满足二叉查找树定义其次,所有节点的左右子树最大高度差不超过1平

2021-01-22 22:22:26 146

原创 InnoDB存储引擎——undo log

什么是undo log,有什么作用数据回滚(1)当执行一条 insert、update、delete 操作的SQL语句时,会生成一条 undo log,可以称其为重做日志或回滚日志。(2)记录数据更新之前的样子,当需要回滚时,依据 undo log 恢复。(3)undo log是逻辑日志,只是将数据库逻辑的恢复到原来的样子(恢复缓冲池中的数据)(4)如果执行的是insert操作,undo log记录对应的delete操作;(5)如果执行的是delete操作,undo log记录对应的 ins

2021-01-20 11:20:21 566

原创 InnoDB存储引擎——Buffer Pool缓冲池

概念存储结构Free 链表Flush 链表LRU 链表冷热隔离问题刷磁盘策略

2021-01-18 22:54:08 167

原创 MySQL存储引擎简介

简介MySQL存储引擎负责数据的存储和读取,每个存储引擎都有自己的特点,MySQL 服务器通过API与存储引擎进行通信。MySQL体系结构中,支持了很多存储引擎:InnoDB,MyISAM,Memory,NDB Cluster等InnoDB支持事务,行锁,外键,使用多版本并发控制(MVCC)来获得高并发,实现了4种隔离级别,默认为 Repeatable 级别。使用一种被称为 next-key locking 的策略来避免幻读现象的产生。高性能和高可用功能:插入缓冲、二次写、自适应哈希索引、预读

2021-01-18 00:03:58 89

原创 MySQL事务隔离级别

事务特性MySQL数据库InnoDB存储引擎的事务完全符合事务ACID的特性。A:原子性(Atomicity)例如:A向B转账,A账户扣除100块,B账户增加100块,这2个操作要么都成功,要么都失败,如果有一个操作执行成功,一个执行失败,执行成功的操作需要回滚。C:一致性(Consistency)一致性指事务将数据从一种状态转变为下一种一致的状态。在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。应用系统从一个正确的状态到另一个正确的状态,ACID就是说事务能够通过AID来保证这个

2021-01-13 22:42:07 69

原创 MySQL是如何存储数据的

InndoDB 逻辑存储结构建了一张 tb_user 表,就对应了一个名为 tb_user.ibd 的表空间文件为了保证顺序IO,表空间被划分为多个连续的数据区,256个连续的数据区称为一个数据区组,一个数据区又由64个连续的数据页组成,数据页包含数据行。一个数据页大小为 16 KB一个数据区大小为 64 * 16 KB = 1 MB一个数据区组大小为 256 * 1 MB = 256 MB在 InnoDB 中有个参数 innodb_file_per_table ,默认值为 on,表示每张表的

2021-01-12 18:38:41 5137

原创 MySQL是如何执行SQL语句的

通过这篇文章,我们一起来了解一下, Java 程序执行下面这条 SQL 语句去查询 MySQL 数据,会经历些什么。select * from tb_user where id = 1;我们要和 MySQL 通信,首先得跟 MySQL 建立网络连接,在 Java 程序中使用 mysql-connector-java 驱动包与数据库建立连接。我们知道在并发场景下频繁的创建网络连接开销很大,于是就有了数据库连接池(Druid,C3P0,DBCP),平常工作中就是那么干的,与之相对的数据库这边也有对应的

2021-01-09 18:24:36 490 1

原创 Redis数据类型与命令

Redis有5种基础数据结构,分别为:string(字符串),list(列表),hash(字典),set(集合),zset(有序集合)。string字符串 string 是 Redis 最简单的数据结构,做简单的 key-value 缓存,内部结构是一个字符数组。键值对操作# set命令127.0.0.1:6379> set name muskmelonOK# get命令127.0.0.1:6379> get name"muskmelon"# exists命令127.0

2020-10-29 16:18:39 76

原创 CAS实现原理

概念CAS , Compare And Swap ,顾名思义,比较并交换,整个AQS的同步组件、Atomic原子类操作等都是以CAS实现的。可以说CAS是整个JUC包的基石。CAS在CAS中有三个参数:内存值V,旧的预期值A、要更新的值B,当且仅当内存值V的值等于旧的预期值A时才会将内存值V的值修改为B,否则什么都不干。伪代码如下:if(this.value == A){ this.value = B; return true;}else{ return false;

2020-10-24 22:09:19 298

原创 《Redis设计与实现》笔记——简单动态字符串(SDS)

前言Redis中构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型。作用:表示字符串值用作缓冲区:AOF模块中AOF缓冲区,客户端状态中的输入缓冲区示例:如果客户端执行命令:redis > SET msg "hello world"OK那么Redis将在数据库中创建一个新的键值对,其中:键值对的键是一个字符串对象,底层是一个保存着字符串 "msg" 的SDS键值对的值也是一个字符串,底层是一个保存着字符串 "hello world"

2020-09-11 16:53:43 100

原创 一个简单的伪异步IO程序

为了解决同步阻塞IO面临的一个请求需要一个线程处理的问题,后来有人对它的线程模型进行了优化,通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例关系,其中M可以远大于N。通过线程池可以灵活的调配线程资源,设置线程的最大值,防止由于海量请求并发接入导致线程耗尽。下面我们通过一个示例来说明服务端代码TimeServerpublic class TimeServer { public static void main(String[] args) throws I

2020-07-19 16:54:09 158

原创 一个简单的BIO通信程序

简介同步阻塞I/O(Blocking )

2020-07-18 23:29:35 213

原创 Spring 系列——Bean生命周期

贴一张总的图说明代码执行流程看源码入口方法:getBeandoCreateBean关键的三个方法:createBeanInstance:实例化对象通过反射实现populateBean:设置对象属性实现了InstantiationAwareBeanPostProcessor接口 执行方法initializeBean:对象初始化完成后回调↓实现了Aware接口的回调BeanNameAwareBeanClassLoaderAwareBeanFactoryAwareBeanPo

2020-07-06 18:34:30 149

原创 Spring 系列——IOC容器初始化

说明文章参考的版本5.1.6.RELEASE1.引言贴一段示例代码,说明Spring容器启动给出容器中最终的数据图例说明源码与图例的对应关系,容器的类继承结构三种容器创建方式,用途介绍ClassPathXmlApplicationContextFileSystemXmlApplicationContextAnnotationConfigApplicationContext2.介绍容器BeanFactory3.介绍BeanDefinition4.容器启动步骤抛出总的步骤解析xml配置

2020-07-02 19:23:59 298

原创 一步一图带你深入理解LinkedList底层原理

上一篇文章《一步一图带你深入理解ArrayList底层原理》中,我们介绍了ArrayList的底层原理,除了ArrayList之外,还有个集合我们也经常用到,就是LinkedList,它与ArrayList有什么区别呢?本篇文章就来讲讲它内部的实现原理,看完你就知道有什么不同了。特性基于双向链表实现,添加删除元素快O(1),查找元素慢 O(n)实现了List和Queue接口的方法,允许所有的元素,包括null初始变量// 记录链表长度transient int size = 0;// 链表

2020-06-26 21:41:14 571

原创 一步一图带你深入理解ArrayList底层原理

ArrayList是我们日常开发过程中经常使用的一个集合类之一,小伙伴们你们知道其内部原理是什么样的吗,比如:采用了什么数据结构?添加、删除元素是怎么实现的?怎么扩容?操作数据线程安全吗?阅读完这篇文章,你就能找到答案了。特性基于数组实现,查找快:O(1),添加慢: O(n)实现List接口中所有的操作集合的方法,允许所有元素,包括null实现RandomAccess接口,支持随机访问初始化new ArrayList():构造一个空的数组集合,容量大小为默认值10new ArrayLis

2020-06-23 00:40:10 1022 1

原创 Linux软件安装——Redis

下载Redis进入官网找到下载地址 https://redis.io/download安装到 /usr/local/src目录解压tar -zxvf redis-5.0.8.tar.gz解压后多了个redis-5.0.8文件夹编译进入到redis目录,进行编译cd /usr/local/src/redis-5.0.8make执行结果图:安装进入到redis目录输入命令执行进行安装make PREFIX=/usr/local/src/redis-5.0.8 install

2020-06-09 00:20:28 172

原创 Linux软件安装——Zookeeper

注:安装前提条件,必须现在linux中安装好jdk一、下载并解压安装包1.进入Zookeeper官网下载安装包镜像地址:http://mirror.bit.edu.cn/apache/zookeeper/2.进入/usr/local目录cd /usr/local3.在此目录下载zookeeper安装包wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin

2020-06-05 23:41:27 146

原创 Linux软件安装——Java8

1、创建java目录 /usr/javacd /usrmkdir java2、上传jdk文件3、授权chmod +x java4、执行安装rpm -ivh jdk-8u251-linux-x64.rpm5、校验安装java -version如果出现版本信息,则表示安装成功6、设置环境变量vi /etc/profileexport JAVA_HOME=/usr/java/jdk1.8.0_251-amd64 exportJAVA_BIN=/usr/java/jdk1.8

2020-06-05 23:31:38 103

原创 从0到1搭建Linux虚拟机环境

一、准备首先,我们找到安装所需要的工具和操作系统,直接去官网下载即可。VisualBox工具:https://www.virtualbox.org/Linux操作系统:链接: https://pan.baidu.com/s/1d4zrWGQzvtTMHvIMfHt-FA 提取码: w8ai二、使用VirtualBox创建虚拟机文本使用的版本为6.11、打开VirtualBox,点击【新建】进入新建操作界面(1)输入虚拟机名称(2)选择文件夹路径,建议安装到其他盘,非C盘(3)类型选择L

2020-06-05 23:28:32 275

原创 JVM类加载机制

我们都知道自己编写的Java程序编译成".class"文件后是需要加载到虚拟机中之后才能运行和使用。那么虚拟机是如何加载这些class文件的呢?类的生命周期类从被加载到虚拟机开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。加载–>验证–>准备–>初始化–>卸载,这五个阶段的顺序是确定的,类的加载过程必须按照这种顺序按...

2020-04-07 23:10:25 72

原创 Java虚拟机内存结构

当我们将类加载到JVM中后,JVM会将内存划分为不同的数据区域,不同的区域有不同的用途,主要包括以下几个运行时数据区域,如下图所示。方法区方法区是在JDK1.8以前版本里的一块内存区域,是线程共享的内存区域。用于存储被虚拟机加载进来的类信息、常量、静态变量、即时编译器编译后的代码等数据,有个别名叫做NonHeap(非堆),目的是与Java堆区分开来。但在JDK1.8以后,这块区域的名字改了...

2020-04-06 15:56:07 67

原创 lambda性能分析

for循环与lambda filter性能分析自从Java8出了之后,我们在编写代码的时候,经常会使用lambda表达式去查找元素,如下表达式:list.stream().filter(m -> m == target)来替代for循环遍历,主要是因为写法简单。那么问题来了,lambda表达式是否有带来性能提升呢。我们通过下面这个例子来看看一下private static List...

2020-04-05 22:41:36 1039 2

原创 SpringBoot JPA 问题汇总

1、项目启动报错:a bean of type ‘xxxx’ that could not be found原因分析:找不到JpaRepository所在的类***************************APPLICATION FAILED TO START***************************Description:A component required...

2020-01-18 22:31:28 373

Zookeeper笔记.zip

Zookeeper的笔记知识,从分布式架构到一致性协议说明,Zookeeper的基本用法,Zookeeper典型使用场景,和技术内幕

2020-07-08

idea2018破解文件

idea破解工具文件,适用于2018.3版本,有效期至2100年

2019-04-27

24种设计模式pdf格式

对于JAVA开发,设计模式是必不可少的,希望会对你有帮助

2014-03-25

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

TA关注的人

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