Java基础
文章平均质量分 88
生病的毛毛虫
这个作者很懒,什么都没留下…
展开
-
Interview preparation-- Feign源码分析
【代码】Interview preparation-- Feign源码分析。原创 2024-06-02 23:52:08 · 431 阅读 · 1 评论 -
Interview preparation -- spring-cloud-sentinel
下图是令牌桶案例,系统已一定速率(r token/sec)往固定容量的令牌桶中放入令牌,如果此时有客户端请求过来,则需要从令牌桶中拿到令牌以获得访问资格。令牌桶是对网络整体限制 + 速率限制的一个常用算法,对于每一个请求,都需要从令牌桶中获取一个令牌,如果没有获得令牌,则需要出发限流策略。令牌桶算法中,有两个关键值,桶容量,令牌添加速率,两个值都必须低于系统能承载的最大QPS,原创 2023-03-18 22:49:15 · 197 阅读 · 0 评论 -
Interview preparation -- Spring AOP
ProxyFactoryBean是ProxyConfig的一个子类,ProxyConfig是一个数据的基础类,他为子类提供了配置属性的解析,一次来获取一个代理信息的基础数据,比如Adice ,PointCut,Advisor等信息在xml文件中的配置由他来载入。代理模式图解,代理对象通过持有被代理对象的引用,在执行具体方法的时候通过调用被持有代理对像的引用来完成被代理对象的方法,并且同时增加自己的增强方法,Spring AOP中的设计思想也是同样的。原创 2023-03-13 13:13:21 · 47 阅读 · 0 评论 -
Interview preparation -- SpringAop
在不修改原有代码,或者无法修改原有代码的情况下,增强对象功能,使用代理对象代替原来的对象去完成功能而达到扩展功能的目的。JDK动态代理的局限性一定要有接口和实现类的存在增强接口中定义的方法,实现类中其他和接口无关的方法是无法增强的只能读取到接口方法上的注解,不能读取到实现类方法上的注解总而言之,JDK动态代理只能和接口打交道,不能与具体实现类有交集,因为他并不知道所要代理的类是那个实现类。原创 2023-03-12 23:15:32 · 71 阅读 · 0 评论 -
Interview preparation -- spring bean生命周期
Spring bean生命周期原创 2023-03-10 15:15:36 · 66 阅读 · 0 评论 -
IM流程图
撒旦法原创 2023-03-10 14:47:54 · 106 阅读 · 0 评论 -
Interview preparation -- Spring-IOC容器初始化过程
利用AbstractApplicationContext 中对DefaultResourceLoader 类继承的getResource方法 对传入的Path进行解析,然后生成一个FileSystemResource对象并返回。如果是其他类型的ApplicationContext,就生成对应类型的Resource依据上一步骤得到的FileSystemResource,在BeanDefinitionReader 接口中定义了资源文件的读取固定模板方法。原创 2023-03-08 18:41:13 · 37 阅读 · 0 评论 -
JVM 类加载机制 - review
类加载的“加载”阶段,需要完成以下三件事情。原创 2023-03-06 18:35:32 · 34 阅读 · 0 评论 -
Interview preparation -- JVM性能优化-垃圾收集器
JVM性能优化-垃圾收集器原创 2023-03-03 15:37:11 · 125 阅读 · 1 评论 -
java调优方法,jvm监控工具
graph LRA-->B性能概述程序性能表现形式执行速度:程序响应速度,总耗时是否足够短内存分配:内存分配是否合理,是否过多消耗内存或者存在泄漏启动时间:程序运行到可以正常处理业务需要的时间负载承受能力性能测评指标执行时间CPU时间:函数或者线程占用CPU时间内存分配:程序在运行时占用内存空间磁盘吞吐量:描述I/O使用情况网络吞吐量:描述网络使用情况响应时间:系统对用户行为或者时间做出回应的时间。系统瓶颈相关计算机资源磁盘I/O网络操作CPU异常:对原创 2020-05-09 12:17:56 · 2377 阅读 · 1 评论 -
Interview preparation -- JVM性能优化-jvm参数,GC算法
引用计数算法:标记清除算法:复制算法:标记压缩算法:增量算法:分代收集。原创 2023-03-02 23:57:18 · 40 阅读 · 0 评论 -
Netty核心组件EventLoop源码解析
每次执行execute方法就会向队列中添加任务。当第一次添加时候就启动线程,执行run方法,run方法是EventLoop的核心实现,负责轮询获取事件,处理事件,执行队列中任务其中调用selector的select方法默认阻塞一秒,有定时任务就t+0.5,t是定时任务剩余时间,当执行execute方法时候,也就是添加任务的时候,唤醒selector,防止selector阻塞事件过长当selector返回的时候,会调用processSelectedKeys对selectKey进行处理。原创 2023-02-28 22:20:43 · 297 阅读 · 0 评论 -
Netty心跳(heartbeat)服务源码解析
IdleStateHandler实现心跳检测功能,当服务器和客户端没有任务读写,并且超过设置事件,会触发handler的userEentTriggered方法,用户可以在这个方法中实现自己的逻辑IdleStateHandler的实现基于EventLoop的定时任务,每次读写都会记录一个最后读/写事件,定时任务执行的时候,根据最后读写事件与间隔时间的差值来判断是否执行内部有3 个定时任务,分别对应读,写,读/写事件,通常我们监听读/写事件就足够。原创 2023-02-27 23:02:15 · 399 阅读 · 0 评论 -
Netty核心组件ChannelPipeline事件handler源码解析
ChannelPipeline中的出入站方法中出站是从tail开始,入站是从head开始,因为出站是从服务器端通过ChannelPipeline到SocketChannel写,从tailHandlerContext开始,能让前面所有的Handler进行处理,能防止Handler被遗漏,比如编码入站当然是从SocketChannel通过 ChannelPipeline 到服务器端,当然是从head开始往内部输入,让后面的handler能处理这些输入数据,比如解码。原创 2023-02-24 17:28:17 · 381 阅读 · 0 评论 -
Netty核心组件创建源码浅析
如上可以看到他的初始化过程中包含 DefaultChannelPipeline, executor 线程池初始化,就是我们创建的EventLoopGroup,包括inbound,outbound两个boolean类型,标识此处的Handler是处理出站还是处理入站。channelRead当从channel读取数据时候被调用,这两个方法是我们使用Netty编码的时候经常用到的。是一个通用的能够同时处理入站事件和出站事件的类,类结构如下。bind方法,当请求将channel绑定到本地的时候调用。原创 2023-02-23 12:29:03 · 392 阅读 · 0 评论 -
Netty服务端请求接受过程源码剖析
循环遍历之前doReadMessage中获取的buf中的所有请求,调用Pipeline的firstChannelRead方法,用于处理这些接受的请求或者其他事件,在read方法中,循环调用ServerSocket的Pipeline的fireChannelRead方法,开始执行管道中的handler的ChannelRead方法,如下。参数buf是一个静态队列。将获取到的Nio中SocketCHannel包装成Netty中的NioSocketChannel 并且添加到buf队列中(list)原创 2023-02-17 15:52:45 · 413 阅读 · 0 评论 -
Netty启动流程源码剖析
可以看到,这正是我们在group链式调用中在初始化 ServerBootstrap 中的channel传入的NioServerSocketChannel,接下来就直接到NioServerSocketChannel中的构造方法,如下代码。每个元素的类型给赋值了一个EventLoop,也就是我们的NioEventLoopGroup中是一个NioEventLoop的一个事件循环数组,包含了多个EventLoop,这个可以注册channel,用于在事件循环中去进行选择。Unsafe对象示意图。原创 2023-02-16 11:56:31 · 435 阅读 · 0 评论 -
从CPU中缓存架构浅析volatile底层原理
JMM中规定所有变量都存储在主内存(Mail Memory)中。每条线程都有自己的工作内存(work Memory),此处说明的主内存,即上文中的操作系统的内存,每条线程的工作内存,就是我们CPU的高速缓存,从上文对CPU缓存的说明可以看出,线程对变量读,写在工作内存中进行,同时,本线程工作内存的变量无法改变其他线程工作内存,必须通过主内存完成信息交换内存模型如下:如上图中,线程A修改变量后,只会在此线程工作内存中体现。原创 2023-02-06 15:58:21 · 445 阅读 · 1 评论 -
Java I/O中的Reactor模式
单Reactor单线程,酒店的门童,服务员是同一个人,全程为客户服务单Reactor多线程,1个门童,多个服务员,门童之负责接待,转给服务员主从Reactor多线程,多个门童,多个服务员。原创 2022-09-16 16:08:24 · 942 阅读 · 0 评论 -
IO与零拷贝
零拷贝时网络编程的一个关键优化点在Java程序中,常用的零拷贝又mmap(内存映射)和sendFile。那么在OS中的设计时如何,我们需分析mmap和sendFile对比最后通过案例分析。原创 2022-08-26 10:10:17 · 399 阅读 · 0 评论 -
javaI/O包中的包装模式
InputStream类是一个抽象类,FileInputStream是具体的组件,实现了抽象类所有接口,所以FilterInputStream是我们的装饰角色,他实现了InputStream所有接口,并且持有InputStream的一个实例。上面案例中,装饰器模式就是赋予被装饰类更多的功能,在Java I/O中,有很多组合功能情况,这些不同功能的组合就是装饰器实现的,比如FilterInputStream为案例说明。Component:抽象组件角色,定义一组抽象接口,规定这个被装饰组件的功能。...原创 2022-08-04 17:48:16 · 221 阅读 · 0 评论 -
I/O性能与可靠性
RAID类型访问速度数据可靠性磁盘利用率ARID0很快很低100%ARID1很慢很高50%ARID10中的很高50%ARID5较快很高(N-1)/NARID6较快很高(N-2)/N解决问题数据存储容量问题RAID用多块磁盘组成存储阵列,例如RAID5可以扩大N-1倍数据读写速度将数据并发写入N份磁盘,写入速度明显提升,同时读取也是一样,但是并不能提升N倍,因为机械硬盘延迟主要是用来寻址的时间,数据真正读写时间只占一小部分。https。...原创 2022-08-02 12:09:49 · 398 阅读 · 0 评论 -
NIO工作方式浅析
NIO提供了比传统文件访问更好的方法,两个优化方法FileChannel.transferTO,FileChannel.transferFrom,另外一个是FileChannel.map。此时底层操作系统就可以从缓冲区中正确读取这5个字节数据,并且发送出去,在下一次写入数据之前我们在调用clear()方法,缓冲区的索引又会回到初始位置。mark的作用当调用mark()方法时候,会记录当前position的前一个位置,我们需要调用reset时候,position恢复mark记录的值。......原创 2022-08-01 15:49:49 · 276 阅读 · 0 评论 -
java8 stream案例分析
java8 streamStream是java8 推出的一个处理集合类的一个全新的接口,在工作当中经常用到,并且他的预发规则与我们平台的有一点不一样,是流式的处理,非常类似RXJava的一个风格。java中对Stream的定义是:A sequence of elements supporting sequential and parallel aggregate operations.以上的的语义包含两部分:Stream是元素的集合,这点让Stream看起来有一些类似Iterator原创 2021-06-23 14:46:10 · 133 阅读 · 2 评论 -
死磕 Java 8 的日期处理
TIMEJava 8 推出了全新的日期时间API并且已经很久了,因为业务中遇到的时间处理的还是不多,因此用的也少,而且大多是用封装好的时间共计包,就更少接触java8 的时间类型API了,因此对他不是很熟,今天遇到了一下问题打算总结一下:Java处理日期、日历和时间的不足之处:将 java.util.Date 设定为可变类型,以及 SimpleDateFormat 的非线程安全使其应用非常受限。然后就在 java8 上面增加新的特性。全新API的好处之一就是,明确了日期时间概念,例如:瞬时(inst原创 2021-06-21 10:10:30 · 202 阅读 · 8 评论 -
网络编程-HTTPS协议的实现原理
待续原创 2020-06-29 22:22:49 · 267 阅读 · 0 评论 -
网络编程-TCP/IP协议栈-UDP/HTTP协议
UDP协议UDP协议全称是用户数据报协议,在网络中她与TCP协议一样用于处理数据包,两个协议同处于协议栈的传输层,和TCP不同的是,UDP是一种无连接的协议栈。因为UDP是无连接的,所以相对来说,UDP的报头比TCP要简单的多了。如下图:UDP特点:第一UDP是一个非连接的协议,传输数据之前源端口和终端不建立连接,当他想传送时就简单的去抓取来自应用城西的数据,并尽可能快的把他扔在网络上,在发送端,UDP传送数据的速递仅仅是受应用程序生成数据的速度,计算机的计算能力,和传输带宽的现在;原创 2020-06-29 18:19:28 · 362 阅读 · 0 评论 -
网络编程-TCP/IP协议栈-TCP协议
TCP协议TCP协议作用TCP协议位于协议栈的传输层。当应用层向TCP层发送用于网间传输的,用8字节表示的数据流,TCP则吧数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受到改计算机连接的网络数据链路层的最大传送单元(MTU)限制(例如路由器每次传输数据的大小是固定的,并且是可以设置的,这个传输值就是MTU)。之后TCP吧数据包床底给IP层,由他来通过网络将包传送给接收端实体的TCP层。TCP为了保证报文传输的可靠性,就给每个包一个序号,同时序号也保证传送到接收端实体的包的按顺序接原创 2020-06-29 11:50:49 · 296 阅读 · 0 评论 -
网络编程-TCP/IP协议栈-IP协议
HTTP协议loading原创 2020-06-16 17:00:42 · 265 阅读 · 0 评论 -
Zookeepe实践与应用--分布队列
上一篇Zookeeper–分布式锁实现原创 2020-05-25 20:51:45 · 193 阅读 · 0 评论 -
Zookeeper实践与应用--分布式锁实现
上一篇Zookeeper实践与应用-- Nginx负载均衡差异原创 2020-05-21 23:02:05 · 207 阅读 · 0 评论 -
支付价格计算中精度问题之double,float
前言前段时间开发新的微信小程序,借此机会将老掉牙的支付模块重构,并且支持现金支付(之前都是虚拟币支付),在重构期间遇到计算上的一些精度问题,虽然数额影响非常小但是影响比较大,我觉得有必要总结以下遇到的一些问题,并且解决弄清楚他的原来,因此有下文。先看几个现象当我们程序中涉及到一些double或者float类型的数据,并且精度要求比较高,小数点位数比较多的时候,可能会出现一些非常奇葩的问题,我下面正对遇到的一些问题给出几个针对性的案例:条件判断异常System.out.println(1f原创 2020-05-17 23:19:40 · 2148 阅读 · 0 评论