1、设计模式有哪些原则(待解释的更直白)
- 单一职责原则:一个类或方法应只负责一项职责,避免一个类因为多个变化原因而改变。
- 开闭原则:软件实体应对扩展开放,对修改封闭。比如要增加用户类别的时候可以新增一个类而不是只能去修改。
- 里氏替换原则:子类型必须能够替换掉它们的父类型,而不会对程序造成逻辑错误。
- 依赖倒置原则:高层模块不应依赖于低层模块,两者都应依赖于抽象;抽象不应依赖于细节,细节应依赖于抽象。
- 接口隔离原则:使用多个专门的接口比使用单一的总接口更好。
- 合成/聚合复用原则:尽量使用对象的组合/聚合,而不是继承关系达到复用的目的。
- 迪米特法则(最少知道原则):一个对象应对其他对象有尽可能少的了解。在编程中,这意味着一个类不应该知道太多其他类的细节,只和直接相关的类交互。这样做可以减少系统中的耦合,使得修改一个部分的时候,不会影响到太多其他部分,保持代码的整洁和可维护性
2、spring源码中常见的设计模式有哪些?(待补充完整)
单例模式 SingletonBeanRegistry,有getSingleton()
工厂模式DefaultListableBeanFactory getBean()
代理模式Spring AOP中的JdkDynamicAopProxy和CglibAopProxy
策略模式BeanPostProcessor接口定义了一系列策略,如InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor
观察者模式 ApplicationEventPublisher接口和ApplicationListener接口实现事件发布和监听,符合观察者模式
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
:用于监视垃圾回收的运行。