1、设计模式有哪些原则(待解释的更直白)
- 单一职责原则:一个类或方法应只负责一项职责,避免一个类因为多个变化原因而改变。
- 开闭原则:软件实体应对扩展开放,对修改封闭。比如要增加用户类别的时候可以新增一个类而不是只能去修改。
- 里氏替换原则:子类型必须能够替换掉它们的父类型,而不会对程序造成逻辑错误。
- 依赖倒置原则:高层模块不应依赖于低层模块,两者都应依赖于抽象;抽象不应依赖于细节,细节应依赖于抽象。
- 接口隔离原则:使用多个专门的接口比使用单一的总接口更好。
- 合成/聚合复用原则:尽量使用对象的组合/聚合,而不是继承关系达到复用的目的。
- 迪米特法则(最少知道原则):一个对象应对其他对象有尽可能少的了解。在编程中,这意味着一个类不应该知道太多其他类的细节,只和直接相关的类交互。这样做可以减少系统中的耦合,使得修改一个部分的时候,不会影响到太多其他部分,保持代码的整洁和可维护性
2、spring源码中常见的设计模式有哪些?(待补充完整)
单例模式
SingletonBeanRegistry,有getSingleton()
工厂模式
DefaultListableBeanFactory getBean()
代理模式
Spring AOP中的JdkDynamicAopProxy(有接口)和CglibAopProxy(无接口情况)
策略模式
BeanPostProcessor接口定义了一系列策略,如InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor
观察者模式
ApplicationEventPublisher接口和ApplicationListener接口实现事件发布和监听,符合观察者模式;
装饰器模式:
BeanWrapper设计模式是一种装饰器设计模式的应用,它允许在运行时动态地给对象添加额外的职责或功能,而不影响其原有的结构或行为。这种模式通过组合而不是继承来实现功能的扩展,特别适用于需要为对象添加多个功能,并且这些功能可以灵活组合的情况。BeanWrapper设计模式遵循单一职责原则,每个装饰器类只关注一个特定的功能,从而保持类的职责清晰和可维护性。
在Spring框架中,BeanWrapper设计模式的应用体现在多个方面,其中之一是AOP(面向切面编程)的实现。Spring框架通过AOP提供了对应用程序的横切关注点的模块化处理,如日志记录、事务管理、安全检查等。这些功能的实现基于装饰器模式,通过定义切面(Aspect)和连接点(JoinPoint),将横切关注点应用到程序执行过程中的关键点上。Spring框架中的AopProxy和Cglib2AopProxy等类就是代理模式的实现,它们为其他对象提供了一种代理,以控制对这个对象的访问,从而实现功能的增加或限制。
此外,Spring中的DataBinder类也体现了装饰器设计模式的应用。DataBinder实现了TypeConverter接口,该接口提供了类型转换服务,底层基于BeanWrapper实现。这意味着在数据绑定时,可以通过装饰器模式动态地添加类型转换功能,从而增强了数据的灵活性和可扩展性。
总的来说,BeanWrapper设计模式在Spring框架中的应用,通过动态地为对象添加额外的职责或功能,提高了系统的灵活性和可维护性。这种模式适用于需要动态扩展对象功能且希望保持对象原有结构不变的场景。
3、jvm模型
1、堆(Heap):
主要用于存储对象实例,包括程序中创建的对象以及Java虚拟机自动创建的对象。堆是JVM中最大的一块内存区域,主要用于动态分配内存。堆空间可以分为新生代和老年代,还包括持久代(JDK 7及之前版本)或元空间(JDK 8及之后版本)。
2、栈(Stack):
每个线程在创建时都会创建一个私有的栈,用于存储局部变量、操作数栈和方法出口等信息。每个方法调用都会创建一个栈帧,用于存储该方法的相关信息。栈的大小可以通过-Xss参数来调整。
3、方法区(Method Area):
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区的大小可以通过JVM参数来调整,例如使用-XX:MaxPermSize参数来设置永久代的最大容量。在JDK 8及之后的版本中,方法区被元空间(Metaspace)所取代。
4、本地方法栈(Native Method Stack):
与栈类似,用于存储执行本地(native)方法的数据。它是Java虚拟机内存模型中的一部分,用于支持本地方法的调用。
5、程序计数器(Program Counter Register):用于保存当前线程的行号,即线程执行的字节码的行号指示器。程序计数器是线程私有的,每条线程都有一个程序计数器。
4、jvm如何确认哪些是垃圾,哪些可以作为根?
1.虚拟机栈(栈帧中的本地变量表)中引用的对象;
2.方法区中的类静态属性引用的对象;
3.方法区中常量引用的对象;
4.本地方法栈中JNI(即一般说的Native方法)中引用的对象
5、生产上查看cpu、内存、IO、连接常用命令
查看CPU使用情况:
top
:实时显示系统中各个进程的资源占用情况,包括CPU使用率。htop
:一个增强版的top命令,提供更丰富的信息和更友好的界面。mpstat
:显示多处理器的统计信息,包括每个CPU的使用情况。
查看内存使用情况:
free
:显示系统的内存使用情况,包括总内存、已用内存、空闲内存等信息。vmstat
:显示虚拟内存统计信息,包括内存的使用情况。
查看IO使用情况:
iostat
:监控系统的输入/输出情况,可以查看磁盘的读写速度和IOPS等信息。iotop
:实时监控磁盘IO使用情况,可以查看哪些进程在使用磁盘以及磁盘的使用率。
查看网络连接情况:
netstat
:显示网络连接、路由表、接口统计等信息。ss
:显示类似netstat的信息,但提供更多的信息和更快的响应速度。tcpdump
:用于捕获并显示网络上的数据包,可以用于分析网络连接和通信数据。
6、jvm启动常用参数有哪些
-
堆内存设置:
-Xmx
:指定Java堆内存的最大限制,例如-Xmx512m
表示最大堆内存为512兆字节。-Xms
:指定Java堆内存的初始大小,例如-Xms256m
表示初始堆内存为256兆字节。-Xmn
:指定年轻代的大小,例如-Xmn256m
表示年轻代大小为256兆字节。- -XX:SurvivorRatio :指定年轻代中Eden区与Survivor区的大小比例。例如,-XX:SurvivorRatio=8 表示Eden区与每个Survivor区的大小比例为8:1。
- -XX:NewRatio :指定年轻代与老年代的大小比例。例如,-XX:NewRatio=2 表示年轻代和老年代的比例为1:2
-
线程堆栈大小:
-Xss
:指定每个线程的堆栈大小,例如-Xss256k
表示每个线程的堆栈大小为256千字节。
-
垃圾回收器设置:
-XX:+UseConcMarkSweepGC
:启用并发标记清除垃圾回收器。-XX:+UseG1GC
:启用G1(Garbage First)垃圾回收器。
-
元空间设置(针对Java 8及以后的版本):
-XX:MaxMetaspaceSize
:指定元空间的最大大小。-XX:MetaspaceSize
:指定元空间的初始大小。
-
其他参数:
-verbosegc
和-XX:+PrintGCDetails
:用于监视垃圾回收的运行。