自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 记一次logback导致服务无响应排查过程

1. 前沿记录最近收到测试环境服务无响应处理过程。2. 定位2.1 排查服务资源使用情况通过top命令和阿里云监控发现服务cpu和资源都正常,第一反应是死锁。2.2 导出线程信息通过jstack -l命令导出线程信息发现服务所有响应到卡住logback的log上,因为以前也遇到logback死锁导致类似异常,发现服务的logback版本是1.1.11版本(该版本有死锁bug)后,愉快的升级到1.2.3版。然而很快的服务还是出现无响应。再仔细观察了logback配置后发现有配置console,又愉

2021-03-27 22:50:49 3014 1

原创 设计模式之美学习笔记

2020-12-25 10:05:46 180

原创 记一次线上CPU报警排查过程

记一次线上CPU 100%问题1. 前言记录最近收到线上服务cpu100%报警处理过程。2. 定位2.1 先恢复服务保留线程保留1台机器,其他机器重启恢复服务2.2 定位cpu使用率高的线程通过top -Hp pid定位线程2.3 定位代码通过jstack导出线程快照,将高线程id转化为16进制查找(22699转58ab),发现是gc导致cpu爆满,估计可能是内存泄露问题2...

2020-03-31 23:23:12 926

原创 多线程调优

上下文切换是什么分时系统中,一个线程被暂停剥夺使用权,另外一个线程被选中开始或者继续运行的过程就是上下文切换。一个线程的状态由 RUNNING 转为 BLOCKED ,再由 BLOCKED 转为 RUNNABLE ,然后再被调度器.选中执行,这就是一个上下文切换的过程。线程生命周期线程主要有“新建”(NEW)、“就绪”(RUNNABLE)、“运行”(RUNNING)、“阻塞”(BLOC...

2019-09-25 16:35:41 282

原创 网络通信之I/O模型

一.什么是I/OI/O 是机器获取和交换信息的主要渠道,而流是完成 I/O 操作的主要方式。其中等待数据准备花费时间好远大于将数据从内核读到用户空间。同步异步:数据从内核读到用户空间是否阻塞。目前linux暂不支持异步。阻塞非阻塞:等待数据准备是否阻塞。I/O 模型有五种阻塞式 I/O非阻塞式 I/O(需要设置一个线程对该操作进行轮询检查)I/O复用信号驱动式 I/O异步 I...

2019-09-24 16:11:56 495 1

原创 理解OAuth2

一.什么是OAuth2用于REST/APIs的代理授权框架(delegated authorization framework)基于令牌Token的授权,在无需暴露用户密码的情况下,使应用能获取对用户数据的有限访问权限解耦认证和授权事实上的标准安全框架,支持多种用例场景服务器端WebApp浏览器单页SPA无线/原生App服务器对服务器之间二.场景开放系统间授权社...

2019-02-28 20:02:31 2275

原创 Innodb中的MVVC

MVVCMySQL的大多数事务型存储引擎实现的其实都不是简单的行级锁。基于提升并发性能的考虑, 它们一般都同时实现了多版本并发控制(MVCC)。不仅是MySQL, 包括Oracle,PostgreSQL等其他数据库系统也都实现了MVCC, 但各自的实现机制不尽相同, 因为MVCC没有一个统一的实现标准。可以认为MVCC是行级锁的一个变种, 但是它在很多情况下避免了加锁操作, 因此开销更低。虽...

2019-01-26 16:28:00 1400 1

原创 java中static、final、static final的区别

finalfinal可以修饰:属性,方法,类,局部变量(方法中的变量)final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变。final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值。final修饰的属性表明是一个常数(创建后不能被修改)。final修饰的方法表示该方法在子类中不能被重写,final修饰的类表示该类不能被继承。f...

2019-01-05 12:19:27 192

原创 Java常量池理解与总结

#1.什么是常量池##1.1静态常量池  所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间,主要用于存放两大类常量:字面量(Literal)和符号引用量(Symbolic References),字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等,符号引用则...

2019-01-05 12:00:07 137

原创 Spring Security 源码浅析

1.核心组件1.1.SecurityContextHolder  SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保存在SecurityContextHolder中。SecurityContextHolder默认使用ThreadLocal 策略来存储认证信息。看到T...

2018-05-30 22:39:06 543

转载 Flume - FileChannel源码详解

FileChannel在Flume是一个非常重要的Channel,FileChannel可以很好的保证数据的完整性和一致性,提供了类似mysql binlog的机制,保证机器down机,JVM异常退出时数据不丢失,在采集数据量很大的情况下,建议FileChannel设置的目录和程序日志文件保存的目录设成不同的磁盘,以便提高效率。FileChannel的简易类结构:FileCha

2017-07-25 16:13:38 1046

转载 Flume-NG源码阅读之SpoolDirectorySource

org.apache.flume.source.SpoolDirectorySource是flume的一个常用的source,这个源支持从磁盘中某文件夹获取文件数据。不同于其他异步源,这个源能够避免重启或者发送失败后数据丢失。flume可以监控文件夹,当出现新文件时会读取该文件并获取数据。当一个给定的文件被全部读入到通道中时,该文件会被重命名以标志已经完成。同时,该源需要一个清理进程来定期移除完成

2017-07-25 16:13:03 320

原创 flume-ng源码浅析

1.架构 Source: 负责产生数据,将数据“传入”到channel,一旦写入channel成功,source就认为数据已经可靠的传输。 Sink:    sink不停的从属于自己的channel(此处有点类似于消息队列的消费者了)中获取数据,并且将数据写入到相应的后端中,如果数据写入失败则需要将相应的状况通知channel,让channel知道数据传输失败,下次获取时可

2017-07-25 16:10:22 387

原创 tomcat源码浅析(五)之请求的完整过程(http1.1)

http1.1的Connector的protocolHandler为org.apache.coyote.http11.Http11Protocol。Http11Protocol的endpoint为JIoEndpoint。JIoEndpoint的handler为Http11Protocol.Http11ConnectionHandler。    以url为http://127.0.0.1:808

2017-04-01 17:58:00 1490

原创 tomcat源码浅析(四)之web.xml解析

1.Context在start时先调用bindThread()将Loard的classLoader绑定到线程中,这样Digester在去classLoader时就可以取到Loard的classLoader。Standardcontext.startinternal代码 protected synchronized void startInternal() throws Li

2017-04-01 17:57:09 1749

原创 tomcat源码浅析(二)之server.xml的解析

server.xml的解析是使用Digester来解析的,Digester的详细规则如下:Catalina.createstartdigester代码 protected Digester createStartDigester() {          long t1=System.currentTimeMillis();          // Initialize t

2017-04-01 15:33:45 426

原创 tomcat源码浅析(三)之webapps的解析

1HostConfig在start中会调用deployApps方法扫描appBase目录下的apps,加载DocBase/META-INF/context.xml.Hostconfig.deployapps代码 protected void deployApps() {            File appBase = appBase();          File c

2017-04-01 15:33:31 550

原创 tomcat源码浅析(一)之 架构

tomcat代码看似很庞大,但从结构上看却很清晰和简单,它主要由一堆组件组成,如Server、Service、Connector等,并基于JMX管理这些组件,另外实现以上接口的组件也实现了代表生存期的接口Lifecycle,使其组件履行固定的生存期,在其整个生存期的过程中通过事件侦听LifecycleEvent实现扩展。

2017-03-31 15:21:47 288

转载 java 中ClassLoader 的加载顺序

原文引自:http://www.blogjava.net/lhulcn618/archive/2006/05/25/48230.html当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构:       bootstrap classloader                |       extension classloader

2017-01-18 15:07:36 468

原创 powermock源码浅析

一.基本构成二.初始化过程 通过初始化MockClassLoader并通过该ClassLoader加载配置的@PrepareForTest类,通过javassit修改对应类的字节码,在方法调前加上类似的 Object localObject = MockGateway.methodCall(this, "testFinal", new Object[0], Desc.getParams

2017-01-17 21:55:41 1991

原创 zookeeper源码浅析(二)之Leader选择

1.入口函数QuorumPeerMain主线程启动Quorumpeermain.runfromconfig()代码 public void runFromConfig(QuorumPeerConfig config) throws IOException {          ......                LOG.info("Starting quorum p

2016-12-23 17:51:41 1793

原创 zookeeper源码浅析(一)

1.基本架构 2.ZAB协议   ZooKeeper并没有完全采用Paxos算法,而是使用了一种称为ZooKeeper Atomic Broadcast(ZAB,zookeeper原子消息广播协议)的协议作为其数据一致性的核心算法。    2.1选择Leader需用半数通过才选举成成功,同时集群中已经有过半的机器与该Leader服务器完成状态同步(数据同步)才能开始服务。

2016-12-23 17:49:47 3305

转载 Log4J日志配置详解

一、Log4j简介Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局)。这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。1、LoggersLoggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、

2016-11-29 14:18:27 220

原创 Log4j源码浅析

一.基本构成  Log4J最核心的也就5个类:Logger用于对日志记录行为的抽象,提供记录不同级别日志的接口;Level对日志级别的抽象;Appender是对记录日志形式的抽象;Layout是对日志行格式的抽象;而LoggingEvent是对一次日志记录过程中所能取到信息的抽象。另外LoggerRepository是Logger实例的容器。实现Log4J主要功能相关的类图: 二.流程

2016-11-29 14:17:35 372

转载 java.lang.Thread.setDefaultUncaughtExceptionHandler()方法实例

java.lang.Thread.setDefaultUncaughtExceptionHandler() 方法设置处理程序时调用线程突然终止默认由于未捕获到异常,并没有其他的处理程序被定义为该线程。声明以下是java.lang.Thread.setDefaultUncaughtExceptionHandler()方法的声明public static void setDefaultUn

2016-11-23 17:05:06 2523

转载 java.util.ServiceLoader使用

今天在看Hadoop源代的时候发现,在FileSystem中用到了Java.util.ServiceLoader这个类来从配置文件中加载子类或者接口的实现类。以前从来没有使用过这个类,进去大概看了一下具体的实现。主要是从META-INF/services这个目录下的配置文件加载给定接口或者基类的实现,ServiceLoader会根据给定的类的full name来在META-INF/servic

2016-11-23 17:04:22 241

转载 JVM 调优参数详解(转)

GC有两种类型:Scavenge GC 和Full GC1、Scavenge GC   一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,堆的Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor的两个区中。2、Full GC   对整个堆进行整理,包括Young、Tenured和Perm。Full GC 比Scave

2016-10-17 13:54:50 454

转载 jstat查看jvm的GC情况(转)

jstat

2016-10-17 13:54:10 369

原创 <深入理解Java虚拟机:JVM高级特性与最佳实践>读后笔记

1.2 注意事项2.垃圾收集器和内存分配策略2.1判断对象已死算法 2.2引用类型 2.3垃圾收集算法 2.3垃圾收集器话又说回来,默认的垃圾收集器又是什么呢?这个问题既简单又复杂。如果你

2016-10-17 13:53:06 222

原创 SimpleDateFormat线程安全问题原因与解决方案

1.原因SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日期相关String, Date等等, 都是交友Calendar引用来储存的.这样就会导致一个问题,如果你的sdf是个static的, 那么多个thread 之

2016-10-17 13:52:08 405

原创 quartz源码浅析

1.简介Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和 J2EE应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。2.原理 参考http://ssuupv.blog.163.com/blog/static/146156722013829111028966/3.以内存运行信息方式分

2016-10-17 13:50:09 1517

原创 mybaties源码浅析

1.Mybatis介绍    MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己: The MyBatis data mapper framework makes it easier to use a relational database with object-oriented applications. MyBatis couples objects with store

2016-10-17 13:48:23 303

原创 spring源码浅析之ioc

一、什么是IOC    维基百科上说到:2004年Martin Fowler 提出了“控制反转的”概念,他得出的结论是:依赖对象的获得被反转了。后来为这个创造了一个更好的名字:依赖注入(IOC = Inversion of Control).简单的解释是:系统的运作是通过两个或多个类的合作来实现业务逻辑,这使得每个对象都需要与其合作的对象的引用(依赖关系),这个依赖 对象以前是通过自身实现去获

2016-10-17 13:47:03 984

原创 <高性能mysql>读后笔记

1 mysql架构1.1 逻辑架构 1.2 mvcc1.3 存储引擎1.3.1 innodb 1.3.2 myisam 1.3.3选择合适的引擎2.1 schema与数据类型的优化 3.索引3.1 索引类型3.1.1 B-Tree索引 3.1.2 哈希索引 3.1.3 全文索引  3.2 索引优

2016-10-17 13:45:22 268

转载 400% 的飞跃-web 页面加载速度优化实战(转)

来源:https://www.rapospectre.com/blog/web-page-loading-optimize-guide前言 一个网站的加载速度有多重要? 反正我相信之前来博主网站的人至少有 50% 在加载完成前关闭了本站。 为啥捏? 看图  首页完整加载时间 8.18s,看来能进来看博主网站的人都是真爱呀,哈哈。 正常来讲一个网页 4s 加载不完就会流失

2016-10-17 13:11:06 322

原创 Javascript线程分析

通常一个浏览器会至少存在四个线程:JS引擎线程(用于处理JS)、GUI渲染线程(用于页面渲染)、浏览器时间触发线程(用于控制交互),Http请求线程。     而因为JS可以操作DOM元素,进而会影响到GUI的渲染结果,因此JS引擎线程与GUI渲染线程是互斥的。也就是说当JS引擎线程处于运行状态时,GUI渲染线程将处于冻结状态。     JS引擎是基于事件驱动,采用的是单线程运行机制。即J

2016-10-17 11:16:11 238

原创 400% 的飞跃-web 页面加载速度优化实战(转)

来源:https://www.rapospectre.com/blog/web-page-loading-optimize-guide前言 一个网站的加载速度有多重要? 反正我相信之前来博主网站的人至少有 50% 在加载完成前关闭了本站。 为啥捏? 看图  首页完整加载时间 8.18s,看来能进来看博主网站的人都是真爱呀,哈哈。 正常来讲一个网页 4s 加载不完就会流失很大...

2016-10-11 13:14:13 157

原创 JVM 调优参数详解(转)

GC有两种类型:Scavenge GC 和Full GC1、Scavenge GC   一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,堆的Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor的两个区中。2、Full GC   对整个堆进行整理,包括Young、Tenured和Perm。Full GC 比Scav...

2016-10-09 13:39:58 126

原创 jstat查看jvm的GC情况(转)

jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。jps存放在JAVA_HOME/bin/jps,使用时为了方便请将JAVA_HOME/bin/加入到Path.  jstat        1....

2016-10-09 13:38:18 93

原创 SimpleDateFormat线程安全问题原因与解决方案

1.原因SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日期相关String, Date等等, 都是交友Calendar引用来储存的.这样就会导致一个问题,如果你的sdf是个static的, 那么多个thread ...

2016-09-22 16:54:33 252

空空如也

空空如也

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

TA关注的人

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