当前位置: 首页 > 科技观察

Java程序员一定要背流程图

时间:2023-03-20 17:14:06 科技观察

1。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),发送后,客户端进入FINWAIT1状态;第二次挥手(ACK=1,ACKnum=a+1),发送后,服务器进入CLOSEWAIT状态,客户端收到确认包后,进入FINWAIT_2状态,第三次挥手(FIN=1,序列=b)。发送后,服务端进入LAST_ACK状态,等待客户端的最后一个ACK。第四次挥手(ACK=1,ACKnum=b+1),客户端收到服务器的关闭请求,发送确认包,进入TIME_WAIT状态,等待固定时间(两个最大报文段生命周期,2MSL,2MaximumSegmentLifetime),没有收到服务器的ACK,认为服务器正常关闭了连接,于是自己关闭了连接,进入了CLOSED状态。服务器收到确认包后,关闭连接,进入CLOSED状态。3.线程池执行流程图线程池:一种线程使用模式。过多的线程会引入调度开销,从而影响缓存位置和整体性能。线程池维护多个线程,等待主管分配可以并发执行的任务,避免了处理短期任务时创建和销毁线程的开销。线程池执行过程是每一次开发都必不可少的。执行过程提交一个任务,当线程池中存活的核心线程数小于corePoolSize时,线程池会创建一个核心线程来处理提交的任务。如果线程池中的核心线程数已满,即线程数已经等于corePoolSize,则新提交的任务会被排队到任务队列workQueue中执行。当线程池存活线程数等于corePoolSize,任务队列workQueue也满了,判断线程数是否达到maximumPoolSize,即最大线程数是否满。如果没有,则创建一个非核心线程来执行提交的任务。如果当前线程数达到maximumPoolSize,并且有新的任务到来,则直接使用拒绝策略。JDK提供了四个拒绝策略处理类AbortPolicy(抛出异常,默认)DiscardPolicy(直接丢弃任务)DiscardOldestPolicy(丢弃队列中最老的任务,继续将当前任务提交给线程池)CallerRunsPolicy(交出thread处理池调用的线程)4.JVM内存结构JVM内存结构是Java程序员必须掌握的基础。ProgramCounter(PCRegister)程序计数器是一块很小的内存空间,可以看作是当前线程执行的字节码的行号指示器。在虚拟机模型中,字节码解释器工作时通过改变计数器的值来选择下一条要执行的字节码指令。分支、循环、异常处理、线程回收等基本功能都需要依赖计数器来完成。.Java虚拟机栈和程序计数器一样。Java虚拟机栈也是线程私有的。它的生命周期与线程相同。每个方法执行时都会创建一个“栈帧”来存放局部变量表(包括参数)、操作数栈、动态链接、方法出口等信息。每个方法从调用到执行的过程对应一个栈帧在虚拟机栈中从入栈到出栈的过程。局部变量表存储了boolean、byte、char、short等各种基本数据类型。局部方法栈与虚拟机栈基本类似,不同的是虚拟机栈服务于虚拟机执行的java方法machine,而本地方法栈是为Native方法Serve准备的。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等关键字。有兴趣的可以看看我的另一篇笔记:https://www.jianshu.com/p/3c1691aed1a5Java内存模型规定所有的变量都存放在主存中,每个线程都有自己的working记忆。线程中使用的变量的主内存副本存储在线程的工作内存中。线程对变量的所有操作都必须在工作内存中进行,不能直接读写主内存。不同的线程不能直接访问对方工作内存中的变量,线程间变量的传递需要自己的工作内存和主存之间进行数据同步。6.SpringMVC执行流程图用户向服务器发送请求,前端控制ServletDispatcherServlet捕获;DispatcherServlet解析请求URL,调用HandlerMapping获取Handler配置的所有相关对象,最后以HandlerExecutionChain对象的形式返回。DispatcherServlet根据得到的Handler,选择合适的HandlerAdapter。提取Request中的模型数据,填写Handler入参,开始执行Handler(Controller)。Handler执行完毕后,返回一个ModelAndView对象给DispatcherServlet。根据返回的ModelAndView,选择合适的ViewResolver。ViewResolver结合Model和View,渲染视图,并将渲染结果返回给客户端。7.JDBC执行流程JDBC执行流程:连接数据源,向数据库传递查询和更新指令,处理数据库响应并返回结果8.springcloud组件架构SpringCloud是一个基于springcloud的云原生应用开发工具弹簧靴。JVM云原生应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、分布式会话、集群状态管理等操作,提供了一种简单的开发方式。Eureka负责服务的注册和发现。Hystrix负责监听服务之间的调用,起到熔断降级的作用。SpringCloudConfig提供统一的配置中心服务。我们通过充当API网关的Zuul转发所有外部请求和服务。最后,我们使用Sleuth+Zipkin记录所有的请求数据,以供我们后续分析。SpringCloudRibbon是一套基于NetflixRibbon的客户端负载均衡工具。它是一个基于HTTP和TCP的客户端负载均衡器。Feign是一个声明式的WebService客户端,它的目的是让WebService调用更简单。9、Dubbo调用Dubbo是一个分布式服务框架,致力于提供高性能透明的远程服务调用解决方案,容易与负载均衡混淆。负载均衡为外界提供了一个公共地址。当一个请求进来的时候,通过轮询,随机等,路由到不同的服务器。Provider:暴露服务的服务提供者。消费者:调用远程服务的服务消费者。注册表:用于服务注册和发现的注册表。Monitor:统计服务调用频率和调用时间的监控中心。容器:服务运行容器。