06 2021 档案
摘要:AspectJ原理: AspectJ是一个代码生成工具(Code Generator)。 AspectJ语法就是用来定义代码生成规则的语法。您如果使用过Java Compiler Compiler (JavaCC),您会发现,两者的代码生成规则的理念惊人相似。 AspectJ有自己的语法编译工具,编
阅读全文
摘要:动态代理 JDK动态代理:只能为接口创建动态代理实例,而不能针对类 。 CGLib(Code Generation Library)动态代理:可以为任何类创建织入横切逻辑代理对象,主要是对指定的类生成一个子类,覆盖其中的方法,因为是继承,所以该类或方法最好不要声明成final。 原理对比: JDK动
阅读全文
摘要:1、分布式锁目前可能存在的问题(基于redis客户端jedis)加锁: set key value [expiration EX seconds|PX milliseconds] [NX|XX]该加锁方式是从Redis2.8之后便支持这种原子性加锁方式,之前设置setnx和设置过期时间不是原子性的。
阅读全文
摘要:一、复习跳跃表1.1 什么是跳跃表对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高,是 O(n)。 如果我们想要提高其查找效率,可以考虑在链表上建索引的方式。每两个结点提取一个结点到上一级,我们把抽出来的
阅读全文
摘要:using filesort 一般出现在 使用了 order by 语句当中。using filesort不一定引起mysql的性能问题。但是如果查询次数非常多,那么每次在mysql中进行排序,还是会有影响的。这里的优化方式是在order by 的字段建立索引,解决方法如下:从where条件开始,依
阅读全文
摘要:Dubbo的集群容错策略正常情况下,当我们进行系统设计时候,不仅要考虑正常逻辑下代码该如何走,还要考虑异常情况下代码逻辑应该怎么走。当服务消费方调用服务提供方的服务出现错误时候,Dubbo提供了多种容错方案,缺省模式为failover,也就是失败重试。Failover Cluster:失败重试当服务
阅读全文
摘要:一、为什么需要主从复制?1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。2、做数据的热备3、架构的扩展。业务量越来越大,I
阅读全文
摘要:put多个线程同时向Node[]的同一个位置插入时,会发生覆盖,只有一个线程的操作会被保留。如下图源码,假如有A、B两个线程,同时在执行put且数组下标都为1,两个线程同时运行到第一个红框位置,判断tab[1]为null,A线程先执行tab[1]=NodeA,B线程再执行tab[1]=NodeB,这
阅读全文
摘要:一.ArrayList继承了AbstractList,实现了List接口,底层实现基于数组,因此可以认为是一个可变长度的数组。二.在讲扩容机制之前,我们需要了解一下ArrayList中最主要的几个变量: //定义一个空数组以供使用 private static final Object[] EMPT
阅读全文
摘要:有时候需要索引很长的字符列,这会让索引变得大且慢。通常可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率。但这样也会降低索引的选择性。索引的选择性是指不重复的索引值(也称为基数,cardinality)和数据表的记录总数的比值,范围从1/T到1之间。索引的选择性越高则查询效率越高,因
阅读全文
摘要:一、前提概要什么是MVCC?MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性
阅读全文
摘要:幻读:幻读指的是一个事务在进行一次查询之后发现某个记录不存在,然后会根据这个结果进行下一步操作,此时如果另一个事务成功插入了该记录,那么对于第一个事务而言,其进行下一步操作(比如插入该记录)的时候很可能会报错。从事务使用的角度来看,在检查一条记录不存在之后,其进行插入应该完全没问题的,但是这里却抛出
阅读全文
摘要:最近开始在学习mysql相关知识,自己根据学到的知识点,根据自己的理解整理分享出来,本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的。 一、mysql架构分析下面是mysql的一个简要架构图: mysql主要分为Serv
阅读全文
摘要:一、JDK工具先来看看有哪些常用的工具可以辅助我们进行性能调优和问题排查,后面再通过一个具体的示例结合工具来分析调优。1、JDK工具JDK自带了很多性能监控工具,我们可以用这些工具来监测系统和排查内存性能问题。 2、利用 jps 找出进程jps(Java Virtual Machine Proces
阅读全文
摘要:前面已经提到过很多JVM的参数了,这节再简单汇总下,以及部分不常用的参数。Java启动参数共分为三类: 标准参数(-):所有的JVM实现都必须实现这些参数的功能,而且向后兼容,如 -version、-classpath 非标准参数(-X):默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满
阅读全文
摘要:在《Java虚拟机规范》的规定里,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(OOM)异常的可能。通常而言,内存溢出问题对系统是毁灭性的,它代表VM内存不足以支撑程序的运行,所以—旦发生这个情况,就会导致系统直接停止运转,甚至会导致VM进程直接崩溃掉。O
阅读全文
摘要:一、内存调优的目标新生代的垃圾回收是比较简单的,Eden区满了无法分配新对象时就触发 YoungGC。而且新生代采用的复制算法效率极高,加上新生代存活的对象很少,只要迅速标记出这少量存活对象,移动到Survivor区,然后快速回收掉Eden区,速度很快。一般一次YoungGC就耗费几毫秒或几十毫秒,
阅读全文
摘要:接下来我们就通过一些demo结合着GC日志分析下什么时候会触发GC,以及对象在堆中如何分配流转的。1、对象首先分配到Eden区我们通过如下这段程序来验证下对象首先是分配到 Eden 区的: static final int _1M = 1024 * 1024; @RequestMapping(val
阅读全文
摘要:在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。堆的内存
阅读全文
摘要:1、设置JVM内存1)JVM内存分配有如下一些参数: -Xms:堆内存大小 -Xmx:堆内存最大大小 -Xmn:新生代大小,扣除新生代剩下的就是老年代大小 -Xss:线程栈大小 -XX:NewSize:初始新生代大小 -XX:MaxNewSize:最大新生代大小 -XX:InitialHeapSiz
阅读全文
摘要:垃圾回收算法是内存回收的方法论,垃圾回收器是内存回收的实践者。不同的垃圾回收器有不同的特性,并没有一个万能或最好的垃圾回收器,只能根据不同的业务场景选择最合适的垃圾回收器,所以这节就来了解下各个垃圾回收器的特性。1、Stop The World(STW)先看看jvm的 “Stop The World
阅读全文
摘要:1、分代收集理论大部分虚拟机的垃圾回收器都是遵循“分代收集”的理论进行设计的,它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般至少将堆划分为新生代和老年代两个区域,然后可以根据不同代的特点采取最适合的回收算法。在新生代中,每次垃圾回收时都有大量对象死去,因为程序创建的绝大部分对
阅读全文
摘要:下游消费系统如果宕机了,导致几百万条消息在消息中间件里积压,此时怎么处理?你们线上是否遇到过消息积压的生产故障?如果没遇到过,你考虑一下如何应对?首先要找到是什么原因导致的消息堆积,是Producer太多了,Consumer太少了导致的还是说其他情况,总之先定位问题。然后看下消息消费速度是否正常,正
阅读全文
摘要:这节介绍Rebalance流程。在介绍Consumer消费消息流程前,先介绍Rebalance得流程,该过程涉及到Consumer的启动。之前介绍过,Topic是一个逻辑概念,Topic下可以划分多个Queue以增加Consumer消费的并行度。在一个Consumer Group内,Queue和Co
阅读全文
摘要:一、功能Namesrv的功能大概可以总结为下面2点: 接收broker的请求注册broke路由信息(包括master和slave):broker启动时向所有NameSrv注册,Producer在发送消息前先从Namesrv获取Broker服务器地址列表,通过负载算法选择对应服务器进行消息发送。Nam
阅读全文
摘要:Java中GCRoots包括哪些在垃圾回收过程中如何判断一个对象是否是垃圾,有两种算法。一种是引用记数法,一种是可达性分析法。 引用记数法是早期垃圾回收器中使用的算法,每一个对象维护一个该对象被引用的记数,每引用一次,记数加1,每减少引用1次,引用减1,当引用为0时,表示该对象不再被引用,可以作为垃
阅读全文
摘要:JAVA堆内存管理是影响性能主要因素之一。堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的。先看下JAVA堆内存是如何划分的,如图: JVM内存划分为堆内存和非堆内存,堆内存分为年轻代(Young Generation)、老年代(Old Generat
阅读全文
摘要:LockSupport是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,当然阻塞之后肯定得有唤醒的方法。concurrent包是基于AQS (AbstractQueuedSynchronizer)框架的,AQS框架借助于两个类: Unsafe(提供CAS操作) LockSupp
阅读全文

浙公网安备 33010602011771号