- 博客(79)
- 资源 (1)
- 问答 (2)
- 收藏
- 关注
原创 Netty的再次认知 | 多图理解Netty的线程模型
Netty是由JBOSS提供的一个Java开源框架。Netty提供异步的,基于事件驱动的网络应用程序框架,用以快速开发高性能,高可靠性的网络IO程序;Netty可以帮助你快速,简单的开发出一个网络应用,相当于简化和流程化了NIO的开发过程;Netty是目前最流行的NIO框架,Netty在互联网领域,大数据分布式计算领域,游戏或行业等;Elasticsearch,Dubbo框架内部都采用了Netty;
2022-10-19 20:44:08 950 8
原创 java_计算内存对象大小
现在公司的代码评审越来越严格,技术方案评审上经常会问到对象设计的合理性,对于常驻内存的对象,我们应在设计时考虑到对象占用的内存空间,保证JVM运行时不会频繁GC,确保系统的稳定性和可靠性。.........
2022-07-26 17:55:53 850 5
原创 GIN框架应用级介绍
官方文档:https://github.com/gin-gonic/gin安装go get -u github.com/gin-gonic/gin使用import "github.com/gin-gonic/gin"import "net/http" // 使用http包时使用 快速开始监听8080端口,对于/请求返回结构体{“message”:“hello”}func main() { r := gin.Default() r.GET("/", func(c *gin.Contex
2022-05-04 09:39:50 818 2
原创 K8s知识点整理|Pod的全面总结
Pod剖析文章目录Pod剖析1. 概述1.1 描述1.2 管理1.3 支持类型2. 共享资源2.1 网络2.2 存储3. Init容器3.1 概念3.2 与应用容器的区别3.3 作用4. 生命周期5. 容器探针6. 重启策略7. 钩子函数8. Pod预设PresetQ&A为什么不在一个容器内直接运行多个应用程序?两种探针如何选择?1. 概述Pod 是 kubernetes 中你可以创建和部署的最小也是最简的单位。Pod 代表着集群中运行的进程。 Pod 中封装着应用的容器(有的情况下是好几个容
2022-01-07 09:13:33 1289 2
原创 K8s架构|全面整理K8s的架构介绍
K8S架构与核心技术介绍参考文献:https://jimmysong.io/kubernetes-handbook/concepts/concepts.htmlhttps://www.infoq.cn/article/kubernetes-and-cloud-native-applications-part01/文章目录K8S架构与核心技术介绍1. 架构图1.1 整体结构图1.2 组件间的协议1.3 master与node架构图1.4 分层架构图2. K8s核心技术概念2.1 API对象2.2
2021-12-26 16:54:45 23887 12
原创 Tomcat源码剖析|原来一次请求的背后竟是一条完整的责任链
Tomcat源码剖析——处理请求本文解析源码来自于Tomcat8.5.33本文引用参考文献为《Tomcat架构解析-刘光瑞》注:此文为连载文章最后一篇,可以参考前序文章《类加载器》《初始化》《启动》文章目录Tomcat源码剖析——处理请求前言源码剖析流程图代码分析1. Http11Processor.process()2. CoyoteAdapter.server()3. CoyoteAdapter.postParseRequest()4. StandardEngineValve.invok
2021-12-10 09:25:44 584 23
原创 Tomcat源码剖析|多图分析Tomcat启动时的start流程(含容器内应用启动流程)
Tomcat源码剖析——启动本文解析源码来自于Tomcat8.5.33本文引用参考文献为《Tomcat架构解析-刘光瑞》注:此文为连载文章,可以参考前序文章《类加载器》《初始化》,以及后续文章《处理请求》文章目录Tomcat源码剖析——启动前言源码分析流程图代码分析1. Bootstrap.main()2. Catalina.start()3. StandardServer#LifecycleBase.start()4. StandardServer.startInternal()5. St
2021-12-01 09:49:52 3459 34
原创 Tomcat源码剖析|多图分析Tomcat启动时的初始化流程
Tomcat源码剖析——初始化本文解析源码来自于Tomcat8.5.33本文引用参考文献为《Tomcat架构解析-刘光瑞》注:此文为连载文章,可以参考前序文章《类加载器》,以及后续文章《启动》文章目录Tomcat源码剖析——初始化组件介绍LifecycleServerServiceContainerEngineHostContextWrapperExecutor源码分析流程图代码剖析Bootstrap静态代码块1. Bootstrap.main()2. Bootstrap.init()3.Bo
2021-11-18 09:17:49 2986 30
原创 撸猫日记|源码剖析Tomcat的类加载器到底有何不同?
Tomcat源码剖析——类加载器本文解析源码来自于Tomcat8.5.33本文引用参考文献为《深入理解JVM虚拟机-周志明》、《Tomcat架构解析-刘光瑞》注:此文为连载文章,后续将更新文章《初始化》文章目录Tomcat源码剖析——类加载器概念JVM类加载机制双亲委派模型Tomcat类加载机制特性Tomcat的类加载器模型Tomcat类加载器源码流程图1. Bootstrap.init()2. Bootstrap.initClassLoaders()3. Bootstrap.createCl
2021-11-11 09:18:53 3263 13
原创 Spring源码|解析深入Spring源码多图剖析@Configuration背后的BeanFactory后置处理器实现逻辑
揭秘@Configuration的秘密之BeanFactory后置处理器前序文章 Spring如何扫描工作目录下的Bean?|图文并茂讲解@Configuration的工作原理文章目录揭秘@Configuration的秘密之BeanFactory后置处理器基础介绍目的流程图代码分析(1) postProcessBeanFactory()(2)enhanceConfigurationClasses()(3)ConfigurationClassEnhancer.enhance()(4)Configura
2021-11-05 09:31:39 4456 47
原创 Spring如何扫描工作目录下的Bean?|图文并茂讲解@Configuration的工作原理
揭秘@Configuration的秘密(一)文章目录揭秘@Configuration的秘密(一)基础介绍流程图整体流程目前为止的bd类型代码分析(1) processConfigBeanDefinitions(registry)(2) checkConfigurationClassCandidate()(3) ConfigurationClassParser.parse()(4) processConfigurationClass()(5) doProcessConfigurationClass()(6)
2021-10-27 13:50:02 5545 47
原创 Leetcode刷题笔记|最长回文子串
c题目给你一个字符串 s,找到 s 中最长的回文子串。输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。输入:s = "cbbd"输出:"bb"输入:s = "abcedcbaeee"输出:"eee"输入:s = "ac"输出:"a"输入:s = "a"输出:"a"解题思路个人思路本题采用动态规划去解决;若字符串长度小于2,则本身就是回文串,直接返回;设计动态规划,dp[i][j]=true;表示字符串从i位置到j位置.
2021-10-24 22:52:18 4054 1
原创 Spring的后置处理器这么厉害?让流程图告诉你Spring启动时的后置处理器工作流程
探究Spring的后置处理器文章目录探究Spring的后置处理器流程图prepareRefresh剖析obtainFreshBeanFactory刨析prepareBeanFactory刨析invokeBeanFactoryPostProcessors剖析本次我们主要探究invokeBeanFactoryPostProcessors();后面的代码下次再做解析;入口代码refresh()AnnotationConfigApplicationContext applicationContext = n
2021-10-21 09:35:28 5624 35
原创 【惊】Spring源码的秘密|一起看看Spring启动时究竟做了什么惊天动地的事情?
初识Spring文章目录初识Spring入口代码大致流程代码分析[1]AnnotationConfigApplicationContext剖析[2]AnnotatedBeanDefinitionReader 剖析registerAnnotationConfigProcessors 方法[3]ClassPathBeanDefinitionScanner剖析registerDefaultFilters剖析入口代码在启动Spring的时候,我们是编写如下的代码;本文我们分析的是创建AnnotationCon
2021-10-14 09:22:29 4487 23
原创 多图剖析|Spring的循环依赖竟如此复杂
Spring的循环依赖文章目录Spring的循环依赖spring4和5的AOP区别什么是循环依赖Spring容器Spring的三级缓存Spring循环依赖Bean注入IOC全流程1. 创建CircleRefA2. 创建CircleRefB3. CircleRefB获取CircleRefA对象4. CircleRefB注入CircleRefA对象5. CircleRefA注入CircleRefB被AOP代理类循环依赖的全过程情况1:先扫描被代理类情况2:后扫描被代理类Spring Bean无代理是加入IOC
2021-10-07 17:31:00 4646 24
原创 【MQ】4万字保姆教程|RabbitMQ知识点整理与Springboot整合【附】Demo(图文并茂)
文章参考导读【4万字保姆级教程】本文详细的从应用层面上讲解了RabbitMQ的使用以及整合Springboot;对于其概念进行讲解,提供了可以完成日常开发的接口与demo;文章目录导读工作队列1. work Queues轮询分发消息2. 消息应答概念自动应答手动应答消息自动重新入队3. RabbitMQ持久化设置队列持久化设置消息持久化不公平分发预取值4. 发布确认单个确认发布批量确认发布异步确认发布以上三种发布确认对比交换机概念临时队列绑定(bindings)类型无名交换机Fanout exchan
2021-09-28 09:30:10 6030 37
原创 JAVA面试题|JVM剖析与常用的调优总结
JAVA基础篇面试题文章目录JAVA基础篇面试题1. 什么是GC Roots2. JVM调优和参数配置3. 常用的JVM调优参数4. 分析GC日志5. 四种引用强引用软引用弱引用虚引用6. 常见的JVM异常/错误1. 什么是GC RootsGC Roots是一组活跃的引用;常用于判断对象是否被回收的可达性分析法中;可达性分析:通过一系列称为GC Roots的跟对象作为起始节点集,从这些结点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”,如果某个对象到根节点间没有任何引用链相连,则证明
2021-09-24 09:31:54 4917 25
原创 JAVA面试题|垃圾收集器题目汇总
JAVA基础篇面试题文章目录JAVA基础篇面试题1. 简述四种垃圾回收器串行垃圾回收器(serial)并行垃圾回收器(Parallel)并发垃圾回收器(CMS)G1垃圾回收器2. 配置JVM的垃圾回收器3. 垃圾收集器对应收集区域4. JVM的Client和Server模式是什么5. 垃圾收集器的详细总结Serial收集器ParNew收集器Parallel Scavenge收集器Parallel Old收集器CMS收集器Serial Old收集器G1收集器6. 如何选择垃圾收集器7. github奇门遁
2021-09-14 09:05:12 5692 27
原创 JAVA面试题|线程池相关题目
JAVA基础篇面试题文章目录JAVA基础篇面试题1. Callable接口详解2. 介绍下线程池3. 常见的3种线程池4. 线程池的拒绝策略5. 线程池的配置6. 死锁的概念与产生死锁的主要原因7. 死锁产生的必要条件与解决死锁的方法8. 死锁检测方法1. Callable接口详解作用:Callable接口详解优势:可以获得任务执行返回值;通过与Future的结合,可以实现利用Future来跟踪异步计算的结果。Runnable与Callable的区别Callable规定的方法是call
2021-09-06 10:54:16 5808 11
原创 JAVA面试题|AQS详细剖析
JAVA基础篇面试题文章目录JAVA基础篇面试题1. 线程等待唤醒的实现方法2. 介绍一下LockSupport3. AQS是什么4. AQS的核心原理5. 公平锁与非公平锁的区别6. 请讲述非公平锁加锁解锁的具体流程1. 线程等待唤醒的实现方法Object对象中的wait()方法可以让线程等待,使用Object中的notify()方法唤醒线程;必须都在同步代码块内使用;调用wait,notify的对象是加锁对象;notify必须在wait后执行才能唤醒;wait后能释放锁对象,线程处
2021-09-01 15:26:36 13826 16
原创 JAVA面试题|JAVA锁相关面试题总结(一)
JAVA基础篇面试题文章目录JAVA基础篇面试题1. 什么是JMM2. 介绍一下violated3. 写一个单例模式4. 介绍一下CAS5. CAS的问题6. ArrayList线程不安全的替换方案7. 什么是公平锁8. 什么是可重入锁9. 什么是自旋锁10. 什么是独占/共享/互斥锁11. CountDownLatch,CyclicBarrier,Semaphore12. 什么是阻塞队列1. 什么是JMMJMM(Java Memory Model)本身是一种抽象的概念并不真实存在,它描述的是一组规
2021-08-23 19:39:55 6930 5
原创 【Shell】万字总结建议收藏|2021面试与工作中最常用的Shell语法命令汇总
常用的Shell命令与语法大全将持续更新!!!!文章目录常用的Shell命令与语法大全自定义变量特殊变量运算符读取输入流暂停等待:分割字符串:循环数值文件比较符号常见的命令脚本正则表达式列出当前路径下的目录匹配上的行数只查看第3行内容$() $(()) $[] ${}文本文件的交集与差集打印文件比较结果交集打印不同a的差集b的差集查看系统相关命令(jvm调优)top命令uptime命令vmstat命令mpstat命令pidstat命令free命令df命令iostat命令pgrep命令cat命令-查看cu
2021-08-16 09:40:31 5965 19
原创 UI自动化 Appium常用的方法汇总(java版)
Appium文章目录Appium常用接口定位一个元素定位一组元素等待对比元素操作滑动与拖拽事件高级手势TouchAction轻敲按下和抬起长按获取手机分辨率截图获取&设置手机网络按键操作通知栏常用接口定位一个元素通过id定位driver.find_element_by_id()通过classNamedriver.find_element_class_name()通过xpathdriver.find_element_by_xpath()定位一组元素通过i
2021-08-09 15:50:04 7241 6
原创 UI自动化 Selenium常用的方法汇总(java版)
Selenium常用接口关闭当前窗口driver.close()关闭所有窗口并退出driver.quit()打开网页driver.get(“url”)driver.navigate().to(“url”)浏览器后退driver.navigate().back();浏览器前进driver.navigate().forward();浏览器刷新driver.navigate().refresh();浏览器最大化driver.manage().window(
2021-08-02 15:29:59 7308 4
原创 JVM篇·线程安全与优化
线程安全与优化本文为《深入理解Java虚拟机_JVM高级特性与最佳实践·周志明》学习笔记文章目录线程安全与优化线程安全共享数据分类1. 不可变2. 绝对线程安全3. 相对线程安全4. 线程兼容5. 线程对立线程安全的实现方法1. 互斥同步2. 非阻塞同步3. 无同步方案可重入代码:线程本地存储:线程安全概念:当多个线程同时访问一个对象时,设计者和调用者不考虑这些线程在运行环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那
2021-07-27 19:40:47 6851 3
原创 JVM篇·JVM内存模型与线程
Java内存模型与线程本文为《深入理解Java虚拟机_JVM高级特性与最佳实践·周志明》学习笔记背景知识TPS(每秒事务处理数):代表着1s内服务端平均处理响应的请求总数。在相同的任务下,TPS越高,代表程序线程并发协调有条不紊,效率高;TPS越小,线程之间频繁征用数据,互相阻塞以及死锁,降低并发能力;高速缓存:内存与处理器的桥梁,解决了之间读写速度不一致的问题,同时需要保证缓存一致性(遵守相关协议解决:MSI,MESI,MOSI等)。共享内存多核系统:多路处理器系统每个处理器都有自己的高速
2021-07-19 20:30:35 6898 4
原创 JVM篇·虚拟机字节码执行引擎
虚拟机字节码执行引擎本文为《深入理解Java虚拟机_JVM高级特性与最佳实践·周志明》学习笔记文章目录虚拟机字节码执行引擎运行时栈帧结构局部变量表操作数栈动态连接方法返回地址附加信息方法调用解析5条方法调用字节码非虚方法分派静态分派重载重写场景重载优先级动态分配invokevirtual执行分派步骤单分派&多分派虚拟机对动态分派的实现动态类型语言支持动态类型语言Java的动态类型支持原理反射与MethodHandle对比基于栈的字节码解释执行引擎解释执行基于栈/寄存器的指令集对比运行时栈帧
2021-07-14 09:46:18 6513 5
原创 手动实现自定义类加载器实现热加载
目标实现一个简单的热部署编译功能;流程首先将字节码中的System类重定向到自定义IO流中,由于Sytem.out是类方法,因此我们可以修改class文件中的常量池,将System类符号修改成自定义IO流符号,实现重定向;再通过自定义类加载器,实现每次代码热更时的加载;具体过程自定义类加载器避免类冲突public class MyTestClassLoader extends ClassLoader{ public MyTestClassLoader() { s
2021-07-05 11:18:07 6764 4
原创 JVM篇·关于虚拟机类加载的机制整理
虚拟机类加载机制本文为《深入理解Java虚拟机_第三版 周志明》学习笔记文章目录虚拟机类加载机制类加载时机触发初始化阶段的6种情况:被动引用接口的初始化类加载过程加载验证文件格式验证元数据验证字节码验证符号引用验证准备解析类或接口的解析字段解析方法解析接口方法解析初始化类加载器双亲委派模型启动类加载器扩展类加载器应用程序类加载器类加载机制:JVM把描述类的数据从Class文件加载到内存并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。类加载时机生命周期7阶段:加载
2021-06-30 14:10:26 6897 8
原创 JVM篇·Class文件结构剖析
类文件结构本文为《深入理解Java虚拟机_第三版 周志明》学习笔记Class类文件的结构概念任何一个Class文件都对应着唯一的一个类或接口的定义信息。class文件是一组以8个byte为基础的二进制流,存储的内容几乎全部是程序运行的必要数据。只包含俩种数据类型:“无符号数”和“表”。class文件中不会保存各个方法,字段最终在内存中的布局信息,这些字段,方法的符号引用不经过虚拟机在运行期间转换的话是无法得到真正的内存入口地址。魔术与Class文件的版本每个class文件的前4个字节放的
2021-06-21 20:51:14 6475 5
原创 JVM篇·垃圾收集器与内存分配策略
Java堆内存的整理方法本文为《深入理解Java虚拟机_第三版 周志明》学习笔记引用计数法概念:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一,当引用失效时,计数值就减一;任何时刻计数器为零的对象就是不可能再被使用的。但当遇到循环引用时就无法正确处理;强引用:引用赋值,只要强引用关系存在,垃圾收集器就永远不会回收掉引用对象。软引用:SoftReference有用但非必须的对象。只要存在着关系,在发生内存溢出异常前,会把这些对象列入回收范围之中进行二次回收,如果回收没有足够
2021-06-17 13:48:34 6510 3
原创 JVM篇·JAVA内存区域与内存泄漏相关剖析
JAVA虚拟机运行时数据区分析本文为《深入理解Java虚拟机_第三版 周志明》学习笔记目录JAVA虚拟机运行时数据区分析程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存元空间HotSpot虚拟机对象分析对象的创建对象头的模型普通对象(32位)数组对象(32位)Mark Word结构(32位)Mark Word结构(64位)对象的访问定位图片来源程序计数器线程私有较小的内存空间,当前线程所执行的字节码的指示器。每条线程都拥有独立的程序计数器,保证线程之间互不影响。
2021-06-07 17:09:02 6720 4
原创 TestNG源码解析4 单个用例(Method级)并发下的执行流程
TestNG源码解析4 单个用例(Method级)并发下的执行流程本文介绍@Test(threadPoolSize = 3, invocationCount=10)单个测试用例并发下的执行流程,他和非并发的用例执行类似,前12个方法均一样,从第13个方法开始进行单用例并发逻辑。首先将XmlSuite交给SuiteRunnerWorker去执行测试用例,而该woker是调用suiteRunner.run()方法【5】,然后触发ISuiteListener监听器【6】,进而在触发所有用例的@Before
2021-04-16 16:37:06 6879 2
原创 TestNG源码解析3 非并发下的执行流程
TestNG源码解析3 非并发下的执行流程本文介绍非并发下的执行流程,首先将XmlSuite交给SuiteRunnerWorker去执行测试用例,而该woker是调用suiteRunner.run()方法【5】,然后触发ISuiteListener监听器【6】,进而在触发所有用例的@BeforeSuite以及结束后的@AfterSuite方法【7】,在SuiteRunner中循环调用TestRunner的run方法【8】,将对应的XmlTest所有的测试用例转换为graph节点,然后对每个节点交给对应的
2021-04-06 10:50:38 6522 3
原创 TestNG源码解析2——测试用例实例化过程
TestNG源码解析2——测试用例实例化过程本文介绍执行用例前如何将XmlSuite实例化测试类的过程<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"><suite name="SuiteA"> <!--XmlSuite--> <listeners> <listener class
2021-03-29 13:58:44 6894 7
原创 TestNG源码解析1——内置的监听器介绍
TestNG源码解析1——监听器介绍本文介绍本文主要分析TestNG的监听器类型监听器IExecutionVisualiserpublic interface IExecutionVisualiser extends ITestNGListener { void consumeDotDefinition(String dotDefinition);}是以图节点String输出 DOTISuiteListenerpublic interface ISuiteListene
2021-03-24 20:31:51 6557 2
原创 java|深度详细剖析锁的底层实现原理
java锁的剖析无锁状态,偏向锁状态,轻量级锁状态,重量级锁状态内存中的java对象(HotSpot虚拟机) 在32位系统下,存放Class指针的空间大小是4字节,MarkWord是4字节,对象头为8字节。 在64位系统下,存放Class指针的空间大小是8字节,MarkWord是8字节,对象头为16字节。 在64位开启指针压缩的情况下 -XX:+UseCompressedOops,存放Class指针的空间大小是4字节,MarkWord是8字节,对象头为12字节。
2020-10-29 23:12:02 7179 1
原创 Spring源码剖析(三) [新]Mybatis-Spring最全最详细的调用和执行过程解析
前言: 本文将重点讲解Mybatis-spring的执行过程,对比mybatis和Mybatis-spring的流程差异,以及Mybatis-spring一级缓存失效的原因(文章方法15),和spring自动注入的原理和哪些属性不会自动装配的讲解。解析mybatis-spring源码文章目录解析mybatis-spring源码启动流程执行过程对象的自动装配启动流程Mybatis配置类中的MapperScan@Configuration@EnableTransactionManagement
2020-10-25 15:14:19 5013 1
原创 Spring源码剖析(二) invokeBeanFactoryPostProcessors的逻辑
分析 invokeBeanFactoryPostProcessorsPostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors第一步处理 BeanDefinitionRegistryPostProcessor处理自定义的RegistryPostProcessor处理加了PriorityOrdered的Spring内部的RegistryPostProcessor处理加了Ordered的Spring内部的Registry
2020-10-15 19:11:42 4830 2
istio目标规则和service的关系是什么?
2022-03-23
istio配置tls认证的时候,这几个证书怎么配置?
2022-03-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人