
原理 / 源码
文章平均质量分 84
wen-pan
是程序猿一只呀
展开
-
IDEA搭建JDK源码学习环境(可添加注释、修改、debug)
IDEA搭建JDK源码学习环境(可添加注释、修改、debug) 工程详情见:https://github.com/wenpanwenpan/study-source-jdk1.8.0_281原创 2024-01-28 12:43:40 · 1043 阅读 · 0 评论 -
一台服务器最大能支持多少条TCP连接
来控制,默认大小是128,当两台机器离的非常近,但是建立连接的并发又非常高时,可能会导致半连接队列或全连接队列溢出,进而导致server端丢弃握手包。上面讨论的都是进建立连接的理想情况,在现实中如果有频繁的数据收发和处理(比如:压缩、加密等),那么一台服务器能支撑1000连接都算好的了,所以一台服务器能支撑多少连接还要结合具体的场景去分析,不能光靠理论值去算。,所以Linux系统基于安全角度考虑(比如:有用户进程恶意的打开无数的文件描述符,那不得把系统搞奔溃了),在多个位置都限制了可打开的。原创 2022-11-06 16:59:34 · 6828 阅读 · 3 评论 -
从内核角度看网络包发送流程
释放掉RingBuffer中的数组对skb的引用(注意:此时RingBuffer里的数组虽然放弃了对skb的引用,但是该skb并不会被立即清除,因为TCP有重传机制,必须要保证收到了对方的ack应答后再彻底删除该skb,如果没有收到对方的ack,那么传输层还可以重传该skb)通过上面的两种发送数据时拷贝的对比,可以看出sendfile相比与传统的方式,一次数据发送流程中,少了一次【CPU拷贝】,两次【态的切换】,在需要发送的数据较大的情况下,这里便是性能的提升点。能,sendfile就是这么干的。原创 2022-11-05 21:46:44 · 3756 阅读 · 0 评论 -
spring的@Import注解会不会注入bean到容器
结论:正常情况下是会的,但是在某些特定的情况下并不会导入类到容器!!!然后在项目的主启动类或配置类上标注注解就可以实现某个功能的动态开关,看上去很优雅,但是有一次遇到一个问题,,比如上面的类如下,该类实现了接口二、问题解决经过我的验证,如果不实现接口,那么是可以正常被导入容器的所以问题出在实现接口上,我们只需要不实现该接口就行,如果非要实现接口,又想将自定义的类注入容器,那么可以在配置类中通过的方式来实现目前我遇到的@Import注解不能导入的类仅仅只有一种情况,特此记录!!!原创 2022-09-24 19:32:06 · 735 阅读 · 0 评论 -
feign调用丢失请求头问题解决及原理分析
注入一个自定义的接口的实现类到容器中openFeign发起调用前会先构建请求的Request,在构建request的时候就会拿到我们自定义的并执行,在自定义的RequestInterceptor实现类中便会从原有请求里拿到请求头信息,然后放入feign调用的request里注意如果是通过线程池或多线程进行发起feign调用,那么通过上述的添加实现类里通过获取原有请求里的请求头数据是获取不到的,这种情况怎么解决?其实也简单,最简单的方式就是在提交任务到线程池里的时候将请求头信息传递进去就可以了。.......原创 2022-07-25 16:41:57 · 2935 阅读 · 0 评论 -
JDK动态代理原理解析
1、回顾一下JDK动态代理的核心参数如果我们要为target类创建一个【JDK动态代理对象】,那么我们必须要传入如下三个核心参数加载target类的类加载器target类实现的接口InvocationHandler为什么必须要这三个参数呢?之前使用动态代理的时候都是直接按接口要求传这三个参数,但从来没想过为什么?下面仔细去探究一下2、实现一个简单的动态代理【JDK动态代理】的核心其实是借助【Proxy.newProxyInstance(ClassLoader loader,Class<原创 2022-03-14 16:52:31 · 4861 阅读 · 0 评论 -
手写一个RPC框架
一、项目介绍①、项目基础介绍【 simple-rpc】是一款简单的rpc服务框架,主要用于学习造轮子!以便于透彻的理解RPC原理和过程,以及spring、springboot、netty中相关技术运用。【 simple-rpc】主要实现了两个版本【simple-rpc-like-feign分支】实现了类似于openfeign调用相关功能(openFeign底层通信是基于HTTP,一般是使用HttpClient等相关HTTP客户端发起的调用(这也是openfeign比较低效的原因之一)。在simpl原创 2022-01-25 14:19:54 · 1076 阅读 · 1 评论 -
使用SPI机制加载MySQL驱动源码分析
一、SPI介绍SPI具体介绍,可以参考以前的文章:https://blog.youkuaiyun.com/Hellowenpan/article/details/101112365?spm=1001.2014.3001.5501二、为什么要使用SPI机制加载driver主要原因是为了实现解耦和可插拔JDK提供数据库驱动的规范(即Driver接口)但不提供任何的实现,位于java.sql包下各个不同的数据库厂商按照JDK提供的规范去进行不同的实现(比如MySQL驱动实现,Oracle数据库驱动实现)JVM原创 2021-10-23 22:49:17 · 1415 阅读 · 0 评论 -
如何优化TCP三次握手效率
一、问题说明在某次聊netty优化相关问题的时候,被问到了netty中可以如何优化TCP三次握手的效率?如何优化TCP三次握手的效率???起初根本没有听过这类似的问题,也没有任何思路回答。后面查阅了一些资料做了一个总结二、问题答案主要可调整点分为以下四点:server端根据实际情况增大半连接和全连接队列的容量,让server端可以缓冲更多client握手请求,等server端的处理建立socket连接的线程慢慢的去执行accept,为client建立socket连接。半连接队列大小,调整L原创 2021-10-11 14:41:30 · 834 阅读 · 0 评论 -
ThreadPoolExecutor线程池execute和submit的区别
结论基本没有区别,在submit方法中仍然是调用的execute方法进行任务的执行或进入等待队列或拒绝。submit方法比execute方法多的只是将提交的任务(不管是runnable类型还是callable类型)包装成RunnableFuture然后传递给execute方法执行。源码对比①、execute源码public void execute(Runnable command) { if (command == null) throw new NullPoin.原创 2021-08-30 10:12:01 · 12684 阅读 · 0 评论 -
调用ThreadPoolTaskExecutor的shutdown方法一定会让正在执行的线程任务执行完毕吗
先给答案不一定,要想在调用ThreadPoolTaskExecutor.shutdown方法的时候让线程池等待正在执行的任务执行完毕后再关闭,需要手动设置waitForTasksToCompleteOnShutdown属性值为true。这里讨论的是在基于JVM不关闭的情况下调用ThreadPoolTaskExecutor.shutdown方法,如果JVM正在关闭的情况分析可参考:线程池shutdown和shutdownNow原理和区别JVM关闭的时候到底会不会等待线程池线程任务执行完毕注意原创 2021-08-28 12:08:32 · 9153 阅读 · 0 评论 -
JVM关闭的时候到底会不会等待线程池线程任务执行完毕
线程池的shutdown()方法和shutdownNow()方法起到的作用只是将每个线程内部的中断状态变为true,表示该线程收到过中断信号。并不能实际的停止线程,也就是说只能够起到一个通知的作用!其实这个问题的答案很容易知道,反向想一想,如果JVM关闭的时候如果真的需要等待每一个正在执行任务的线程执行完毕才完全关闭,那么如果有的任务执行非常耗时(或者直接就是死循环),那岂不是JVM永远不能退出了。这里主要是探究在JVM关闭过程中的动作,以及如果关闭过程中存在一直运行的任务会如何处理。shutdo..原创 2021-08-27 21:03:46 · 4953 阅读 · 1 评论 -
线程池shutdown和shutdownNow原理和区别
说明:以ThreadPoolExecutor线程池为例说明整个流程(不同的线程池实现上略有差别)。一、shutdown流程1、流程简介修改线程池状态为SHUTDOWN再接收新提交的任务中断线程池中空闲的线程第③步只是中断了空闲的线程,但正在执行的任务以及线程池任务队列中的任务会继续执行完毕二、shutdownNow流程1、流程简介修改线程池状态为SHUTDOWN不再接收任务提交尝试中断线程池中所有的线程(包括正在执行的线程)返回正在等待执行的任务列表 List<Run原创 2021-08-27 15:24:48 · 6016 阅读 · 0 评论 -
线程池提交和执行任务源码探究
说明:本文主要探究任务提交到线程池,以及任务如何被执行,以及如何使用 Future 来获取任务执行的返回结果。一、线程池的好处1、线程池的重用线程池的创建和销毁的开销巨大,通过线程池的重用大大减少了这些不必要的开销,既然减少了内存开销,其线程执行速度也回提高。2、控制线程池的并发数控制线程池的并发数可以有效的避免大量的线程池争夺CPU资源而造成堵塞。3、线程池也可以对线程进行管理线程池可以提供定时、定期、单线程、并发数控制等功能。比如通过SheduledThreadPool线程.原创 2021-04-19 17:23:40 · 544 阅读 · 0 评论 -
Spring事务原理探究
一、spring事务使用流程1、使用spring提供的事务管理的时候,需要向容器中注入数据源 DataSource、注入事务管理器 PlatformTransactionManager,然后开启事务管理 @EnableTransactionManagement。2、上面三步执行完毕之后,就可以在需要使用事务管理的类或者方法上使用 @Transactional注解即可。二、Spring事务原理探究Ⅰ、spring事务执行流程1、首先,在容器启动的时候,会向容器中注册数据源、事务管理器、事务属性、原创 2020-10-28 21:15:30 · 477 阅读 · 0 评论 -
Mybatis运行流程源码解析
一、debug源码环境准备1、下载mybatis源码调试mybatis源码理解mybatis工作原理,首先需要下载mybatis源码!下载地址:https://github.com/mybatis/mybatis-3带中文注释的源码: https://github.com/tuguangquan/mybatis2、下载mybatis-parent源码并编译**注意:**下载的mybatis-parent版本要和mybatis源文件pom.xml 版本一致。下载地址:https://g原创 2020-10-21 22:29:30 · 522 阅读 · 0 评论