自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一个菜鸟的博客

这个作者很懒,什么都没留下

  • 博客(228)
  • 收藏
  • 关注

原创 Spring依赖注入

方法参数个数为0,并且方法名字以get开头或者方法名字以is开头并且方法返回值类型为boolean。

2024-07-10 20:55:37 1034

原创 Spring底层架构核心概念解析

还可以。

2024-06-16 02:15:00 995

原创 Arthas&GC日志&GCeasy详解

以上的参数,能够帮我们查看分析GC的垃圾收集情况,但是如果GC日志很多很多,成千上万行.就算一目十行,看完了脑子也还是一片空白.所以我们可以借助一些东西来帮助我们分析.这里推荐。对于Java应用我们可以通过一些配置把程序运行过程中的GC日志全部打印出来,然后分析GC日志得到关键性指标,分析GC原因,调优JVM参数.这里的日志记录的就更为详细,每个CMS的阶段(初始标记,并发标记,重新标记,并发重置)都有涉及.输入jad加类的全名,可以反编译,这样可以方便我们查看线上代码是否是正确的版本。

2024-05-06 21:26:09 1749

原创 JVM调优详解

这个因为之前已经大概知道Young GC的频率,假设是每5分钟一次,那么执行命令jstat -gc pid 300000 10,观察Eden,Survivor和老年代使用的变化情况,每次GC后Eden区使用一般会大幅减少,Survivor和老年代都有可能增长,这些增长的对象就是每次Young GC后存活的对象,同时还可以看出每次Young GC后进入老年代大概多少对象,从而推算出。,显示你的java进程的内存情况,pid是你的java进程号,比如14039。查看对应的堆栈信息找出可能存在问题的代码。

2024-04-27 14:27:40 957

原创 G1垃圾收集器详解

GC过程中空出来的Region是否充足阈值(默认5%),在混合回收的时候,对于Region回收都是基于复制算法进行的,都是要把回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话,回收过程中就会不断空出来新的Region,一旦空闲出来的Region达到了堆内存的5%,此时就会立即停止混合回收,意味着本次混合回收就要结束了.设置新生代初始占比,在系统运行中,JVM会不停的给年轻代增加更多的Region,但是最多新生代的占比不会超过60%,可以通过。

2024-04-27 10:39:42 1333

原创 垃圾收集器ParNew&CMS与底层三色标记算法详解

当前虚拟机的垃圾收集都是采用分代收集算法,这种算法没有什么新思想,只是依据对象的存活周期不同将内存分为几块.一般将Java堆分为新生代和老年代,这样就可以根据各个年代的特点选择合适的垃圾收集算法.比如在新生代中,每次收集都会有大量对象(近99%)死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集.而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择""或""算法进行垃圾收集.

2024-04-21 14:39:26 1141

原创 JVM对象创建与内存分配机制

虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载,解析和初始化过.如果没有,那必须先执行相应的类加载过程.new指令对应到语言层面上讲是,new关键词,对象克隆,对象序列化等.在类加载检查通过后,接下来虚拟机将为新生对象分配内存.对象所需内存大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来.这个步骤有两个问题指针碰撞(Bump the Pointer)(默认使用)

2024-04-21 10:16:26 918

原创 JVM内存模型深度剖析

指定元空间出发Full GC的初始阈值(元空间无固定初始大小),以字节为单位,默认是21M左右,达到该值就会触发Full GC进行类型卸载,同时收集器会对该值进行调整:如果释放了大量的空间,就适当降低该值,如果释放了很少的空间,那么在不超过 -XX:MaxMetaspaceSize(如果有设置的话)的情况下,适当提高该值.这个跟早期jdk版本的。:-Xss设置越小,count值越小,说明一个线程栈里能分配的栈帧就越少,但是对于JVM整体来说能开启的线程数就会更多.使用字节码手册来分析字节码文件;

2024-04-09 21:54:02 1130

原创 InnoDB底层原理与MySQL日志机制深入剖析

大体来说,MySQL可以分为Server层和存储引擎层两部分。

2024-04-01 22:54:54 851

原创 MySQL索引优化二

再决定那个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与join的各个字段的总数据量,

2024-03-26 21:41:51 829

原创 MySQL索引优化

MySQL支持两种方式的排序filesort和index,Using index是指MySQL扫描索引本身完成排序.index效率高,filesort效率低.order by满足两种情况会使用Using indexorder by 语句使用索引最左前列使用where子句与order by子句条件列组合满足索引最左前列尽量在索引列上完成排序,遵循 **索引建立(索引创建的顺序)**时的最左前缀法则.如果order by的条件不在索引列就会产生Using filesort。

2024-03-21 22:53:50 911

原创 Explain详解与索引优化最佳实践

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈在select语句之前增加explain关键字,MySQL会在查询前设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL

2024-03-13 21:13:49 819

原创 GMP原理与调度

GMP是Go语言运行时(runtime)层面的实现,是go语言自己实现的一套调度系统,区别于操作系统调度OS线程。

2023-12-17 11:17:38 299 1

原创 go语言的类型别名与类型定义

/ 类型定义: 创建一个全新类型,名为Feet,底层类型为float64// 以下赋值会导致编译错误,因为类型定义创建了全新类型,需要显示转换在这个例子中,Feet是float64的全新类型,尽管底层类型相同,但它们在类型系统中被视为不同类型.因此,不能直接进行赋值,需要进行显示类型转换.Feet类型不止是在代码中存在,在编译阶段仍然存在。

2023-12-09 20:44:01 174

原创 TRUNCATE TABLE t 和DELETE FROM t的区别

TRUNCATE TABLE user是一种DDL(数据定义语言)语句,而DELETE FROM user是一种DML(数据操作语言)语句.DDL语句用于定义数据库结构,而DML语句用于对数据进行操作TRUNCATE TABLE user通常比DELETE FROM user更快,TRUNCATE 语句通过删除表中的所有数据并释放存储空间来执行操作.相比之下,DELETE 语句是逐行删除,需要遍历每一行并记录事务日志.因此它可能需要更长的时间来完成。

2023-05-30 20:03:29 734

原创 缓存穿透、雪崩、击穿

缓存穿透是指客户端请求的数据再缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库,失去了缓存保护数据库的意义.

2023-04-22 17:17:35 238 1

原创 布隆过滤器详解

本文全部代码地址布隆过滤器是一种高效的数据结构,用于判断一个元素是否存在于一个集合中.它的主要优点是速度快,空间占用少,因此在需要快速判断某个元素是否在集合中的场合得到广泛引用.布隆过滤器就是一个大型的位数组和几个不一样的无偏hash函数.所谓无偏就是能够把元素的hash值算的比较均匀.当布隆过滤器说某个值存在时,这个值可能不存在;当它说某个值不存在时,那就肯定不存在.

2023-04-21 22:47:19 854

原创 docker安装redis

准备redis的配置文件,因为需要redis的配置文件,这里最好去。将配置好的redis.conf放置到/data/redis文件夹下。去下载一个redis,使用里面的配置文件即可.修改redis.conf配置文件。

2023-04-18 19:20:51 445

原创 循环依赖详解及解决方案

上图就是循环依赖的三种情况,虽然方式不同,但是循环依赖的本质是一样的,就A的完整创建要依赖与B,B的完整创建要依赖于A,相互依赖导致没办法完整创建造成失败.缓存经过了完整生命周期的bean缓存未经过完整生命周期的bean,如果某个bean出现了循环依赖,就会提前。

2023-04-14 00:50:12 4292

原创 Spring注入方式:@Autowired和@Resource的区别和应用场景

Resource默认按名称进行匹配,@Autowired默认按照类型进行匹配,但可以通过@Qualifier注解指定名称进行匹配@Resource可以用在字段,setter方法和构造函数上,@Autowired可以用在字段,setter方法,构造函数和方法上@Resource不支持@Primary注解,@Autowired支持@Resource是JavaEE5提供的注解,而@Autowired是Spring Framework提供的注解。

2023-04-12 22:26:08 1313

原创 基于ZooKeeper实现服务注册与发现

ZooKeeper官网在分布式系统中,服务注册与发现是一项重要的技术,本文提供Java代码基于ZooKeeper来实现的服务注册与发现的功能.上面Java代码实现了服务注册和消费的基本流程,首先服务提供方通过ZooKeeper将服务节点注册到服务注册中心,然后再服务消费方通过ZooKeeper获取服务节点列表,并从中随机的选择一个服务节点进行调用,再实际应用中,还需要对服务节点进行心跳检测,负载均衡等处理,以保证服务的高可用性和稳定性.

2023-04-10 19:55:28 1374

原创 深入浅出:理解 RPC 和 Dubbo 架构

Apache Dubbo是一款高性能的Java RPC框架.其前身是阿里巴巴公司开源的一个高性能,轻量级的开源Java RPC框架,可以和Spring框架无缝集成.Dubbo 官网同步调用:客户端调用服务方方法,等待直到服务方返回结果或者超时,再继续自己的操作异步调用:客户端把消息发送给中间件,不再等待服务端返回,直接继续自己的操作RPC是一种进程间的通信方式,它允许应用程序调用网络上的另一个应用程序中的方法,对于服务消费者而言,无需了解远程调用的底层细节,是透明的.

2023-04-09 12:43:51 1287 4

原创 docker安装dubbo-admin、zookeeper

7. 在浏览器访问dubbo-admin验证是否安装成功,输入ip:8088,输入账号密码,默认root/root。6. 创建dubbo-admin容器,指定网络为zk,并设置zookeeper为上述查询出来的地址。

2023-04-08 12:22:27 755

原创 HashMap源码分析

HashMap是Java集合框架中常用的一种数据结构,它是一种基于哈希表实现的映射表.在JDK1.8版本中,HashMap的get方法和put方法的实现与之前版本有些不同,下面我们来逐步分析其源码实现.

2023-04-06 20:54:57 309

原创 Spring AOP:理解动态代理和 Advice

上面介绍了Spring中提供了ProxyFactory,Advisor,Advice,PointCut等技术来实现代理对象的创建,但是我们在使用Spring时,我们并不会直接这么去使用ProxyFactory,比如说,我们希望ProxyFactory所产生的代理对象能直接就是Bean,能直接从Spring容器中得到UserService的代理对象,而这些Spring都是支持的,只不过,作为开发者的我们肯定得告诉Spring,那些类需要被代理,代理逻辑是什么。ThrowsAdvice:方法抛出异常后执行。

2023-04-01 15:23:51 419

原创 Spring探究Bean的完整生命周期

它们是Spring框架中创建和管理bean的核心函数.本文将逐一介绍这六个函数的作用,工作流程以及源码解析,以帮助开发者深入理解Spring框架的IoC容器.注意:本文使用的Spring版本为:5.3.12/*** 该方法用于获取一个bean实例,* 如果改bean实例还步存在,会先执行创建bean的流程,包含实例化,属性注入,初始化等.* @param name 要获取的Bean名称。

2023-03-29 21:06:48 157

原创 桥梁设计模式

Java桥梁模式(也称桥接模式)(Bridge Pattern)是一种设计模式,它将抽象和实现分离,使它们可以独立地变化.它通过一个大类或者一系列紧密关联的类拆分成两个独立的层次结构来实现这种分离,其中一个层次结构包含抽象类或接口,另一个层次结构包含实现类.桥梁模式使得抽象类和实现类可以独立地变化,从而实现了松耦合.在Java中,桥梁模式通常使用接口来定义抽象部分,使用抽象类来实现部分实现,并将它们通过组合的方式组合起来.抽象部分包含一个只想实现部分的引用,实现部分实现了抽象部分定义的接口.

2023-03-23 22:21:23 429

原创 享元设计模式

Java中的享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享尽可能多的对象来减少内存占用和提高性能.Java享元模式通常包含以下4种角色享元工厂(Flyweight Factory):负责创建和管理享元对象.具体享元(Concrete Flyweight):实现享元接口并存储与共享状态相关的内部状态.抽象享元(Flyweight):定义享元对象需要实现的接口或抽象类.非共享状态(Unshared State):储存享元对象的非共享状态.

2023-03-23 19:49:06 343

原创 解释器模式

Java解释器模式(Interpreter pattern)是一种行为设计模式,它定义了一种语言的语法表示,并定义了解释器来解释该语法.该模式的核心是**解释器(Interpreter),**它定义了一个表达式接口和具体的表达式实现类.表达式接口中定义了解释方法,具体的表达式实现类则实现了该解释方法,用于对语法进行解释.抽象表达式(Abstract Expression):定义了一个解释器需要实现的接口,通常包含一个解释方法(interpreter)用于解释表达式.

2023-03-22 21:24:21 414

原创 状态设计模式

Java状态模式(State Pattern)是一种面向对象的设计模式,它将对象的状态封装成独立的状态对象,并将对象的行为与状态对象解耦,它允许对象在其内部状态发生改变时,改变其行为.该模式将对象的行为封装在不同的状态对象中,而不是将所有的行为都放在一个类中.状态接口(State Interface):定义了一组与上下文对象相关的方法,这些方法将在不同状态下被具体对象实现.具体状态(Concrete State):实现了状态接口,具体状态对象是不同的状态实现.

2023-03-22 20:02:22 332

原创 访问者模式

Java访问者模式(Visitor Pattern)是一种行为型设计模式,它允许将算法与其所操作的对象分离.该模式定义了一个访问者对象,它可以访问不同类型的对象并执行一些操作,同时也能让你在不修改现有代码的情况下,添加新的操作.再访问者模式中,有两个重要的角色:**访问者和元素.**元素是一个对象结构的组成部分.访问者是一个表示要执行的操作的对象.访问者可以通过元素的接受方法来访问元素.抽象访问者(Visitor):定义了可以访问每个元素的访问方法.

2023-03-21 21:14:45 214

原创 备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获并保存一个对象的内部状态,并在之后可以恢复该对象到先前的状态.该模式的核心是备忘录(Memento)类,它储存了一个对象的内部状态.

2023-03-20 20:10:50 272

原创 门面设计模式

Java门面模式(Facade Pattern)是一种结构型设计模式,它提供了一个简单的接口,隐藏了复杂系统的实现细节,使得客户端可以更加容易地使用系统.

2023-03-19 19:07:48 458

原创 观察者模式

Java观察者模式(也称发布-订阅模式)是一种行为设计模式,用于对象之间的松散耦合,即当一个对象的状态发生变化时,其他依赖该对象的对象会被自动通知并作出相应的响应.Subject(主题):被观察的对象,维护一个观察者列表,提供添加,删除观察者的方法,以及通知所有观察者的方法.Observer(观察者):观察Subject的变化,当Subject变化时接收通知,进行相应的操作.ConcreteSubject(具体主题):实现Subject接口,维护自己状态的变化,当状态变化时通知所有的观察者.

2023-03-17 20:36:50 499

原创 组合设计模式

Java组合模式(Composite Pattern)是一种结构型设计模式,允许你将对象组合成树状结构,并且能像使用独立对象一样使用它们.抽象构建(Component):是组合中对象声明接口,可以包含其他对象,可以定义公共行为和管理子对象的方法.叶子节点(Leaf):是组合中的简单对象,没有包含其他对象的能力.组合节点(Composite):有叶子节点和组合节点作为子节点的对象,通常会把子节点存储到一个结合中,实现抽象构建接口中的方法.

2023-03-16 22:36:35 269

原创 适配器模式

Java中的适配器模式是一种结构型设计模式,她将一个类的接口转换成另一个客户端所期望的接口.适配器模式让那些不兼容的类可以一起工作,它通过不兼容接口转换成可兼容接口来实现这一点.目标接口(Target):定义客户端所期望的接口,也就是客户端需要使用的接口.源接口(Adaptee):已经存在的,不兼容的接口,也就是需要适配的接口.适配器(Adapter):将源接口转换成目标接口的类,它实现了目标接口,并持有一个源接口的引用,将客户端请求转发给源接口.

2023-03-16 19:51:55 462

原创 策略设计模式

Java策略模式(Strategy Pattern)是一种行为设计模式,它允许再运行时动态选择算法的行为.策略模式通过将算法封装在可互换的策略对象中,使得客户端代码能够轻松地切换算法,而无需修改原始代码.在策略模式中,每个算法都被实现为一个单独的策略类,这些策略类都实现了相同的接口,从而允许它们在运行时互相替换.在Java中,可以使用接口或抽象类来定义策略接口.然后对于每个算法,都可以创建一个具体的实现类来实现这个接口.客户端代码可以通过将不同的策略对象传递给上下文对象来选择不同的算法.

2023-03-15 19:28:02 313

原创 装饰设计模式

Java装饰模式是一种结构型设计模式,允许再运行时向对象添加行为.该模式通过将对象放入包装器类中来实现,以便在不改变现有对象的结构的情况下,可以动态地添加或删除对象的行为.Component(组件):定义一个对象接口,可以给这些对象动态地添加职责.ConcreteComponent(具体组件):定义了一个具体的对象,也可以为这个对象添加一些职责.Decorator(装饰器):持有一个构件对象的实例,并定义一个与组件接口一致的接口.

2023-03-14 21:55:26 209

原创 责任链模式

责任链模式是一种行为型设计模式,其目的是将请求从一个对象传递到另一个对象,直到找到能够处理该请求的对象为止.再责任链模式中,每个对象都持有对下一个对象的引用,形成一个链条.当一个请求进入这个链条时,每个对象一次判断是否有能力处理该请求,如果有,就处理该请求,如果没有就将请求传递给下一个对象.这样,直到找到能够处理该请求的对象为止,或者请求无法被任何对象处理时,责任链模式才结束.优点。

2023-03-14 20:27:53 287

原创 命令设计模式

Java命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使不同的请求可以进行参数化,并支持请求的排队,记录日志,撤销操作等.在命令模式中,将命令请求者(Invoker),命令接收者(Receiver)和命令对象(Command)进行了解耦,使得它们可以独立地变化.具体的说,命令对象封装了一个特定的请求和其对应的操作,Invoker对象负责调用命令来执行请求,而Receiver对象则负责实际执行命令所代表的操作.

2023-03-13 21:29:19 168

空空如也

空空如也

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

TA关注的人

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