1、git统计统计项目中所有文件的总代码行数git ls-files | xargs cat | wc -l
2、 mysql优化:
1用explain或者慢日志查询查找出需要优化的sql
2优化:尽量走索引,避免全文扫描,避免用select *:
2.1避免在where和order by字段添加索引,
2.2判断字段是否为空改为数值标记(如判断字段是否为0)
2.3or的字段,当其中一个字段没有索引会放弃索引,改为用nuion all
2.4 避免用in,一些连续的梳子条件,可改为用between and;或者用exist
2.5jion的表不要太多
3最后一种方法:把整段sql复制发给chatGPT,叫其优化,根据提供的方案进行验证。
3、 Netty
1Netty是基于NIO开发的网络通信框架【共用阻塞对象】
2BIO:同步阻塞模式,NIO:同步非阻塞模式,AIO:NIO2,它是异步非阻塞模型
3Netty 线程模型:基于 Reactor 模式,采用多路复用将事件分发给相应的 Handler 处理
4
RPC
远端通信机制,解决不同进程之间的相互调用
包含序列化模块,协议模块,网络通讯模块(客户端、服务端、网络传输)
5 TCP 长连接和短连接
TCP 在进行读写之前必须提前建立一个连接,短连接说的就是 server 端 与 client 端建立连接之后,读写完成之后就关闭掉连接,后续重新连接。长连接就是建立连接后不会主动关闭,后续的读写操作会继续使用这个连接。
6 :jvm调优:
设置JVM的参数如设置堆的起始内存和最大内存、设置gc回收频率。
https://segmentfault.com/a/1190000044547802
7 如何应对内存泄漏:
java内存泄漏是GC回收的标准没有达到,导致一些不需要的对象无法回收,大部分都是对象引用计数未达到0,比防止循环引用、在一些不需要的引用的时候,把对象置为null,以告诉GC该对象可以被回收,减少内存消耗
8 【没理解透】
强引用:引用计数为0的时候,回收。
软引用【不会计引用计数】:其他地方没人用的时候且内存不够就回收。SoftReference
弱引用【不会计引用计数】::其他地方没人用的时候一定回收。
虚引用:一定回收,get出来就是null
9
Spring事务传播行为(机制)(高频)
1. PROPAGATION_REQUIRED --- required
以事务方式执行、新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
2. PROPAGATION_REQUIRES_NEW --- required_new
以事务方式执行、新建事务,如果当前存在事务,把当前事务挂起。
3. PROPAGATION_SUPPORTS --- supports
以当前情况运行,有事务以事务方式运行,没事务以没事务运行
4. PROPAGATION_NOT_SUPPORTED --- not_supported
以非事务方式执行,如果当前存在事务,就把当前事务挂起。
5. PROPAGATION_MANDATORY --- mandatory
使用当前的事务,如果当前没有事务,就抛出异常。
6. PROPAGATION_NEVER --- never
以非事务方式执行,如果当前存在事务,则抛出异常。
7. PROPAGATION_NESTED --- nested
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
10 在项目中怎么用到redis
redission分布式锁
1 解决不同进程之间的同步问题,(synchronized解决不同线程之间的同步问题)
2 基于setnex(name value time)思想(服务器挂了,获得锁的进程无法释放锁,导致新进程永远无法获取锁,所有要设置有效期,但是有效期内获取锁的线程没有),有一个续约机制【在设置的同时,开启一个线程计时,时间到了还没有人来清空计时器就续约重置】
3 使用getLock(String var1).tryLock(long waitTime, long leaseTime, TimeUnit unit)获取锁
4 lock()等待获取锁,会阻塞,tryLock()不等待,立即返回获取结果
11
lock锁是在JUC【java.util.concurrent】包下的接口,该包下面有很多类,包括ReenranLock,lock接口里面有lock方法和unlock方法,lock是提供公平锁机制(线程排队,无法插队)
12
spring的注入方式:
1@Autowired自动注入,只需要在变量上面定义,可能会循环依赖
2 构造器注入,定义用final修饰变量后(不能为null),在创建一个构造器(@Autowired修饰【可能是告诉类加载时的默认构造器】)或者用@RequiredArgsConstructor修饰
3 set注入 (@Autowired修饰)
13
类加载执行顺序:
【父->子类】静态变量/静态代码块---->【父->子类】成员变量|非静态代码块----->【父->子类】构造器
14
HashMap是一个键值对集合,源码中每个节点用Node<K,V>表示,HashMap的数据结
构为数组+(链表或红黑树)
15
CAS 是一种积极锁的一种机制,java的实现在atomic包下面的原子类,在硬件层面解决,线程去拿期望值和内存值比较,如果不一样就证明被修改,会放弃修改。解决ABA问题是加版本
16
匿名内部类:没有名字的内部类,在创建类的同时创建实例,减少冗余代码,使用方式是,定义父类/接口 对象=new 出相关父类和接口
泛型:不明确指出哪一类,可用在类、方法、接口
通配符:1定义泛型的一类范围,通常表示泛型的子类,有? exstends 泛型
2 ?super 泛型;表示从T开始的超类,直到Object
3 <?> 代表所有类型5
17 redis
1支持lua脚本:能保证原子性,在rredission里面大量使用,用SCRIPT和EVAL来写
2 事务:用MULTI(多个的意思)开启,用ecex来执行,不支持回滚,用乐观锁思想【WATCH】来完成事务的隔离性
18 算法:
二分查找法:
解决:在一个有序的集合找到到目标值
实现:1.1判断索引的最大值和最小值,如果最大值比最小值小,则范围,排查空数组
1.2 查找索引向下取整
19 springbean是线程安全的吗?
大多的spring bean是单例,有成员变量且有读写操作存在现在不安全;把该变量声明在方法中就安全了。
20 跨域问题:
域名不同的访问、协议不同(https和http)、端口不同会造成跨域问题