![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 87
JellyfishMIX
qunar -- java 开发
展开
-
java classpath 是什么,直观展示
1. classpath 是启动 jar 包时指定的,通常 classpath 包含: 1. 依赖的 jar 包在机器上的路径。 2. 项目代码(工程中的 java 路径下的文件)。 3. resources 路径下的文件。2. 可以在 javac 编译后的代码中看到除依赖以外的 classpath 内容。原创 2024-07-15 10:30:00 · 222 阅读 · 0 评论 -
获取泛型,泛型擦除,TypeReference 原理分析
类的字节码 Attributes -> Signature 属性中,记录了类签名,类签名会显式指定传递给父类的泛型。这是根据子类获取向父类传递的泛型理论基础,及 TypeReference 的理论基础原创 2024-06-18 15:28:35 · 785 阅读 · 0 评论 -
观察 jvm 运行时数据区内存大小(native memory tracking)
jvm 运行时数据区包括且不限于以下几个部分:1. 堆(heap)。2. 方法区(method area)。3. 虚拟机栈(vm stack)。4. 本地方法栈(native method stack)。5. 程序计数器(program counter)。观察 jvm 运行时数据区内存情况可以使用 jcmd 命令。原创 2024-06-11 20:37:10 · 384 阅读 · 0 评论 -
设计模式 -- 观察者模式
观察者模式也被称为发布订阅模式。在 GoF 的《设计模式》一书中,它的定义是这样的:中文翻译: 在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。从模型来讲,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer)。原创 2023-11-10 02:47:05 · 683 阅读 · 0 评论 -
Failed to get field handle to set library path 问题解决(jdk17 升级)--附 xgboost4j 源码分析
ClassLoader 的 usr_paths 字段在高版本 jdk(例如 jdk17) 中没了,因此 ClassLoader.class.getDeclaredField("usr_paths") 会抛异常 NoSuchFieldException, try catch 把 NoSuchFieldException 的异常栈吞掉了,换成了 IOException 继续网上抛,因此 catalina.out 中异常栈最后在 IOException 处就断掉了。原创 2023-10-19 10:42:42 · 331 阅读 · 0 评论 -
kafka 对 java NIO 的封装
NetworkReceive: 对 NIO 中读 Buffer 的封装,用来缓存接收的数据。NetworkSend: 对 NIO 中写 Buffer 的封装,用来缓存发送的数据。KafkaChannel: 把 TransportLayer, NetworkReceive 和 NetworkSend 又做了一次封装,隐藏了底层组件的细节。原创 2023-06-09 14:35:22 · 1210 阅读 · 0 评论 -
javaNIO -- ByteBuffer 原理机制
ByteBuffer 可以理解为是一个 byte 数组,用于读取与写入。ByteBuffer 通过一些精巧的属性和方法, 更高效地使用内存空间。原创 2023-06-04 02:11:28 · 458 阅读 · 0 评论 -
kafka-Producer Sender 源码分析
发送请求分为两步。1. 第一步是消息预发送,Sender 从 RecordAccumulator 拉取要发送的消息集合,封装成 ClientRequest,传递给 NetworkClient。NetworkClient 首先根据 ClientRequest 构造 InFlightRequest,InFlightRequest 表示已发送但还未收到响应的请求。然后根据收到的 ClientRequest 构造 NetworkSend 类对象,放入到 KafkaChannel 的缓存里,消息预发送结束。原创 2023-05-16 15:15:59 · 573 阅读 · 0 评论 -
spring-web HandlerAdapter 源码分析
HandlerAdapter 存在的原因是, 处理器(handler)的实现有多种,例如实现 Controller 接口,实现 HttpRequestHandler 接口,或者使用 @RequestMapping 注解将方法作为一个处理器等。导致 springMVC 无法直接执行这个处理器,所以这里需要一个适配器(adapter),由它去执行处理器(handler)。原创 2023-05-09 17:30:41 · 682 阅读 · 0 评论 -
synchronized 的 monitor 机制
monitor 是 synchronized 中用以实现线程之间的互斥与协作的主要手段。每个 monitor 在每个时刻,只能被一个线程持有,该线程就是 activeThread,其它线程都是 waitingThread,分别在两个队列 entrySet 和 waitSet 里等候。在 entrySet 中等待的线程状态是 waiting for monitor entry,而在 wait set 中等待的线程状态是 in Object.wait()。原创 2023-04-11 16:57:04 · 1022 阅读 · 0 评论 -
spring-web HandlerMethodArgumentResolver 源码分析
HandlerMethodArgumentResolver 在解析参数时使用,使用了组合模式 + 策略模式。AbstractNamedValueMethodArgumentResolver 是基于名称获取值的 HandlerMethodArgumentResolver 抽象基类,提供根据参数名称解析的能力。NamedValueInfo 是静态内部类,对应注解的属性。原创 2023-02-17 21:00:08 · 994 阅读 · 0 评论 -
spring-web InvocableHandlerMethod 源码分析
HandlerMethod,处理器的方法的封装对象。HandlerMethod 只提供了处理器的方法的基本信息,不提供调用逻辑。InvocableHandlerMethod,继承 HandlerMethod 类,可调用的 HandlerMethod 实现类。原创 2023-02-17 20:56:47 · 876 阅读 · 0 评论 -
tomcat-container 源码分析
1. tomcat 由 connector 和 container 两部分组成,connector 接收到请求后,先将请求包装为 request,然后传递给 container 进行处理,最终返回给请求方。2. tomcat-container 按照包含关系一共有 4 个容器: StandardEngine, StandardHost, StandardContext, StandardWrapper。原创 2023-02-17 20:49:35 · 553 阅读 · 0 评论 -
BeanPostProcessor 源码分析
BeanPostProcessor 的调用时机,在初始化 bean 的 initializeBean 方法中,执行 invokeInitMethods 方法,调用 bean 的 init 方法及此阶段相关生命周期函数来初始化 bean。原创 2023-01-31 22:50:18 · 196 阅读 · 0 评论 -
@PostConstruct 注解源码分析
@PostConstruct 注解加在一个 bean 的方法上,当此 bean 被 spring-ioc 初始化时,自动调用此方法。注意,此类的实例需要作为 bean 交由 spring-ioc 管理时,注解才能生效。实现原理是借助了 BeanPostProcessor 的机制,具体地说,是 InitDestroyAnnotationBeanPostProcessor。原创 2023-01-31 22:39:29 · 754 阅读 · 0 评论 -
tomcat-connector 源码分析
NioEndpoint 组件是 IO 多路复用模型的一种实现,包含 Acceptor, Poller, LimitLatch, SocketProcessorBase, Executor 共 5 个组件。主体结构 Acceptor + Poller + Executor 线程池是典型的主从 reactor 模式。原创 2023-01-06 11:29:36 · 720 阅读 · 0 评论 -
设计模式--reactor 模式
reactor 模式通常应用于网络 IO 场景,高性能的中间件 redis, netty 都在使用。原创 2022-12-26 16:24:24 · 683 阅读 · 2 评论 -
tomcat 如何启动的 spring-ioc 容器
本文中我们不关注 tomcat 的机制,只需要知道在这个 xml 中,给 tomcat 指定了上下文加载路径: WEB-INF/web.xml。一个比较常见的 web.xml 配置,可以看到配置了一个 listener 实现 ContextLoaderListener。ServletContextListener 来自于 javax.servlet 包,是 tomcat 与 spring 的衔接接口,可以监听 tomcat servletContext 相关事件,拥有操作 servlet 上下文的能力。原创 2022-12-02 16:26:22 · 604 阅读 · 0 评论 -
Class.forName() 与 ClassLoader.loadClass() 的区别
Class.forName() 的方式加载类时,默认会执行类的初始化。ClassLoader.loadClass() 的方式加载类时,类不会被初始化,只有显式调用加载的类时才会进行初始化。采用 ClassLoader 进行懒加载,不会调用类的 static 代码块,实现延迟加载。原创 2022-10-28 23:09:11 · 622 阅读 · 0 评论 -
mysql 与 es 数据同步常见方案
这种方式能否实现秒级的数据同步,取决于 mysql 表中的数据量和用来收集数据的 sql 执行时间。当然能否真正做到秒级的数据同步,除了 sql 以外,其他环节(比如整理数据格式,传输至 es)的耗时也要考虑。优点:这种方式的好处是代码侵入性低,不需要在之前写 mysql 的地方加写 es 的代码。缺点:这种方式代码侵入性强,要在之前写 mysql 的地方加写 es 的代码。如果每秒调度一次 logstash 的脚本,就可以每秒执行一次 sql 收集 mysql 表中的数据,然后灌入 es。原创 2022-10-28 22:59:55 · 5551 阅读 · 0 评论 -
redis 的渐进式 rehash,为什么 java 不采用渐进式 rehash
渐进式 rehash 只适合用在作为共享变量的哈希表中,且多次方法调用(特别是多次请求)都会去操作这个共享变量。这样才能发挥其 rehash 耗时每次调用均分的优势。比如 redis 的 dict 就是很好的例子。原创 2022-10-28 22:49:33 · 390 阅读 · 0 评论 -
JVM safe point 安全点和 counted loop 可数循环
图中主线程在进入 safe point 后,发现 STW 标志位为 true(为什么 STW 标志位为 true 后面再分析),阻塞在安全点,需要等待一次 GC 执行后才能离开安全点。而且由于 counted loop 花费的时间更长了,导致主线程要在安全点等更久,其他线程才能完成 counted loop,进入安全点。Thread.sleep() 方法是一个 native 方法,在从 native 方法返回后,JVM 会在当前线程设置一个安全点,让线程进入这个安全点。原创 2022-10-28 22:48:00 · 1014 阅读 · 0 评论 -
设计模式--builder 模式
拥有一个负责组装的方法 void construct(Builder builder),在这个方法中通过组织并调用 builder 的方法,可以设置 builder。设置完成后,通过 builder 的构建方法 getProduct() 获得最终的产品。定义了构建 Product 的构建用抽象方法,其 Builder 实现类需要实现这些构建用方法。ConcreteBuilder: Builder 的实现类,实现 Builder 的抽象方法,编写此种 Builder 实现的方法。原创 2022-10-28 22:42:41 · 801 阅读 · 0 评论 -
适配器模式
适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。自己的理解,使用一个类 A 去实现接口 B,这样可以做到让类 A 兼容接口 B。原创 2022-10-28 22:40:33 · 104 阅读 · 0 评论 -
ConfigurableBeanFactory 源码分析
可配置的 BeanFactory,声明了对 BeanFactory 各种各样的配置能力,如 bean 的作用域,bean 的 classLoader,bean 的元数据缓存,bean 的表达式解析器,类型转换器,属性编辑器等。实现此接口即拥有对 BeanFactory 的配置能力。原创 2022-10-28 22:38:29 · 311 阅读 · 0 评论 -
无状态编程, lambda 表达式中传入的局部变量,为什么需要是不可变的(final)
本文将会根据以下顺序进行叙述:lambda 表达式中传入的局部变量,为什么需要是不可变的(final)?函数式编程提倡的无状态。无状态服务。原创 2022-10-28 22:36:12 · 1150 阅读 · 0 评论 -
guava cache 源码分析 -- 缓存机制
这样性能会有一些损耗,可预见的,频繁的过期和加载,阻塞等待过程会让性能有较大的损耗。默认的 CacheLoader#reload 方法会同步调用我们重写的 CacheLoader#load,所以如果我们传入的 CacheLoader 未重写 reload 方法,默认实现是同步加载。请注意,这里同步还是异步加载,主要看传入的 CacheLoader 实现类是否重写了 reload 方法。请注意,这里同步还是异步加载,主要看传入的 CacheLoader 实现类是否重写了 reload 方法。原创 2022-10-24 23:39:39 · 695 阅读 · 0 评论 -
guava cache 源码分析 -- builder 模式
guava cache 的 builder 模式,Product 类有两个,一个是 LocalCache,一个是 LocalLoadingCache。可以认为 build 出来的是对外暴露的 Product 类–LocalLoadingCache,LocalLoadingCache 使用了内部的 Product 类 LocalCache。stats 方法,返回此 cache 的累积统计信息的当前快照。asMap 方法,返回一个线程安全的 map,此 map 是 cache 的视图。原创 2022-10-24 23:38:43 · 399 阅读 · 0 评论 -
apache.commons.lang3 中的 Pair 源码分析
Pair 用于存储左右元素对,Pair。主要有两个子类,ImmutablePair 和 MutablePair。原创 2022-10-24 23:36:46 · 1065 阅读 · 0 评论 -
dubbo ExtensionLoader 源码分析
主要是一些缓存 ConcurrentMap,ExtensionLoader 和 extension 创建时的部分线程安全,借助于 ConcurrentMap 的原子化 api 保证。使用 holder 用于持有目标 extension 实例,并在 extension 实例缓存中根据 name 获取。具体地说,指定的 instance 属性如果有 extension,此方法将会给这些属性注入 extension。获取 extension,如果 extension 不存在,会进行创建。原创 2022-10-24 23:34:29 · 212 阅读 · 0 评论 -
java SPI 机制与 dubbo 对 SPI 机制的扩展
SPI,全称为 Service Provider Interface,是一种服务发现机制,在 classpath 路径下的 META-INF/service 路径查找以接口的全限定名命名的文件,文件内容是接口实现类的全限定名,自动加载实现类。简单来说是一种动态替换发现机制,接口运行时才发现具体的实现类,只需要在运行前添加一个实现即可,并且将实现描述给 jdk 即可,这里的描述便是上面提到的 META-INF/service 下的配置。也可以随时对该描述进行修改,完成具体实现的替换。原创 2022-10-24 23:31:28 · 175 阅读 · 0 评论 -
FactoryBeanRegistrySupport 源码分析
FactoryBeanRegistrySupport 在 DefaultSingletonBeanRegistry 基础上,增加了对 FactoryBean 的支持。原创 2022-10-24 23:19:17 · 305 阅读 · 0 评论 -
HierarchicalBeanFactory 源码分析
HierarchicalBeanFactory 提供父子容器的层次关系查找能力。至于父容器的设置,需要使用 ConfigurableBeanFactory#setParentBeanFactory由此可看出,spring 的接口设计,把容器的设置和获取给拆开了。原创 2022-10-24 23:18:18 · 194 阅读 · 0 评论 -
SingletonBeanRegistry 源码分析
单例(singleton),是我们使用 Spring IOC 容器时的 bean 实例作用域(scope)。对于单例的维护与管理,Spring 抽象出了 SingletonBeanRegistry 接口来维护。原创 2022-10-24 23:16:58 · 158 阅读 · 0 评论 -
SimpleAliasRegistry 源码分析
SimpleAliasRegistry 是 AliasRegistry 的一个简单实现,实现了管理别名的一些方法。主要作用是将 别名->名字 映射关系存到内存中,提供查找和校验的接口。原创 2022-10-23 16:31:02 · 242 阅读 · 0 评论 -
DefaultSingletonBeanRegistry 源码分析
DefaultSingletonBeanRegistry 保证线程安全的写法比较简单粗暴,只要想保证线程安全,就给一级缓存加锁,synchronized (this.singletonObjects) {},即 full singleton lock。如果一级缓存和二级缓存中没有存在的实例,那就看看三级缓存中有没有构造函数。各级缓存中都根据 beanName 移除对应的 singleton,这里为了保证各级缓存 remove 的原子性,外面对一级缓存加了一个 synchronized 锁。原创 2022-10-23 16:30:24 · 324 阅读 · 0 评论 -
BeanFactory 源码分析
spring 源码中,以 xxFactory 结尾,表示它是一个工厂(接口), 是负责生产和管理 bean 的一个工厂。在Spring中,BeanFactory 是各工厂的顶层接口,也是 IOC 容器的核心接口。BeanFactory 中声明了管理 Bean 的通用方法,如 getBean 和 containsBean 等。BeanFactory 的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。原创 2022-10-23 16:29:01 · 248 阅读 · 0 评论 -
BeanDefinition 及其构造方式 BeanDefinitionBuilder, AbstractBeanDefinition
BeanDefinition 是个接口,AbstractBeanDefinition 是这个接口的实现类,很多常见的 bean 属性在 AbstractBeanDefinition 中。这是经典的工厂模式,抽象出接口去规范工厂生产的实体类的行为。另外 GenericBeanDefinition 只是子类实现,大部分的属性在 AbstractBeanDefinition 中。/*** bean 对应的 class(用一个 Class 对象来表示)/*** bean 的作用范围。原创 2022-10-23 16:27:57 · 2655 阅读 · 0 评论 -
AliasRegistry 源码分析
本文基于 jdk 8, spring-framework 5.2.x 编写。@author/LICENSEGPL-2.0AliasRegistry 声明了管理别名的一些方法,我们先来看一下什么是别名。别名 -> 本名,一个本名可以对应多个别名,如成龙有别名元楼、陈元龙,那么映射关系就是元楼 -> 成龙陈元龙 -> 成龙。原创 2022-10-23 16:25:30 · 108 阅读 · 0 评论 -
LinkedBlockingQueue 源码分析
offer 方法呈现的效果: offer(E e): 表示如果可能的话,将 e 添加到 BlockingQueue 里,即如果 BlockingQueue 可以容纳,则返回 true,否则返回 false。本方法不阻塞当前执行方法。原创 2022-10-23 16:23:45 · 558 阅读 · 0 评论