简栈文化

Java技术人的成长之路~


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

Refresh方法到底干了啥?

发表于 2020-02-28 | 更新于: 2020-08-02 | 分类于 Spring
作者:吃饭睡觉撸代码 来源:https://fangjian0423.github.io/2017/05/10/springboot-context-refresh/ 前言Spring容器创建之后,会调用它的refresh方法,refresh的时候会做很多事情:比如完成配置类的解析、各种BeanFactoryPostProcessor和BeanPostProcessor的注册、国际化配置的初始化、web内置容器的构造等等。 我们来分析一下这个refresh过程。 还是以web程序为例,那么对应的Spring容器为AnnotationConfigEmbeddedWebApplicationContext。它的refresh方法调用了父类AbstractApplicationContext的refresh方法: 12345678910111213141516171819202122232425262728293031public void refresh() throws BeansException, IllegalStateException { // refresh过程只 ...
阅读全文 »

Netty 系列之 Netty 高性能之道

发表于 2020-02-28 | 更新于: 2020-08-02 | 分类于 Netty
1. 背景1.1. 惊人的性能数据最近一个圈内朋友通过私信告诉我,通过使用 Netty4 + Thrift 压缩二进制编解码技术,他们实现了 10W TPS(1K 的复杂 POJO 对象)的跨节点远程服务调用。相比于传统基于 Java 序列化 +BIO(同步阻塞 IO)的通信框架,性能提升了 8 倍多。 事实上,我对这个数据并不感到惊讶,根据我 5 年多的 NIO 编程经验,通过选择合适的 NIO 框架,加上高性能的压缩二进制编解码技术,精心的设计 Reactor 线程模型,达到上述性能指标是完全有可能的。 下面我们就一起来看下 Netty 是如何支持 10W TPS 的跨节点远程服务调用的,在正式开始讲解之前,我们先简单介绍下 Netty。 1.2. Netty 基础入门Netty 是一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。 作为当前最流行的 NIO 框架,N ...
阅读全文 »

Spring Bean初始化过程

发表于 2020-02-28 | 更新于: 2020-08-02 | 分类于 Spring
init-method方法init-method方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。init-method需要在applicationContext.xml配置文档中bean的定义里头写明。例如: 1<bean id="TestBean" class="nju.software.xkxt.util.TestBean" init-method="init"></bean> 这样,当TestBean在初始化的时候会执行TestBean中定义的init方法。 afterPropertiesSet方法12345678910111213public interface InitializingBean { /** * Invoked by the containing {@code BeanFactory} after it has set all bean properties * and satisfied {@link BeanFactoryAware}, {@code ...
阅读全文 »

Shadowsocks自定义PAC规则

发表于 2020-02-28 | 更新于: 2020-08-02 | 分类于 Shadowsocks
Shadowsocks PAC规则ShadowSocks默认使用GFWList规则和使用adblock plus的引擎。要想自己添加自定义的用户规则,最好熟悉一下其规则: 中文版:Adblock Plus过滤规则 自定义代理规则的设置语法与GFWlist相同,语法规则如下: 通配符支持。 比如 *.example.com/* 实际书写时可省略 * , 如.example.com/ 和 *.example.com/* 效果一样 正则表达式支持。 以 \ 开始和结束, 如 \[\w]+:\/\/example.com\ 例外规则 @@ 如 @@*.example.com/* 满足 @@ 后规则的地址不使用代理 匹配地址开始和结尾 | 如 |http://example.com 、 example.com| 分别表示以 http://example.com 开始和以 example.com 结束的地址 ||标记 如 ||example.com 则 http://example.com 、https://example.com 、 ftp://example.com 等地址址 ...
阅读全文 »

MySQL的执行计划与代价模型详细解析

发表于 2020-02-28 | 更新于: 2021-10-15 | 分类于 MySQL
背景为了后续的沟通方便,在20200213的早上创建了一个《简栈-Java技术交流群》,也方便大家通过扫二维码积极的参与进来。 如果是二维码已经过期,大家可以添加简栈文化-小助手的微信号(lastpass4u),然后让他拉大家进群进群。我们保持着小而美的精神,宁缺毋滥。 然后早上群里就有人提了一个问题: 执行计划里面的扫描函数跟执行时间不匹配,比如查询优化器发现,扫描a索引行数更多,所以更慢,因此优化器选择了索引b, 但实际上走b索引的时候比a更慢,走a索引大概是4秒左右,b是8秒。 这个问题激发起了大家的讨论,有的人建议说: 1、这种可以强制指定索引执行的吧 2、这个扫描行数都是预估的不一定准的,能操作shell的话执行analyse table看看。 3、看一下你的index,DDL,explain等等 但提问者明显这些都是已经自己搞清楚了的,他关心的是底层的优化器成本规则等。这类我才意识到EXPLAIN出来的是结果,其实数据库底层本身是有优化器的,而最终选择谁,是否过索引等都是有它的规则的。这其中都涉及到效率与成本问题。 Explain执行计划详解使用explain关 ...
阅读全文 »

Zookeeper Leader选举算法

发表于 2020-02-28 | 更新于: 2020-08-02 | 分类于 Zookeeper
当Leader崩溃或者Leader失去大多数的Follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的Leader,让所有的Server都恢复到一个正确的状态。Zookeeper中Leader的选举采用了三种算法: LeaderElection FastLeaderElection AuthFastLeaderElection 并且在配置文件中是可配置的,对应的配置项为electionAlg。 背景知识Zookeeper Server的状态可分为四种: LOOKING:寻找Leader LEADING:Leader状态,对应的节点为Leader。 FOLLOWING:Follower状态,对应的节点为Follower。 OBSERVING:Observer状态,对应节点为Observer,该节点不参与Leader选举。 成为Leader的必要条件: Leader要具有最高的zxid;当集群的规模是n时,集群中大多数的机器(至少n/2+1)得到响应并follow选出的Leader。 心跳机制:Leader与Follower利用PING来感知对方的是否存活,当Lea ...
阅读全文 »

Zookeeper 一致性协议Zab

发表于 2020-02-28 | 更新于: 2020-08-02 | 分类于 Zookeeper
Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性的核心。Zab协议是Paxos协议的一种变形,下面将展示一些协议的核心内容。 考虑到Zookeeper的主要操作数据状态,为了保证一致性,Zookeeper提出了两个安全属性: 全序(Total Order):如果消息A在消息B之前发送,则所有Server应该看到相同结果。 因果顺序(Causal Order):如果消息A在消息B之前发生(A导致了B),并且一起发送,则消息A始终在消息B之前被执行。 为了保证上述两个安全属性,Zookeeper使用了TCP协议和Leader。通过使用TCP协议保证了消息的全序的特性(先发先到),通过Leader解决了因果顺序(先到Leader先执行)。因为有了Leader,Zookeeper的架构就变成为:Master-Slave模式,但在该模式中Master(Leader)会Crash,因此,Zookeeper引入Leader选举算法,以保证系统的健壮性。 当Zookeeper Server收到写操作,Follower会将其转发给Lea ...
阅读全文 »

Tomcat是如何实现异步Servlet的

发表于 2020-02-28 | 更新于: 2020-08-02 | 分类于 Tomcat
前言通过我之前的Tomcat系列文章,相信看我博客的同学对Tomcat应该有一个比较清晰的了解了,在前几篇博客我们讨论了Tomcat在SpringBoot框架中是如何启动的,讨论了Tomcat的内部组件是如何设计以及请求是如何流转的,那么我们这篇博客聊聊Tomcat的异步Servlet,Tomcat是如何实现异步Servlet的以及异步Servlet的使用场景。 手撸一个异步的Servlet我们直接借助SpringBoot框架来实现一个Servlet,这里只展示Servlet代码: 1234567891011121314151617181920212223242526272829303132@WebServlet(urlPatterns = "/async",asyncSupported = true)@Slf4jpublic class AsyncServlet extends HttpServlet { ExecutorService executorService =Executors.newSingleThreadExecutor(); @Override ...
阅读全文 »

JVM深入理解-内存物理结构&类加载

发表于 2020-02-27 | 更新于: 2020-08-02 | 分类于 Java
背景对于JVM这块儿的知识,我估计大部分的都是只有在需要面试的时候才会拿出来复习一下,然后就又放下来。也是因为这块儿是Java最底层的部分,非常难懂。其实如果真的说认真、细心的去撸一下,了解透彻,应该就不会那么容易忘记。 今天的主要目的也是根据Oracle的官方文档来一步一步的理解与学习,并且用用一些demo来验证理论。 Java虚拟机内存结构我们先来看一下JVM一个大概的物理结构图(请注意,不叫内存模型): 堆的划分我们首先看一下官方地址对于运行时数据区域的一个划分:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html 2.5. Run-Time Data Areas 2.5.1. The pc Register 2.5.2. Java Virtual Machine Stacks 2.5.3. Heap 2.5.4. Method Area 2.5.5. Run-Time Constant Pool 2.5.6. Native Method Stacks 堆堆存放:对象、数组 (官方证明: The heap ...
阅读全文 »

JVM深入理解-垃圾回收

发表于 2020-02-26 | 更新于: 2020-08-02 | 分类于 Java
前言最近线上出现了JVM 频繁FGC的问题,查询了很多GC相关的资料,做了一些整理翻译。文章比较长可以收藏后慢慢阅读。 一、什么是垃圾回收?(Garbage Collection)一个垃圾回收器有一下三个职责 分配内存 确保有引用的对象能够在内存中保留。 能够在正在执行的代码环境中回收已经死亡对象的内存。 这里提到的有引用是指存活的对象,后面会提到一些算法用来判断对象是否存活。不在有引用的对象将被认为是死亡的,也就是常说的垃圾garbage。找到并释放这些垃圾对象占用的空间的过程就被称作是垃圾回收garbage collection。 垃圾回收可以解决很多内存分配的问题,但并不意味这全部。 比如:你可以不断地创建对象并保持对它们的引用直到没有可用的内存分配。垃圾回收本身就是一项非常复杂和消耗资源的过程。 二、理想的垃圾收集器需要哪些特性? 垃圾收集器必须是安全和全面的。这就意味着,存活的对象绝对不能被释放,相反垃圾对象在很少的垃圾回收循环里必须被回收。 垃圾回收必须是高效的,不允许出现正在运行的程序长时间暂停。 内存碎片整理,垃圾被收集以后内存会存在很多不连续的内存碎片,可能导致大 ...
阅读全文 »
上一页1…8910…15下一页
Vernon

Vernon

149 日志
66 分类
87 标签
RSS
GitHub E-Mail
© 2021 Vernon
由 Hexo 强力驱动
|
主题 — NexT.Gemini v6.0.4