自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM之垃圾回收机制

垃圾回收是做什么的呢? 处理不需要的对象的,就像是垃圾清理工。是一个后台服务,默默处理任务的。垃圾对象是如何被判定的呢? ①没有任何方法的局部变量指向它 ②没有任何类的静态变量指向它 ③没有常量指向它方法区内的类会不会进行垃圾回收呢? 会的。 ①该类的所有实例对象都已经从Java堆内存里被回收 ②加载这个类的ClassLoader已经被...

2019-10-26 15:36:06 183

原创 JVM之内存区域划分

程序计数器: 当前线程执行的字节码的指示器。也就是记录当前执行的字节码指令位置用的。Java虚拟机栈: 虚拟机栈是用来描述Java方法执行的内存模型,每个线程都有自己的Java虚拟机栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。堆内存: 主要用来给对象分配内存。方法区(元数据区): 用来存储类信息、常量、静态变量...

2019-10-26 15:24:20 186

原创 JVM之类加载机制

一个类从加载到使用的过程中,会经历一个过程:加载--验证--准备--解析--初始化--使用--卸载验证阶段: 这一步会根据Java虚拟机规范,对加载的.class文件进行校验。准备阶段: 这个阶段,会给类对象分配内存空间,也会给类的静态变量分配内存空间,并赋一个初始值,注意,是初始值。例如:int类型赋值为0.解析阶段: 解析阶段主要...

2019-10-26 14:53:53 155

原创 架构演进

1.什么是大型网站? 访问量和数据量缺一不可的网站。2.大型网站架构演进 2.1.首先是单机构建的网站, 2.2.随着业务量的增长,单机无法满足,将数据库与应用分离 2.3.应用服务器集群化 2.3.1.负载均衡设备 2.3.2.解决应用服务器变为集群后的Session问题 ...

2019-10-07 10:06:45 126

原创 分布式系统介绍

什么是分布式系统? A distributed system is one in which components located at networked computers communicate and coordinate their actions only by passing messages. ①分布式系统一定由多节点组成; ②组成的节点...

2019-10-03 16:21:10 179

原创 Wireshark---网络被劫持

打开某个目标网站时,有时候会加载出其他的网站。思路:1.通过抓包,发现有些包乱序了,为什么会乱序呢?因为劫持的包抢先到达,导致乱序。2.被劫持的原理是:正常情况下,用户发出的HTTP请求,经过层层路由才能到达真实的Web服务器,然后真实的HTTP响应又经过层层路由才能回到用户端。如果是非正常情况,运营商可以在路由器上复制HTTP请求,交给假的Web服务器。然后在真的HTTP响应之前,把假的H...

2019-09-15 10:07:21 542

原创 Wireshark---MTU带来的问题

当客户端发送给服务器的巨帧经过路由器时,要么被丢包,要么被分片,取决于该巨帧是否在网络层带了DF(Don’t Fragment)标志。案例1:用户浏览某些共享目录时客户端会死机,浏览其他目录则不会。思路:通过抓包,发现一直在重传,但是客户端一直没有确认。发生丢包的可能性很多,为什么能确定是MTU导致的呢?思路如下:①如果端口被防火墙阻止了也可能丢包,但是会从三次握手时就开始丢②网络拥...

2019-09-15 09:45:09 1212

原创 Wireshark---几个关于分片的问题

1.为什么要分片?目的是为了提高链路的利用率。电路交换的双方要独占链路,所以利用率很低,后来发明了分组交换,将数据分割,分割就需要确定包的大小,即MTU(最大传输单元)。2.发送方是如何确定分片大小的?一般发送方是根据自身的MTU来决定分片大小的。3.接收方是靠什么重组分片的?包里面有个flag,More fragments=0时,表示他是最后一个分片。4.TCP是如何避免被发送发分片...

2019-09-15 09:26:45 1455

原创 Wireshark的一些提示

1.TCP Previous segment not capturedTCP传输过程中,同一台主机发出的数据段应该是连续的,即后一个包的Seq号等于前一个包的Seq+Len(握手和挥手除外)。当Wireshark发现后一个包的Seq号大于前一个包的Seq+Len时,就会提示TCP Previous segment not captured。2.TCP ACK unseen segment当W...

2019-09-15 09:26:12 1322

原创 Wireshark---延迟确认和SACK

TCP协议栈默认是启用延迟确认的,启用的好处是在发送数据时,捎带确认,节省带宽,坏处是延迟,还有一点不太好的是,延迟确认会触发超时重传,这样带来的影响就更大了,在TCP窗口较小时,启用延迟确认,性能更差。解决方案:关闭延迟确认。有没有别的解决方案呢?有的,启用SACK。尤其在远程通讯时,启用SACK更高效,因为远程通讯的往返时间要花较多的时间。在Wireshark通过过滤条件"tcp.an...

2019-09-15 09:25:44 696

原创 Wireshark---LSO是什么

如果需要估算网络的拥塞点,可能会遇到一种情况,只能看见重传的包,根据Seq过滤找不到原始的包。可能原因:1.包是在接收方抓的,看不到已经丢在路上的原始包2.开始抓包时,原始包已经传完。实际情况是,原始包已经抓到了,但是Seq号过滤不出来。换了一个过滤条件,但是有意外的发现,TCP的MSS是1388,但是抓到的包有len=2倍MSS大小的包。经过一番搜索以后,发现是LSO(Large Seg...

2019-09-13 11:43:09 414

原创 Wireshark---没有启用SACK的性能问题

存储设备,写的性能很好,但是读的性能很差,相差约4.5倍。思路:1.一般的存储设备都是读比写快,所以排除存储设备本身的问题。2.存储端的带宽大,客户端的小,读取文件时数据从大入小,难免会有溢出的问题(网络拥塞),然后就会导致性能问题。写是相反的。3.抓包验证。分析:1.抓包以后,发现很多重传,重传对性能的影响很大,哪怕只有千分之5,。方案:1.将存储设备的发送窗口设置为较小的值,限...

2019-09-13 11:11:44 250

原创 Wireshark---接收方乱序导致的问题

首先,这是一个性能问题,经过简答你的抓包排查,发现有较多的重传(Retransmission),还有较多的乱序(Out-Of-Order)。思路:1.判断是乱序导致的重传,影响了性能。2.乱序产生的原因?一般是由发送方或者网络设备导致的。方案:1.通讯最小化原理,尽量减少中间设备2.LSO(Large Segment Offload,网卡直接负责分段大于MSS的数据,不需要CPU)会导...

2019-09-13 10:47:27 1697

原创 Wireshark---TCP的重传

为什么会有重传?重传的阈值是怎么计算的?重传有哪几种方式?①网络的传输大小不可能无限大,那么就会有限制,如果超过这个限制就会导致网络拥塞,拥塞就会丢包,丢包就需要重传。②动态的,无法精确计算。③快速重传,超时重传1.慢启动刚建立连接,发送方对网络不了解,如果一次发送太多就可能拥塞,RFC建议把初始拥塞窗口设置为2-4个MSS的大小,然后每收到n个确认,就把拥塞窗口增加n个MSS。2.拥...

2019-09-13 09:29:38 643

原创 Wireshark---TCP窗口的几个误区

1.window size (即win=),这个值是发送窗口的大小吗?不是,这是在向对方声明自己的接收窗口。2.如何从包里看出发送窗口的大小呢?没有办法。3.发送窗口和MSS(最大段大小)有什么关系?发送窗口决定了一次能发送多少字节,而MSS决定了这些字节要分多少个包发完。4.发送方在一个窗口里发出n个包,就一定能收到n个确认包?不一定,确认包一般会少。因为TCP有延迟确认。那为...

2019-09-13 08:06:28 2336

原创 MyBatis之数据源

DataSourceFactory是数据源工厂,两个子类是PooledDataSourceFactory和UnpooledDataSourceFactory,唯一的区别是,PooledDataSourceFactory的构造函数初始化的是PooledDataSource。PooledDataSource和UnpooledDataSource都是DataSource的实现类。PooledData...

2019-06-18 08:12:50 2279

原创 Mybatis之分页插件

PageInterceptor上面的@Intercepts注解和@Signature注解,会确定需要拦截的类和方法,然后使用动态代理为Executor创建代理对象。拦截的具体逻辑是在intercept方法里面: public Object intercept(Invocation invocation) throws Throwable { try { //...

2019-06-15 21:10:47 131

原创 MyBatis之ResultSetHandler

ResultSetHandler 会负责映射select语句查询得到的结果集,public interface ResultSetHandler { //生成对应的结果对象集合 <E> List<E> handleResultSets(Statement stmt) throws SQLException;//生成对应的游标对象 <E> Curs...

2019-06-15 10:14:06 1109

原创 MyBatis之初始化

MyBatis初始化的主要工作是加载并解析mybatis-config.xml配置文件、映射配置文件以及相关的注解信息。MyBatis初始化的入口是 SqlSessionFactoryBuilder#build(Reader reader, String environment, Properties properties) public SqlSessionFactory build(Re...

2019-06-15 10:08:56 125

原创 MySQL之自增主键为什么不是连续的?

自增主键为什么不是连续的?在 MySQL 5.7 及之前的版本,自增值保存在内存里,并没有持久化。每次重启后,第一次打开表的时候,都会去找自增值的最大值 max(id),然后将 max(id)+1 作为这个表当前的自增值。在 MySQL 8.0 版本,将自增值的变更记录在了 redo log 中,重启的时候依靠 redo log 恢复重启之前的值。在 MySQL 里面,如果字段 id 被定...

2019-06-09 09:28:57 1095

原创 Linux之磁盘性能指标有哪些?

磁盘性能指标有哪些?使用率、饱和度、IOPS、吞吐量以及响应时间等。这五个指标,是衡量磁盘性能的基本指标。使用率,是指磁盘处理I/O的时间百分比。过高的使用率(比如超过80%),通常意味着磁盘 I/O 存在性能瓶颈。饱和度,是指磁盘处理 I/O 的繁忙程度。过高的饱和度,意味着磁盘存在严重的性能瓶颈。当饱和度为 100% 时,磁盘无法接受新的 I/O 请求。IOPS(Input/Outpu...

2019-06-09 09:28:18 910

原创 Mybatis基础支持层之反射工具箱

Reflector是Mybatis中反射模块的基础,每个Reflector对象都有对应一个类。 //对应的Class类型 private Class<?> type; //getter属性的名称集合 private String[] readablePropertyNames = EMPTY_STRING_ARRAY; //setter属性的名称集合 privat...

2019-06-09 09:18:55 80

原创 Mybatis之整体架构

传统JDBC流程:注册数据库驱动类,指定数据库URL地址、用户名、密码等连接信息通过 DriverManager 打开数据库连接通过数据库连接创建 Statement 对象通过 Statement 对象执行SQL语句,得到ResultSet对象通过ResultSet读取数据,并将数据转换成JavaBean对象关闭ResultSet、Statement对象以及数据库连接,释放资源O...

2019-06-02 19:32:25 121

原创 Spring之IOC容器的实现

控制反转:依赖对象的获得被反转了,即依赖注入。BeanDefinition用来管理基于Spring的应用中的各种对象以及它们之间的相互依赖关系。抽象了我们对Bean的定义,是让容器起作用的主要数据模型。依赖反转功能都是围绕对BeanDefinition的处理来完成的。编程式使用IOC容器的过程: ClassPathResource resource = new ClassPathRes...

2019-06-02 17:40:56 78

原创 Redis阻塞问题

导致Redis阻塞分为内在原因和外在原因:内在原因:不合理使用API或数据结构、CPU饱和、持久化阻塞等外在原因:CPU竞争、内存交换、网络问题等定位慢查询Redis原生提供慢查询统计功能,执行 showlog get {n} 命令可以获取最近n条慢查询命令,Redis默认记录仪执行超过10毫秒的记录。...

2019-06-01 17:01:05 648

原创 Redis之持久化

RDB:RDB持久化是把当前进程数据生成快照保存到硬盘的过程,分为手动触发和自动触发。手动触发:bgsave,会fork一个子进程,持久化过程由子进程负责,save由于会阻塞因此已经废弃。自动触发:Redis一些内部机制会触发。RDB优缺点:优点:紧凑压缩的二进制文件,适合于备份,全量复制的场景。加载RDB恢复数据远快于AOF缺点:不能做到实时持久化,原因是fo...

2019-06-01 14:56:16 62

原创 Redis之Redis Cluster集群方案

数据分布:分布式数据库首先需要解决的是,把整个数据集按照分区规则映射到多个节点的问题,常见的分区规则有哈希分区和顺序分区。哈希分区:离散度好数据分布业务无关无法顺序访问顺序分区:离散度倾斜数据分布业务相关可以顺序访问Redis Cluster 采用的是哈希分区:常见的哈希分区方案:节点取余优点是简单,缺点是当节点数量变化时,数据节点映射关系需要重新计算,会导致数...

2019-06-01 11:23:41 109

原创 Linux 磁盘I/O是怎么工作的?

Linux 磁盘I/O是怎么工作的?VFS 内部通过目录项、索引节点、逻辑块以及超级块等数据结构,来管理文件。目录项,记录了文件的名字,以及文件与其他目录项之间的目录关系。索引节点,记录了文件的元数据。逻辑块,是由连续磁盘扇区构成的最小读写单元,用来存储文件数据。超级块,用来记录文件系统整体的状态,如索引节点和逻辑块的使用情况等。为了减小不同块设备的差异带来的影响,Linux 通过一个...

2019-05-19 13:23:27 300

原创 Redis Sentinel实现原理

Redis Sentinel实现主要包括几个方面:三个定时任务、主观下线和客观下线、Sentinel领导者选举、故障转移。三个定时任务1.每隔10秒,每个Sentinel节点会向主节点和从节点发送info命令获取最新的拓扑结构通过向主节点执行info命令,获取从节点的信息当有新的从节点加入时可以立即感知节点不可达或故障转移后,可以通过info命令实时更新节点拓扑信息2.每隔2秒,每...

2019-05-19 13:22:21 530

原创 Linux 文件系统是怎么工作的?

Linux 文件系统是怎么工作的?Linux文件系统为每个文件都分配两个数据结构,索引节点(index node)和目录项(directory entry)。索引节点,简称为inode,用来记录文件的元数据,比如inode编号、文件大小、访问权限、修改日期、数据的位置等。索引节点和文件一一对应,它跟文件内容一样,都会被持久化存储到磁盘中。所以记住,索引节点同样占用磁盘空间。目录项,简称为de...

2019-05-18 18:00:59 379

原创 Linux内存是怎么工作的?

Linux内存是怎么工作的?只有内核才可以直接访问物理内存。那么,进程要访问内存时,该怎么办呢?Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存。虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同字长(也就是单个CPU指令可以处理数据的最大长度)的处理器,地址空间的范围也不同。内存中的Buf...

2019-05-18 18:00:24 172

原创 Redis之主从复制

Redis复制功能分为同步和命令传播两个操作:同步用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态(类似新建)。命令传播用于当主从服务器的状态不一致时,让二者状态回到一致(类似更新)。同步是通过SYNC命令完成的,具体步骤如下:从服务器向主服务器发送SYNC命令收到SYNC的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并用一个缓冲区记录当前开始执行的所有写命...

2019-05-18 15:01:28 59

原创 Linux软中断?

怎么理解Linux软中断?中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求。为了解决中断处理程序执行过长和中断丢失的问题,Linux将中断处理过程分成了两个阶段,也就是上半部和下半部:上半部用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作。下半部用来延迟处理上半部未完成的工作,通常以内核...

2019-05-12 12:27:05 448

原创 Linux之CPU100%

应用的CPU使用率达到100%,怎么处理?应用的CPU使用率达到100%,怎么处理?Linux 通过 /proc 虚拟文件系统,向用户空间提供了系统内部状态的信息,而 /proc/stat 提供的就是系统的 CPU 和任务统计信息。CPU 使用率是最直观和最常用的系统性能指标,更是我们在排查性能问题时,通常会关注的第一个指标。所以我们更要熟悉它的含义,尤其要弄清楚用户(%use...

2019-05-12 12:23:38 358

原创 MySQL join 优化

join优化?回表是指,InnoDB 在普通索引 a 上查到主键 id 的值后,再根据一个个主键 id 的值到主键索引上去查整行数据的过程。回表是一行行搜索主键索引的。因为大多数的数据都是按照主键递增顺序插入得到的,所以我们可以认为,如果按照主键的递增顺序查询的话,对磁盘的读比较接近顺序读,能够提升读性能。这就是 MRR 优化的设计思路。MRR 能够提升性能的核心在于,这条查询语句在...

2019-05-12 12:22:29 300

原创 MySQL之Join

MySQL join?使用 join 有什么问题呢?1.如果可以使用 Index Nested-Loop Join 算法,也就是说可以用上被驱动表上的索引,其实是没问题的;2.如果使用 Block Nested-Loop Join 算法,扫描行数就会过多。尤其是在大表上的 join 操作,这样可能要扫描被驱动表很多次,会占用大量的系统资源。所以这种 join 尽量不要用。所以你在判...

2019-05-12 12:21:48 78

原创 MySQL读写分离有哪些坑?

读写分离有哪些坑?读写分离的主要目标就是分摊主库的压力。一种架构是客户端(client)主动做负载均衡,这种模式下一般会把数据库的连接信息放在客户端的连接层。也就是说,由客户端来选择后端数据库进行查询。一种架构是,在 MySQL 和客户端之间有一个中间代理层 proxy,客户端只连接 proxy, 由 proxy 根据请求类型和上下文决定请求的分发路由。客户端直连和带 proxy 的读写...

2019-05-11 19:05:21 983

原创 Linux之 CPU上下文切换

经常说的 CPU 上下文切换是什么意思?每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU 寄存器和程序计数器(Program Counter,PC)。CPU 寄存器,是 CPU 内置的容量小、但速度极快的内存。而程序计数器,则是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。它们都是 CPU 在运行任何任务前,必...

2019-05-11 08:38:07 288

原创 Linux之怎么理解“平均负载”?

怎么理解“平均负载”?平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和CPU使用率并没有直接关系。当平均负载为2时,意味着什么呢?1.在只有2个CPU的系统上,意味着所有的CPU都刚好被完全占用。2.在4个CPU的系统上,意味着CPU有50%的空闲。3.而在只有1个CPU的系统中,则意味着有一半的进程竞争不到CPU。在 uptime ...

2019-05-10 20:28:41 137

原创 MYSQL 备库延迟问题

MYSQL 备库延迟问题一个线程负责客户端写入主库,另一线程sql_thread 执行中转日志(relay log)。在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高、TPS 高时就会出现严重的主备延迟问题。coordinator (sql_thread)在分发的时候,需要满足以下这两个基本要求:1.不能造成更新覆盖。这就要求更新同一行的两个事务,必须被...

2019-05-10 20:27:06 449

空空如也

空空如也

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

TA关注的人

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