Java程序员必备的⼀些流程图(拿⾛不谢)前⾔:
整理了⼀些Java基础流程图/架构图,做⼀下笔记,⼤家⼀起学习。
(想⾃学习编程的⼩伙伴请搜索,更多⾏业相关资讯更有⾏业相关免费视频教程。完全免费哦!)
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的三次握⼿四次挥⼿是每个程序员都应该熟悉的。
java下载过程
三次握⼿:
元件header工作原理第⼀次握⼿(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 状态spring工作流程图
第三次挥⼿(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(抛出⼀个异常,默认的)router和route的区别
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可申请的最⼤内存。
ppt教程由于现在收集器都是采⽤分代收集算法,堆被划分为新⽣代和⽼年代。新⽣代由S0和S1构成,可通过-Xmn参数来指定新⽣代的⼤⼩。
所有对象实例以及数组都在堆上分配。
Class⽂件中除了有类的版本、字段、⽅法、接⼝等描述信息外,还有⼀项信息是常量池,⽤于存放编译器⽣成的各种符号引⽤,这部分内容将在类加载后放到⽅法区的运⾏时常量池中。
⽅法区
也称”永久代” ,它⽤于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制⽅法区的⼤⼩。
运⾏时常量池:是⽅法区的⼀部分,其中的主要内容来⾃于JVM对Class的加载。
Class⽂件中除了有类的版本、字段、⽅法、接⼝等描述信息外,还有⼀项信息是常量池,⽤于存放编译器⽣成的各种符号引⽤,这部分内容将在类加载后放到⽅法区的运⾏时常量池中。
5.Java内存模型
Java的多线程之间是通过共享内存进⾏通信的,在通信过程中会存在⼀系列如可见性、原⼦性、顺序性等问题,⽽JMM就是围绕着多线程通信以及与其相关的⼀系列特性⽽建⽴的模型。JMM定义了⼀些语法集,这些语法集映射到Java语⾔中就是volatile、
synchronized等关键字。
随机抽取器多个在线Java内存模型规定了所有的变量都存储在主内存中,每条线程还有⾃⼰的⼯作内存,线程的⼯作内存中保存了该线程中是⽤到的变量的主内存副本拷贝,线程对变量的所有操作都必须在⼯作内存中进⾏,⽽不能直接读写主内存。不同的线程之间也⽆法直接访问对⽅⼯作内存中的变量,线程间变量的传递均需要⾃⼰的⼯作内存和主存之间进⾏数据同步进⾏。
6.springMVC执⾏流程图
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论