自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

阿七

记录学习

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

原创 JVM---2.内存溢出

三,内存溢出异常 1.堆溢出:这个是最容易溢出的,实例化对象,无法获得空间存放。设置jvm的堆空间大小:堆初始化大小20M,最大20M,新生代10M,打印打击回收详细信息,设置新生代中的比例为8:2注意一定要设置-Xmx的堆最大值,不然它会扩大堆的大小,测试代码:public class MyT { static class OOMObject{ } public static void main(String []args) { List<OOMObj..

2021-08-25 12:41:20 425

原创 JVM---7.常用调优工具

一,jps全称:java virtual machine process status tool 1.不带参数 默认列出VM表示符号和简单的class或者jar名称 与ps -ef|grep java (查看与java有关的进程信息,linux命令)对比: 对比结果:linux展示的信息中,没用jps进程2.jps -m 输出主函数传入的参数3.jps -l 查看程序所在的包名二, jmap1.jmap -he...

2020-12-13 15:48:26 274

原创 springcloud入门---注册中心使用

参考:尚硅谷-阳哥springcloud第二季1.springboot与springcloud的版本选择springboot:2.2.2springcould:H版本 Hoxton.SRL该版本的设置,放置在父类maven的Pom.xml中部分代码: <groupId>com.myProject.springcloud</groupId> <artifactId>mycloud</artifactId> <ver..

2020-10-17 12:23:25 260

原创 Redis---list

一,概念 list,列表,可以实现左进左出,右进右出,可以存在重复值,具有下标等特性。二,常用命令1.插入左进一个:lpush key value value value...底层执行过程是 a, b a , c b a 。所以最后输出的时候是c b a。左一次性进入多个: 与分别进入,是一个效果,只不过减少了命令发送次数。右进同理,但是它的顺序就不相同了。2.删除1.左出:直接弹出下标为0的元素:lpop key2.右出:弹出最后一个元素:...

2020-09-20 15:51:20 488

原创 集合---HashMap

HashMap1.常量字段介绍static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 2的四次方,初始化默认的容量static final int MAXIMUM_CAPACITY = 1 << 30; 最大的容量值static final float DEFAULT_LOAD_FACTOR = 0.75f; //容量 负...

2020-09-20 11:31:44 125

原创 kafka源码---生产者(2)

四,RecordAccumulator3.1 整体结构 RecordAccumulator缓冲的结构:每一个分区对应一个双端队列deque,存放的单元是ProducerBatch,一个Batch中存放了多个Record,那么存消息是自动放到尾端,而读取消息(发送线程读取)是从头部开始的,目的是让发送的消息更加紧凑,节约空间,提高效率。注意这个大的缓冲池,默认是32M,如果超出了会阻塞send()方法,可以设置参数来调节这个大小。public final class RecordAccum..

2020-09-01 11:48:54 250

原创 Redis---集群

二,集群 Redis集群是Redis提供的分布式数据库方案。1.节点 最开始各个节点都是独立的,要进行连接,使用cluster meet命令,+ ip +端口进行。A,B,C三个节点,A,向B发送,AB集群成立,A向C发送,ABC集群成立(这里就没有B-C的过程) 1.启动节点:判断配置文件中,是否开启了集群。开启了,就把自己设为一个节点,没有就是单机模式。 2.集群数据结构:clusterNode,保存一个点的当前状态,创建时间,名字,ip,端口号等等。它不仅记...

2020-08-28 16:40:30 126

原创 Redis---哨兵

二,Sentinel(哨兵) Redis高可用解决方案:又一个或者多个哨兵组成哨兵系统,监控服务系统,当主服务器下线,自动将其下的从服务器升级为主服务器(这里感觉哨兵就是一个管理者,但是权限不高)1.启动并初始化Sentinel 初始化服务器:Sentinel本质还是一个redis服务器,Sentinel的启动就不需要加载持久化数据了,简化得多, 使用Sentinel专用代码:将redis服务器启动的代码替换为Sentinel专用代码,(命令表中的命令都不相同了) ...

2020-08-28 15:07:20 125

原创 spring源码---Aop:代理创建

回到wrapIfNecessary()方法中,AbstractAutoProxyCreator类中,现在找到了匹配的Advisor类,开始为bean创建代理:protected Object createProxy(Class<?> beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource) { //1.创建proxyFa

2020-08-16 23:11:40 187

原创 spring源码---Aop:解析@Aspect(二)

接着上一节分析,我们知道@Aspect的解析,发生在BeanFactoryAspectJAdvisorsBuilder类中,那么这个类是何方神圣呢?它在注解中写道:帮助@Aspecj bean from BeanFactory 进行解析,并且建立Advisors。用来auto -proxying。1.初始化:在AbstractAutoProxyCreator在refresh()第六步中进行getBean(),注入到BeanPostProcessor容器中的时候,进行了实例化and初始化,而它的子

2020-08-16 17:29:01 487

原创 spring源码---Aop:解析@Aspect(一)

aop启动,自然通知类,必不可少,那么spring是如何解析通知类的呢,目前我们从annotation启动过程中,发现spring只是把我们注册到配置类的@Aspect通知类作为一个普通的bean,实例化保存了起来,但是它的内容并没有发挥作用,或者说,当初始化@Aspect通知类的时候,按照我们配置在MyConfig配置类的顺序,前面的普通bean已经实例化,初始化完毕了,他们是如何通过@Aspect通知类进行自动代理的呢? 本节内容就是找到解析@Aspect的方式。 我们通过@Enable...

2020-08-16 12:45:21 575

原创 spring源码---IOC:refresh()总结

三,prepareBeanFactory(beanFactory)BeanFactory的预准备工作(BeanFactory进行一些设置);prepareBeanFactory()代码内容很多,总结如下  1)、设置BeanFactory的类加载器、支持表达式解析器...  2)、添加部分BeanPostProcessor【ApplicationContextAwareProcessor】  3)、设置忽略的自动装配的接口EnvironmentAware、EmbeddedValueRes

2020-08-16 11:29:12 224

原创 spring源码---IOC:注册bean(注解方式)

接着上一节,我们已经把配置类中的所有信息都解析出来,放到了configClass中,现在我们调用loadBeanDefinition()方法,注解解析出来的bean。Set<ConfigurationClass> configClasses = new LinkedHashSet<>(parser.getConfigurationClasses());configClasses.removeAll(alreadyParsed); //删除已经解析的// Read the

2020-08-15 10:02:12 395

原创 spring源码---IOC:解析配置类(二)

跟着上一节,我们来到ConfigurationClassProcessor类中:一,ConfigurationClassProcessorpublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { int registryId = System.identityHashCode(registry); this.registriesPostProcessed.add(registryId

2020-08-14 20:20:39 276

原创 spring源码---IOC:解析配置类(一)

二,包扫描方式第二种方式 包扫描方式(第一种是直接给一个bean的class对象,通过扫描类进行注解。)现在是给出MainConfig类的包,该包下面可能有几个配置类,入口:构造方法。 public AnnotationConfigApplicationContext(String... basePackages) { this(); scan(basePackages); refresh(); } 包扫描方式,如果让我实现,无非就是在第一种方式的基础上,增加了自己找到bean.

2020-08-14 16:17:21 224

原创 spring源码---Aop:匹配Bean

一,引入还记得在我们的aop配置中,加入了一个注解:@EnableAspectJAutoProxy,源码:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(AspectJAutoProxyRegistrar.class)public @interface EnableAspectJAutoProxy { boolean proxyTargetClass() default fa..

2020-08-13 21:21:31 272

原创 spring源码---mvc:HandlerAdapter

一,HandlerAdapter接口public interface HandlerAdapter {//1.判断是否支持传入的handler boolean supports(Object handler); @Nullable //使用handler处理请求 ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

2020-08-12 17:47:17 199

原创 spring源码---mvc:AbstractHandlerMethodMapping

他是使用也比较频繁,和@RequestMapping()对应,将一个method变成一个Handlermethod。1.字段:初看比较简单:private boolean detectHandlerMethodsInAncestorContexts = false;@Nullableprivate HandlerMethodMappingNamingStrategy<T> namingStrategy;private final MappingRegistry map...

2020-08-12 16:12:48 254

原创 spring源码---mvc:HandlerMapping

一.接口HandlerMappingpublic interface HandlerMapping { @Nullable HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;}只有一个方法getHandler(),根据request返回一个handlerExecutionChain执行链,该接口还有很多字段。二. AbstractHandlerMapping H...

2020-08-12 15:09:01 198

原创 spring源码---mvc:处理流程

请求处理流程:从jdk的HttpServlet到达DispatcherServlet类的doDIspatch()方法的过程如下:具体的代码可以参考:https://blog.csdn.net/zknxx/article/details/75194820现在我们从doDispatch()方法开始解析请求处理的过程:protected void doDispatch(HttpServletRequest request, HttpServletResponse response) thro

2020-08-12 11:04:41 162

原创 spring源码---mvc:九大组件

一,九大组件1.handlerMapping 用来查找handler的,也就是处理器,对应的就是标签@RequestMapping。也就是说handler,可以是类,也可以是方法.2.handlerAdapter 我们最原始的servlet处理方式可以知道,当一个请求到达的时候,是封装成request发送到servlet的doService(HttpServletRequest,HttpServletResponse)形式的,所以,要从传统的servlet模式转到spring m...

2020-08-12 09:37:50 308

原创 spring源码---mvc:初始化

一,九大组件1.handlerMapping 用来查找handler的,也就是处理器,对应的就是标签@RequestMapping。也就是说handler,可以是类,也可以是方法.2.handlerAdapter 我们最原始的servlet处理方式可以知道,当一个请求到达的时候,是封装成request发送到servlet的doService(HttpServletRequest,HttpServletResponse)形式的,所以,要从传统的servlet模式转到spring m...

2020-08-09 11:43:44 231

原创 spring源码---DI:populate()

------------------------------------- 2. 调用postProcess后置处理器 synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); mbd.postProcessed = true;} } 我们这里看最后一行...

2020-08-08 17:28:18 410

原创 spring源码---IOC:注册bean(xml方式)

接着上一节,讲到parseBeanDefinitions()方法,位于DefaultBeanDefinitionDocumentReader类中protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { if (delegate.isDefaultNamespace(root)) { NodeList nl = root.getChildNodes(); //获取

2020-08-07 21:57:56 267

原创 spring源码---Aop:调用过程

Spring Aop 是由接入BeanPostProcessor后置处理器开始的,Bean后置处理器是一个监听器,可以监听容器触发的Bean声明周期事件,向容器注册后置处理器以后,容器中管理的Bean就具备了接收IOC容器回调事件的能力。 BeanPostProcessor的调用发生在AbstractAutowireCapableBeanFactory类的doCreateBean()方法protected Object doCreateBean(final String beanName,...

2020-08-06 16:07:12 233

原创 java多线程---线程池

1.基本架构Executors和arrays,collections一样,是一个工具类。,那么底层核心在ThreadPoolExecutor上面。2.实现有5种实现,重点3种:通过executors获得。(同时,第四种获得java多线程的方式,线程池,第三种是通过callable,其余两种thread,runable)1.fixedThreadPool() ,固定装载的线程数量。里面使用了一个LinkedBlockQueue,有最大线程数量,如果来的请求了超过了线程池的最

2020-07-29 19:35:36 215

原创 集合---阻塞队列

java中的BlockingQueue接口是一个线程安全的存取队列,它提供四种不同的处理方法阻塞队列定义:队列插入的时候,当队列满时,队列会阻塞插入元素的线程,直到队列不满。 队列元素移除的时候,如果队列是空的,那么会等待队列有元素的时候,再移除。上面四种情况,是面对队列满的时候,为空的时候,处理方案,不同场景使用不同的方案。jdk7提供的7个阻塞队列:1.ArrayBlokingQueue:底层是数组,有界2.LinkedBlockingQu...

2020-07-29 19:21:59 169

原创 集合---非阻塞队列

队列概念 Queue接口与List、Set为同级别,都为Collection接口子接口。除了拥有 Collection 接口基本操作外,队列还提供其他的插入、提取和检查操作。每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是用于专门为有容量限制的 Queue 实现设计的;在大多数实现中,插入操作不会失败。非阻塞队列:ConcurrentLinkedQueue 传统的Queue在面对多线程情...

2020-07-29 16:10:23 157

原创 集合---ConcurrentHashMap

ConcurrentHashMap 继承于AbstractMap,实现了Map,Serializable接口。它实现了线程安全,比hashtable效率高很多,它允许多个修改操作并发运行,其关键使用了“锁分离”技术,即代码块锁,而不是方法锁,它使用了多个锁来控制对hash表的不同部分进行的修改。Jdk7和jdk8有很大改动,我们先看Jdk7版本Jdk7最开始我们的hashMap把所有数据都存放到table中,而现在,我们对table进行了切分,分成了很多段,形成了两层数组来保存,所以C...

2020-07-29 14:48:36 158

原创 集合---HashMap的不安全

1.hashMap存在的问题public static void main(String[] args) throws InterruptedException { Map<Integer,Integer> map=new HashMap<>(); Thread t1 = new Thread() { public void run() { for (int i = 0; i < 50000; i++) {

2020-07-29 10:21:55 155

原创 数据结构---红黑树

红黑树定义:红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质: 性质1:每个节点要么是黑色,要么是红色。 性质2:根节点是黑色。 性质3:每个叶子节点是黑色。 性质4:每个红色结点的两个子结点一定都是黑色。 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。(保持平衡) 总结:红色节点不可能相连,黑色节点可能相连。红黑树自平衡基本操作: 变色:在不违反上述红黑树规则特点情况下,将红黑树某个node节点颜色由红变黑,

2020-07-29 08:53:23 189

原创 集合---Set

1.字段属性private transient HashMap<E,Object> map;private static final Object PRESENT = new Object();HashSet集合中的内容是通过HashMap数据结构来实现的,它的内容作为key保存,value统一为PRESENT。2.构造方法无参构造方法,使用hashMap的默认参数public HashSet() { map = new HashMap<>();..

2020-07-28 15:23:33 114

原创 集合---Map

1.常量字段介绍static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 2的四次方,初始化默认的容量static final int MAXIMUM_CAPACITY = 1 << 30; 最大的容量值static final float DEFAULT_LOAD_FACTOR = 0.75f; //容量 负载因子,static final int TREEIFY_THRESHOLD = 8;

2020-07-27 22:43:59 115

原创 集合---List

List下面最常用的实现类ArrayList,底层使用数组存放内容,重要掌握如何初始化空间,如何扩容等等。1.字段private static final int DEFAULT_CAPACITY = 10; //默认初始化大小 10private static final Object[] EMPTY_ELEMENTDATA = {}; //这两个字段是用来区分构造方式的,是默认构造还是固定了参数private static final Object[] DEFAULTCAP...

2020-07-25 18:43:08 114

原创 Netty---编解码(原理)

1.ByteToMessageDecoder 用于将ByteBuf解码成为POJO对象重要字段:ByteBuf cumulation; //缓存private Cumulator cumulator = MERGE_CUMULATOR; //累计器private boolean singleDecode; private boolean first; //是否第一次解码private boolean firedChannelRead;//状态码private byt..

2020-07-06 19:26:07 612

原创 Netty---ByteBuf实现

一,获取1.ByteBuf实现分类按底层实现分类 1.HeadByteBuf: 底层实现为java堆内的字节数组,byte[],可以有GC回收。特点是内涵的分配和回收速度块,缺点是如果进行socket的io读写,需要额外做一次内存复制,将堆内存的内容复制到内核内存中,性能会有一定程度的下降。 2.DirectByteBuf:直接内存字节缓冲区,非堆内存,它在堆外进行内存分配,相比于堆内存,它的分配和回收都相对较慢,但是读写操作,少了一次内存复制,速度比堆内存块。内核空间的字节数...

2020-07-06 10:43:26 554

原创 Netty---ByteBuf认识

一,概念Netty提供了ByteBuf代替java NIO的ByteBuffer。 1.ByteBuf的优势:池化,减少了内存复制,GC,提升了效率,复合缓冲区类型,不需要调用flip()进行状态切换,读取和写入所以分开,方法的链式调用,可以进行引用计数,方便重复使用。 2.ByteBuf逻辑部分:内部是一个字节数组,从逻辑上看,可以分为四个部分,第一个:废弃,以用字节,第二个:可读,有效数据。第三个:可写。第四个:可扩容, 3.ByteBuf的重要属性:分为...

2020-07-05 22:13:55 295

原创 Netty---ChannelHandler

一,概念 能够被selector监控的IO事件有四种,分别是SelectionKey里面的 可读,可写 ,连接, 接收。四种。 在NioEventLoop里面有selector对事件进行监听,然后dispatch(派发)给handler。Netty中handler分为两类,一种是通道入站处理器Inbound; 另外一种是通道出战处理器Outbound; 两者都继承了ChannelHandler。 举例:比如EventLoop查询到了OP_R...

2020-07-05 19:03:26 665

原创 Netty---ChannelPipline

一,概念梳理一下Netty反应器模式中各个组件之间的关系: 1.反应器EventLoop和通道Channel:一对多,一个EventLoop可以绑定多个Channel 2.通道Channel和处理器handler:多对多(一个channel的IO事件被多个handler处理,一个handler可以处理多个channel的相同IO事件)那么如何把处理器绑定到通道中呢? 特殊组件:ChannelPipline(通道流水线):将多个处理器实例绑定到同一个通道,串起来管理,是...

2020-07-04 16:55:22 295

原创 Netty---AbstractChannel

一,概述 Netty不直接使用java NIO的channel组件,而是封装了,支持多种通信协议,比如tcp,udp,sctp。而且它还把channel分为了nio非阻塞的,和olo(bio)阻塞的两种。 netty为什么不使用nio的channel呢? 1.由于jdk的socketChannel和ServerSocketChannel主要职责是网络I/O操作,他们是SPI类接口,具体的实现由厂家自己来,难度很大,直接实现这两个的抽象类难度与实现spi接口工作量差...

2020-07-03 15:15:14 602

空空如也

空空如也

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

TA关注的人

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