阅读本文大概需要 6 分钟。

转载自:https://juejin.im/post/5d214639e51d4550bf1ae8df

1.Spring 的生命周期

Spring 作为当前 Java 最流行、最强大的轻量级容器框架,了解熟悉 spring 的生命周期非常有必要;

  • 首先容器启动后,对 bean 进行初始化

  • 按照 bean 的定义,注入属性

  • 检测该对象是否实现了 xxxAware 接口,并将相关的 xxxAware 实例注入给 bean,如 BeanNameAware 等

  • 以上步骤,bean 对象已正确构造,通过实现 BeanPostProcessor 接口,可以再进行一些自定义方法处理。如:postProcessBeforeInitialzation。

  • BeanPostProcessor 的前置处理完成后,可以实现 postConstruct,afterPropertiesSet,init-method 等方法, 增加我们自定义的逻辑,

  • 通过实现 BeanPostProcessor 接口,进行 postProcessAfterInitialzation 后置处理

  • 接着 Bean 准备好被使用啦。

  • 容器关闭后,如果 Bean 实现了 DisposableBean 接口,则会回调该接口的 destroy() 方法

  • 通过给 destroy-method 指定函数,就可以在 bean 销毁前执行指定的逻

2.TCP 三次握手,四次挥手

tcp 的三次握手四次挥手是每个程序员都应该熟悉的。

三次握手:

  • 第一次握手(SYN=1, seq=x),发送完毕后,客户端进入 SYN_SEND 状态

  • 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1), 发送完毕后,服务器端进入 SYN_RCVD 状态。

  • 第三次握手(ACK=1,ACKnum=y+1),发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手,即可以开始数据传输。

四次挥手:

  • 第一次挥手(FIN=1,seq=a),发送完毕后,客户端进入 FIN_WAIT_1 状态

  • 第二次挥手(ACK=1,ACKnum=a+1),发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态

  • 第三次挥手(FIN=1,seq=b),发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。

  • 第四次挥手(ACK=1,ACKnum=b+1),客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

3.线程池执行流程图

线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。

而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,这避免了在处理短时间任务时创建与销毁线程的代价。线程池执行流程是每个开发必备的。

执行流程

  • 提交一个任务,线程池里存活的核心线程数小于线程数 corePoolSize 时,线程池会创建一个核心线程去处理提交的任务。

  • 如果线程池核心线程数已满,即线程数已经等于 corePoolSize,一个新提交的任务,会被放进任务队列 workQueue 排队等待执行。

  • 当线程池里面存活的线程数已经等于 corePoolSize 了,并且任务队列 workQueue 也满,判断线程数是否达到 maximumPoolSize,即最大线程数是否已满,如果没到达,创建一个非核心线程执行提交的任务。

  • 如果当前的线程数达到了 maximumPoolSize,还有新的任务过来的话,直接采用拒绝策略处理。

JDK 提供了四种拒绝策略处理类

  • AbortPolicy (抛出一个异常,默认的)

  • DiscardPolicy (直接丢弃任务)

  • DiscardOldestPolicy(丢弃队列里最老的任务,将当前这个任务继续提交给线程池)

  • CallerRunsPolicy(交给线程池调用所在的线程进行处理

4.JVM 内存结构

JVM 内存结构是 Java 程序员必须掌握的基础。程序计数器(PC 寄存器)

程序计数器是一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。

在虚拟机的模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、异常处理、线程恢复等基础功能都需要依赖计数器完成。

Java 虚拟机栈

  • 与程序计数器一样,Java 虚拟机栈也是线程私有的,它的生命周期与线程相同

  • 每个方法被执行的时候都会创建一个"栈帧",用于存储局部变量表(包括参数)、操作数栈、动态链接、方法出口等信息。每个方法被调用到执行完的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

  • 局部变量表存放各种基本数据类型 boolean、byte、char、short 等

本地方法栈

与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的 java 方法服务,而本地方法栈则是为 Native 方法服务。

Java 堆

  • GC 堆是 java 虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,在 JVM 启动时创建。

  • 其大小通过 -Xms (最小值)和 -Xmx (最大值)参数设置,-Xms 为 JVM 启动时申请的最小内存,-Xmx 为 JVM 可申请的最大内存。

  • 由于现在收集器都是采用分代收集算法,堆被划分为新生代和老年代。新生代由 S0 和 S1 构成,可通过 -Xmn 参数来指定新生代的大小。

  • 所有对象实例以及数组都在堆上分配。

  • Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中。

方法区

  • 也称”永久代” ,它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。可以通过 -XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。

  • 运行时常量池:是方法区的一部分,其中的主要内容来自于 JVM 对 Class 的加载。

  • Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中。

5.Java 内存模型

  • Java 的多线程之间是通过共享内存进行通信的,在通信过程中会存在一系列如可见性、原子性、顺序性等问题,而 JMM 就是围绕着多线程通信以及与其相关的一系列特性而建立的模型。

    JMM 定义了一些语法集,这些语法集映射到Java语言中就是 volatile、synchronized 等关键字。

    有兴趣可以看看我的另外一篇笔记:www.jianshu.com/p/3c1691aed…

  • Java 内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。

    不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。

6.SpringMVC 执行流程图

  • User 向服务器发送 request,前端控制 Servelt DispatcherServlet 捕获;

  • DispatcherServlet 对请求 URL 进行解析,调用 HandlerMapping 获得该Handler 配置的所有相关的对象,最后以 HandlerExecutionChain 对象的形式返回.

  • DispatcherServlet 根据获得的 Handler,选择一个合适的 HandlerAdapter.

  • 提取 Request 中的模型数据,填充 Handler 入参,开始执行 Handler(Controller)

  • Handler 执行完成后,返回一个 ModelAndView 对象到 DispatcherServlet

  • 根据返回的 ModelAndView,选择一个适合的 ViewResolver

  • ViewResolver 结合 Model 和 View,来渲染视图

  • 将渲染结果返回给客户端。

7.JDBC 执行流程

JDBC 执行流程:

  • 连接数据源

  • 为数据库传递查询和更新指令

  • 处理数据库响应并返回的结果

8.spring cloud 组件架构

Spring Cloud 是一个基于 Spring Boot 实现的云原生应用开发工具,它为基于 JVM 的云原生应用开发中涉及的配置管理、服务发现、熔断器、智能路由、微代理、控制总线、分布式会话和集群状态管理等操作提供了一种简单的开发方式。

  • Eureka 负责服务的注册与发现。

  • Hystrix 负责监控服务之间的调用情况,起到熔断,降级作用。

  • Spring Cloud Config 提供了统一的配置中心服务。

  • 所有对外的请求和服务,我们都通过 Zuul 来进行转发,起到 API 网关的作用

  • 最后我们使用 Sleuth+Zipkin 将所有的请求数据记录下来,方便我们进行后续分析。

  • Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具。它是一个基于 HTTP 和 TCP 的客户端负载均衡器。

  • Feign 是一个声明式的 Web Service 客户端,它的目的就是让 Web Service 调用更加简单。

9.dubbo 调用

Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的远程服务调用方案,这容易和负载均衡弄混,负载均衡是对外提供一个公共地址,请求过来时通过轮询、随机等,路由到不同 server。

  • Provider: 暴露服务的服务提供方。

  • Consumer: 调用远程服务的服务消费方。

  • Registry: 服务注册与发现的注册中心。

  • Monitor: 统计服务的调用次调和调用时间的监控中心。

  • Container: 服务运行容器。

·END·

程序员的成长之路

路虽远,行则必至

本文原发于 同名微信公众号「程序员的成长之路」,回复「1024」你懂得,给个赞呗。

回复 [ 520 ] 领取程序员最佳学习方式

回复 [ 256 ] 查看 Java 程序员成长规划

干货收藏 | Java 程序员必备的一些流程图的更多相关文章

  1. Java程序员必备的一些流程图

    Java程序员必备的一些流程图 转自https://juejin.im/post/5d214639e51d4550bf1ae8df 前言: 整理了一些Java基础流程图/架构图,做一下笔记,大家一起学 ...

  2. Java 程序员必备的一些流程图

    1.spring的生命周期 2.TCP三次握手,四次挥手 3.线程池执行流程图 4.JVM内存结构 5.Java内存模型 6.springMVC执行流程图 7.JDBC执行流程 8.spring cl ...

  3. Java程序员必备的 15框开发工具

    15款Java程序员必备的开发工具 如果你是一名Web开发人员,那么用膝盖想也知道你的职业生涯大部分将使用Java而度过.这是一款商业级的编程语言,我们没有办法不接触它. 对于Java,有两种截然不同 ...

  4. Java 程序员必备的 15 个框架,前 3 个地位无可动摇!

    Java 程序员方向太多,且不说移动开发.大数据.区块链.人工智能这些,大部分 Java 程序员都是 Java Web/后端开发.那作为一名 Java Web 开发程序员必须需要熟悉哪些框架呢? 今天 ...

  5. Android java程序员必备技能,集合与数组中遍历元素,增强for循环的使用详解及代码

    Android java程序员必备技能,集合与数组中遍历元素, 增强for循环的使用详解及代码 作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 For ...

  6. Java程序员必备的6款最佳开发工具

    工欲善其事,必先利其器.每一个Java程序员都有其惯用的工具组件.对于Java程序员,各种有用的软件和工具泛滥成灾.初级开发人员要么找不到合适的工具,要么在寻找过程中浪费了大量的时间.下面,我将为大家 ...

  7. Java程序员必备的10个大数据框架!

    作者:java妞妞 blog.csdn.net/javaniuniu/article/details/71250316 当今IT开发人员面对的最大挑战就是复杂性,硬件越来越复杂,OS越来越复杂,编程语 ...

  8. 优秀Java程序员必备10招

    1. 拥有扎实的基础和深刻理解 OO 原则 对于 Java 程序员,深刻理解 ObjectOriented Programming(面向对象编程)这一概念是必须的.没有 OOPS 的坚实基础,就领会不 ...

  9. Java程序员必备:异常的十个关键知识点

    前言 总结了Java异常十个关键知识点,面试或者工作中都有用哦,加油. 一. 异常是什么 异常是指阻止当前方法或作用域继续执行的问题.比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异 ...

随机推荐

  1. 新版GRANAFA K8S插件 K8S NODE 图表不显示问题解决方法

    原文:https://www.wchao.site/archives/granafa-k8s 其他参考:https://blog.csdn.net/bbwangj/article/details/82 ...

  2. 8 Traits of an Experienced Programmer that every beginner programmer should know

    Referrence: http://whats-online.info/guides-and-info/36/Traits-of-Experienced-Programmer-that-every- ...

  3. vue中自定义指令

    //vue中自定义指令 //使用 Vue.directive(id, [definition]) 定义全局的指令 //参数1:指令的名称.注意,在定义的时候,指令的名称前面,不需要加 v-前缀; 但是 ...

  4. 学习笔记之操作系统(Operating System)

    学习笔记之多线程 - 浩然119 - 博客园 https://www.cnblogs.com/pegasus923/p/5554565.html 用三个线程按顺序循环打印ABC三个字母 - 浩然119 ...

  5. python爬虫爬取天气数据并图形化显示

    前言 使用python进行网页数据的爬取现在已经很常见了,而对天气数据的爬取更是入门级的新手操作,很多人学习爬虫都从天气开始,本文便是介绍了从中国天气网爬取天气数据,能够实现输入想要查询的城市,返回该 ...

  6. Maven国内源设置 - OSChina国内源失效了,别更新了

    Maven国内源设置 - OSChina国内源失效了,别更新了 原文:http://blog.csdn.net/chwshuang/article/details/52198932 最近在写一个Spr ...

  7. /bin/false 和 /usr/sbin/nologin

    比较常用的用法: #添加一个不能登录的用户 useradd -d /usr/local/apache -g apache -s /bin/false apache 要拒绝系统用户登录,可以将其shel ...

  8. 【转】STM32利用FATFS读写数组

    因为存为TXT可以实现,但是读取TXT里边的数据总是不尽如人意,所以,最终存为bin文件了. 先摘几个观点: http://www.openedv.com/posts/list/36712.htm “ ...

  9. Springboot 2.1.1.RELEASE 版本 session保存到MySQL里面

    1,pom.xml添加依赖: <!-- 数据库session管理 --> <dependency> <groupId>org.springframework.ses ...

  10. asp.net中的参数传递:Context.Handler 的用法

    网上天天有人问怎么在webform页面之间传值,基本上来说,大家熟悉的是     (1)url字符串传值     (2)session传值     (3)直接读取server.transfer过来的页 ...