自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

厚积薄发

享受技术

  • 博客(292)
  • 资源 (9)
  • 问答 (1)
  • 收藏
  • 关注

原创 Young GC过于频繁

YoungGC频繁一般是内存问题,在优化代码降低频率的同时,也需关注某个时间段的累计耗时。总的来说,在CPU Quota允许的范围内,GC总耗时越少越好,GC频率反倒不是那么重要。展开: JVM / 内存 / GC / ClassLoader这一行,找到监控面板:GC耗时 和 GC原因与频次。Young GC过于频繁,说明JVM内存分配压力大,可能是Young区比较小或者代码加载到内存的数据过多。Young GC频繁,通常不用立即处理,大多需要优化代码。可参考原因部分,优化代码,调整GC参数。

2023-03-28 19:28:52 4232 3

原创 redis连接异常

指因为各种原因,程序对Redis的连接数激增,超过Redis服务器能够承受的上线,从而程序无法正常访问Redis进而引发功能异常的问题。Redis连接数问题并不常见,但是发生之后造成的Redis暂时不可用会影响正常功能,至少系统性能急剧下降,影响较大。自2020年来,贝壳线上服务出现过4次Redis连接数问题在本章节,希望能够带大家了解Redis连接数问题的现象和解法。

2023-03-28 19:20:37 1096

原创 线程池饱和异常

线程池(ThreadPoolExecutor)使用率达到100%,新提交的任务被拒绝,这种情况我们称之为线程池饱和。线程池使用率 = 活跃线程数(getActiveCount) / 最大线程数(getMaximumPoolSize),线程池饱和意味着:队列使用率100%,任务已堆积,内存占用上升所有线程已被占用,新提交的任务可能被拒绝处理,导致业务中断通过本章节,你将了解到如何监控、查看、定位线程池饱和导致的生产问题。

2023-03-28 09:39:25 1040

原创 物理机CPU使用率报警

SRE托管的应用开启了CGroup CPU限制,但是部分早期部署的应用,CPU无限制或限额过高,比如,40CPU的物理机,有的应用可允许使用16CPU,如果此应用的代码有性能缺陷,会消耗过多CPU,达不到资源隔离的目的。若无法避免高峰时段执行,可尝试任务分片、隔离部署,比如,薪酬月初算薪,进程CPU使用率达到40%,k8s容器部署的话,月初可临时调度薪酬进程到独享的物理机,和其他应用隔离,算薪完成了再调度回去,释放资源。总之, CPU消耗少的,可以密集部署,提升单机部署应用的个数,合理利用内存;

2023-03-27 19:57:18 1109

原创 cpu报警

无论是物理机或容器化部署的应用,通常使用CGroup进行资源隔离,开发可在应用大盘看到进程的CPU额度。其中,CPU Quota是进程最大可用的CPU额度,若进程CPU使用率超过额度,会被操作系统限制CPU使用,慢请求会上升。生产环境可能不同节点的内存/CPU额度不一样,可选择节点查看单台的准确额度。进程 CPU Qutoa 使用率的取值范围是 [0 , 1],最大100%,衡量的是单位时间内,进程可用的CPU额度已使用了多少,考察的是CPU够不够用,是否应该扩容了。

2023-03-23 21:08:28 1363

原创 老年代内存不足报警

部分DNS解析在高并发下有性能瓶颈,确保系统的DNS是可靠的,比如,k8s dns解析策略,确保是高性能的,避免无效的查询。另外,部分域名可能会启用 DNS 负载均衡,即每次解析返回的多个IP地址的顺序不同,过大的ttl会影响负载均衡效果。除了应用层的缓存外,也可尝试 JVM自身的DNS缓存 (这个是全局的),通过命令行来控制缓存过期时间, see。DNS解析失败未必会产生负面影响,比如,可能当时只有DNS健康检查,没有业务请求在执行。DNS解析通常是偶发的,开发能做的有限,可向运维反馈,持续观察。

2023-03-23 20:31:08 527

原创 DNS解析异常

部分DNS解析在高并发下有性能瓶颈,确保系统的DNS是可靠的,比如,k8s dns解析策略,确保是高性能的,避免无效的查询。另外,部分域名可能会启用 DNS 负载均衡,即每次解析返回的多个IP地址的顺序不同,过大的ttl会影响负载均衡效果。除了应用层的缓存外,也可尝试 JVM自身的DNS缓存 (这个是全局的),通过命令行来控制缓存过期时间, see。DNS解析失败未必会产生负面影响,比如,可能当时只有DNS健康检查,没有业务请求在执行。DNS解析通常是偶发的,开发能做的有限,可向运维反馈,持续观察。

2023-03-22 20:18:31 459

原创 线上问题FullGC

对CMS来说,FullGC是比较正常的,每次STW也比较短,但频繁的话会导致吞吐量下降,因此重点考察CMS FullGC的频率,目前1分钟超过12次就报警。内存分配速率越大,GC越频繁,两次 Young GC 的间隔时间尽量大于接口P99.9的时间,这样尽量让对象在 Young 区就被回收,可以减少很多停顿。若在总的Heap内存不变的情况下调大Young区,可适当调小Old区,但考虑到浮动垃圾,建议Old区大小为一轮回收后Old区活跃对象的3倍左右。尽可能保证接口内存开销的稳定性,避免浪费资源。

2023-03-21 19:35:16 184

原创 分布式系统-配置中心

分布式配置中心

2023-03-21 13:28:04 1429

原创 分布式-调度

分布式调度

2023-03-20 19:42:48 445

原创 分布式系统-发号器

当需要生成新的ID时,先获取当前时间戳,然后判断当前时间戳是否小于上次生成ID时的时间戳。如果小于,则表示发生了时钟回拨,此时需要计算时间戳差值并加上序列号,得到一个新的时间戳,然后将序列号重置为0。如果不小于,则直接将序列号加1,并更新上次生成ID时的时间戳。具体而言,如果在同一毫秒内发生了时钟回拨,则需要将序列号减去回拨的毫秒数,这样才能确保在同一毫秒内生成的ID不重复。其中,时间戳部分占用42位(即时间戳-开始时间戳左移22位),数据中心ID部分占用5位,机器ID部分占用5位,序列号部分占用12位。

2023-03-16 12:49:12 690 2

原创 常见的限流

限流的另一个重要作用是保障服务质量,尤其是对于一些对实时性要求较高的服务,如在线游戏、金融交易等,限流可以确保每个请求都能够得到及时的响应,避免因为某些请求的卡顿、延迟等影响其他请求的处理效率。漏桶算法是通过设置一个固定容量的漏桶,请求先进入漏桶中,然后以固定速率出漏桶,当漏桶满了时,新加入的请求会被丢弃。令牌桶算法是将请求放入令牌桶中,每个请求需要取走一个令牌才能被处理,当令牌桶中无可用令牌时,返回错误信息。通过限制单位时间内的请求量,可以有效地控制系统的负载,提高系统的稳定性和可靠性。

2023-03-15 13:43:32 326 1

原创 索引失效的案例

隐式转换表user 里的id是BigInt类型,order表里关联到user表的id误建成userId varchar类型了,在ibatis上查询时,直接传入id Long类型,SQL查询非常慢,即使建立了userId索引,于是改成String 类型的userId去查询,SQL立马变的很快了。订单表里的orderPayId是BigInt类型, 收银台流水表中的orderPayId 错误的建成了 varchar类型,当查询收银台流水表的时候,传入的确是Long类型, Sql非常的慢, ...

2023-03-15 09:34:08 4008

原创 Thread源码

目录初始化线程启动joininterrupt初始化//初始化的时候,线程名称 "Thread-全局递增数字"init(null, target, "Thread-" + nextThreadNum(), 0);private static int threadInitNumber;private static synchronized int nextThreadNum() { return threadInitNumber++;}小结:创建你的线程,

2023-03-15 09:33:42 2874 1

原创 java内存模型

cpu多级缓存java内存模型 read(从主存读取) load(将主存读取到的值写入工作内存) use(从工作内存读取数据来计算) assign(将计算好的值重新赋值到工作内存中) store(将工作内存数据写入主存) write(将store过去的变量值赋值给主存中的变量) 总结 Java内存模型是跟cpu缓存模型是类似的,基于cpu缓存模型来建立的java内存模型,只不过java内存模型是标准化的,屏蔽掉底层不同的计算...

2023-03-15 09:33:28 2064 1

原创 UML详解

基本图形开发过程与UML关系用例图用例图,从用户角度描述系统行为功能(行为),并指出各功能的操作者参与者(actor) 一个人 一个系统 又称“主角”用例(use case) 参与者使用用例系统(system) 硬件和软件的结合体 业务问题的解决方案基本图形关系泛化:继承关系,子用例将继承基用例的所有行为,关系和通信关系,也就是说在任何使用基用例的地方都可以用子用例来代替includ...

2023-03-15 09:33:12 2076 1

原创 LinkedHashMap源码

目录原理扩展点小结原理LinkedHashMap继承自HashMap, 所以大部分代码其实都是HashMap的,仅仅在一些扩展点上做了扩展 所谓的有序,指的是可以按照元素添加的顺序进行遍历扩展点put方法 ,重写了 newNode() 方法, 原先替换了原先HashMap中的node节点, LinkedHashMap中的node继承自HashMap中的node,增加before,after节点, 用来组成有顺序的链表 remove方法 重写了 afterNodeRemov...

2023-03-15 09:33:11 1692 1

原创 HashMap源码

基本原理底层是数组+链表(单项链表)+红黑树(链表长度超过8) 数组的初始大小是16 当元素数量超过容量*负载因子(默认0.75)进行扩容 每次扩容都是扩充到原先的两倍+rehash优化后的hash算法jdk8以后寻址算法并不是先拿到hashcode然后再跟容量进行取模操作, 而是经过优化的 获取hashcode, 然后右移16位, 然后与旧的hashcode进行异或操作, 然后让获得的值跟容量进行与操作 获得元素应该在的位置 小结:之所以要进行高低16位的异或运算, 是因为 ,...

2023-03-15 09:33:05 2261 1

原创 Iterator迭代器应对多线程并发修改的fail fast机制

目录是什么原理小结是什么就是在迭代器取数据的同时, 有线程并发更改元素(增删改)原理//迭代器初始化的时候 会拿到集合中的modcount(这个数据,在发生变更的时候会增加次数)int expectedModCount = modCount; //在迭代器的next()方法每次执行之前会调用方法checkForComodification();//每次判断数量,一旦发生变化, 则抛出ConcurrentModificationException异常final void

2023-03-15 09:32:59 1870 1

原创 如何提高技术深度

目录打好基础内功深挖底层原理、掌握本质实践打好基础内功如果你学的是Java,你会发现研究到底层后,JVM是c写的,IO多路复用机制、零拷贝的MMAP都会涉及到操作系统原理,还有一些中间件是c编写的,比如nginx、redis.你不懂操作系统,不懂底层语言,技术对你来说,始终就是黑盒子。除此之外还有数据结构、算法,当规模变大的时候,这些都是很重要的。深挖底层原理、掌握本质每个技术一般都会有一些通用底层机制比如Reactor模式零拷贝机制O多路复用机制日志预写机制文

2023-03-15 09:32:45 2355 1

原创 varchar(4000)建立索引的思考

这是一道面试题阿里编程规范里,强制在varchar字段上建立索引必须限定长度,当然这样做好处既保证区分度,又能节省索引存储空间回到题上, 4000的长度做索引, 首先从技术的角度考虑,全字段做索引肯定不合适,所以要缩短长度, 缩短长度方式无非是截取字符串,要么对字符串做编码,比如取hash值做冗余字段再往深处想一想用编码合适么? 4000长度的字段,怎么会全文拿来做查询字段呢,所以即使做了索引,基本上也用不到,索引使用编码的方式基本也达不到效果,所以这个方案并不好再想一想,4000长度,一..

2023-03-15 09:32:39 1673

原创 Synchronized

使用方式 实例对象加锁 代码段内private void instanceTest2(){ synchronized (this){ flag++; }}修饰方法private synchronized void instanceTest1(){ flag++;} 类对象加锁 代码段内private static void staticTest2(){ synchronized (Synchron...

2023-03-15 09:32:08 3032 1

原创 volatile

目录可保证可见性可保证有序性不可保证原子性可保证可见性能够保证可见性的原理是,MESI一致性协议和 cpu嗅探机制 执行指令是:lock 前缀指令MESI协议Modified(修改):数据被修改了,和内存中数据不一致,数据只存在于本Cache中。 Exclusive(独享):数据和内存中的数据一致,数据只存在于本Cache中。 Shared(共享):数据和内存中的数据一致,数据存在多个Cache中。 Invalid(无效):一旦数据被标记为无效,那效果就等同于它从来没被加载

2023-03-15 09:32:01 2762 2

原创 并发编程三大特性

目录可见性原子性有序性可见性一个线程对共享变量值的修改,能够及时地被其他线程看到。原子性程序的原子性是指整个程序中的所有操作,要么全部完成,要么全部失败,不可能滞留在中间某个环节;在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程所打断。有序性即程序执行的顺序按照代码的先后顺序执行。...

2023-03-15 09:31:56 2377

原创 行为型-状态模式

public class StatePatternDemo { public static void main(String[] args) { Context context = new Context(new NewState()); context.execute(1); context.execute(2); context.execute(3); } public interface State { void execute(); } .

2023-03-15 09:31:51 793

原创 行为型-中介者模式

目录不使用设计模式使用设计模式小结不使用设计模式public class WithoutMediatorPatternDemo { public static void main(String[] args) { ModuleA moduleA = new ModuleA(); ModuleB moduleB = new ModuleB(); ModuleC moduleC = new ModuleC(); moduleA.execute(); mo

2023-03-15 09:31:42 807

原创 行为型-观察者模式

观察者模式一般是和组合模式一起使用, 观察者模式为组合模式的复杂结构提供执行体public class VisitorPatternDemo { public static void main(String[] args) { Department leafDept1 = new Department("叶子部门1"); Department leafDept2 = new Department("叶子部门2"); Department leafDept3 = new Dep...

2023-03-15 09:31:39 804

原创 行为型-命令模式

就是将核心执行逻辑封装成命令,用哪个的时候初始化哪个public class CommandPatternDemo { public static void main(String[] args) { Command commandA = new CommandA(); Command commandB = new CommandB(); Invoker invoker = new Invoker(); invoker.setCommand(commandA);...

2023-03-15 09:31:30 1509

原创 行为型-责任链模式

不使用责任链模式public class WithoutChainPatternDemo { public static void main(String[] args) { // 业务流程1 System.out.println("执行功能1"); System.out.println("执行功能2"); System.out.println("执行功能3"); // 业务流程2 System.out.println("执行功能3"); Syst...

2023-03-15 09:31:27 992

原创 高并发解决方案

目录解决方案 扩容 数据隔离 限流 降级 缓存解决方案 扩容 数据隔离 限流 降级 缓存

2023-03-15 09:31:23 3252

原创 行为型-备忘录模式

就是中间过程产生的数据保存public class MementoPatternDemo { public static void main(String[] args) { Originator originator = new Originator(); // 准备好了中间数据 originator.prepare(); // 将中间数据保存到备忘录中去 Memento memento = origi...

2023-03-15 09:29:39 1370

原创 行为型-迭代器模式

目录不使用设计模式使用设计模式不使用设计模式public class WithoutIteratorPatternDemo { public static void main(String[] args) { Student student1 = new Student("小明"); Student student2 = new Student("小王"); /*Student[] students = new Student[2]; students[0] =

2023-03-15 09:25:36 701

原创 行为型-模版方法模式

目录不使用模版方法模式可能是这样的使用模版方法模式是这样的总结不使用模版方法模式可能是这样的public class WithoutTempalteMethodPatternDemo { public static void main(String[] args) { DiscountCalculator1 calculator1 = new DiscountCalculator1(); calculator1.calculate(); DiscountCalcu

2023-03-15 09:25:24 1159 1

原创 结构型-外观模式

目录不使用外观模式可能是这样的使用外观模式是这样的小结不使用外观模式可能是这样的public class WithoutFacadePatternDemo { public static void main(String[] args) { // 假设我们这里是子系统2,要基于子系统1的3个模块的功能实现一个业务逻辑 ModuleA moduleA = new ModuleA(); ModuleB moduleB = new ModuleB(); Module..

2023-03-15 09:24:43 5824

原创 结构型-装饰器模式

装饰器模式强调的是, 持有别人对象, 实现相同的功能, 并且进行增强, 并且能进行多次嵌套装饰public class DecoratorPatternDemo { public static void main(String[] args) { Component component = new ConcreteComponent(); Component decorator = new Decorator(component); decorator.execute(); }

2023-03-15 09:24:27 1429

原创 结构型-适配器模式

目录不使用设计模式使用适配器模式小结不使用设计模式可能是这样的public class WithoutAdapterPatternDemo { public static void main(String[] args) { OldInterface oldObject = new OldInterfaceImpl(); NewInterface newObject = new NewInterfaceImpl(); oldObject.oldExecute();

2023-03-15 09:24:21 975

原创 创建型-原型模式

不使用原型可能是这样的public class WithoutPrototypePatternDemo { public static void main(String[] args) { // 手头有这么一个对象,需要进行拷贝 Product product = new Product("测试产品", new Component("测试组件")); // 手动来拷贝 Product copyProduct = new Product(product.getNam...

2023-03-15 09:24:15 1177 3

原创 行为型-观察者模式

观察者注册到被观察者上,当观察者发生变动, 去通知观察者(监听者)public class ObserverPatternDemo { public static void main(String[] args) { Subject subject = new Subject(0); Observer observer = new ConcreteObserver(); subject.addObserver(observer); subject.setS...

2023-03-15 09:23:36 2620 1

原创 设计模式原则

目录单一职责原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则开放封闭原则单一职责原则一个方法 一个类只负责一个职责 降低类和类的耦合,提高可读性,增加可维护性和可拓展性,降低可变性的风险。里氏替换原则使用父类的地方都可以使用其子类替代依赖倒置原则依赖于接口, 不要依赖实现接口隔离原则类和类之间依赖应该建立在最小接口的上。迪米特法则尽可能少的对其他类进行依赖开放封闭原则应该对扩展开放,对修改关闭...

2023-03-15 09:23:30 1112

原创 行为型-策略模式

不使用策略模式可能是这样public class WithoutStrategyPatternDemo { public static void main(String[] args) { int discountStyle = 1; if(discountStyle == 1) { System.out.println("执行优惠计价方式1的复杂业务逻辑"); } else if(discountStyle == 2) { System.out.println...

2023-03-15 09:23:14 5853

reids-单机版安装文件.zip

redis单机版安装

2021-08-08

apachephp.zip

php 64位安装

2021-05-25

boot-archetype.zip

项目骨架

2021-05-16

protobuf.zip

protobuf.zip 编译proto文件的软件

2021-05-11

jdk8-linux.zip

jdk8-linux.zip

2021-05-11

hadoop-2.9.1-tar.zip

hadoop-2.9.1-tar.zip

2021-05-11

centos-7-mini-iso.zip

centos-7 最小化安装包

2021-05-11

MemoryAnalyzer.zip

内存分析软件

2021-05-09

nexus-3.18.1-01-win64.zip

nexus-3.18.1-01-win64.zip

2021-05-09

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

TA关注的人

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