与JDK 21兼容的最小Lombok版本是1.18.30
View Details什么意思呢?就是当前进程确保一个类全局只有一个实例。
那单例模式有什么好处呢?[1]
单例模式在内存中只有一个实例,减少了内存开支
单例模式只生成一个实例,所以减少了系统的性能开销
单例模式可以避免对资源的多重占用
单例模式可以在系统设置全局的访问点
那单例模式是银弹吗?它有没有什么缺点?
单例模式一般没有接口,扩展很困难
单例模式不利于测试
单例模式与单一职责原则有冲突
那什么情况下要用单例模式呢?
要求生成唯一序列号的环境
在整个项目中需要一个共享访问点或共享数据
创建一个对象需要消耗的资源过多
需要定义大量的静态常量和静态方法(如工具类)的环境
volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。
View Details缓存击穿: 一个并发访问量比较大的key在某个时间过期,导致所有的请求直接打在DB上。
缓存穿透:缓存穿透指的查询缓存和数据库中都不存在的数据,这样每次请求直接打到数据库,就好像缓存不存在一样。
缓存雪崩: 当某⼀时刻发⽣⼤规模的缓存失效的情况,例如缓存服务宕机、大量key在同一时间过期,这样的后果就是⼤量的请求进来直接打到DB上,可能导致整个系统的崩溃,称为雪崩。
单一职责原则(Single Responsibility Principle, SRP) 一个类应该只有一个引起它变化的原因。 这意味着一个类应该只负责一项功能,而不是多种功能混杂在一起。 开闭原则(Open Closed Principle, OCP) 软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。 这意味着在不修改现有代码的情况下,可以添加新的功能,使系统具有良好的可扩展性。 里氏替换原则(Liskov Substitution Principle, LSP) 所有出现的地方,子类必须能够替换父类。 任何派生类对基类的替换都不能改变程序的行为,以确保程序的正确性。 接口隔离原则(Interface Segregation Principle, ISP) 客户端不应该被迫依赖它不使用的方法。 即不应该有一个大的接口,而是应该有许多小的接口,让客户端只依赖于它们真正需要的接口。 依赖倒置原则(Dependence Inversion Principle, DIP) 高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。 通过抽象和接口来降低模块间的耦合度。 迪米特法则(Law of Demeter, LoD) 又称“最少知道原则”。 一个对象应该对其他对象有尽可能少的了解,并且只与它的直接朋友进行交互,而不是与间接的朋友。
View Details在java领域,表现层技术主要有三种,
(1)jsp;
(2)freemarker;
(3)velocity;
(4)thymeleaf;
GarbageCollectedMemoryPool 是一个非常巧妙的调试工具。它通过继承 SimpleMemoryPool 复用了内存额度控制的逻辑,然后通过重写钩子方法和结合Java的引用机制,增加了一层“内存泄漏”的监控。
正常流程:tryAllocate() -> bufferToBeReturned (登记) -> 使用 -> release() -> bufferToBeReleased (注销) -> ByteBuffer 失去引用 -> 被GC。
泄漏流程:tryAllocate() -> bufferToBeReturned (登记) -> 使用 -> 忘记调用 release() -> ByteBuffer 失去引用 -> 被GC -> BufferReference 进入队列 -> 后台线程检测到,并从 buffersInFlight 中找到了登记信息 -> 报告错误。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){ RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); //设置String类型的key设置序列化器 redisTemplate.setKeySerializer(new StringRedisSerializer()); //设置Hash类型的key设置序列化器 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); //设置redis链接Lettuce工厂 redisTemplate.setConnectionFactory(lettuceConnectionFactory); return redisTemplate; } } |
View Details
1.JVM调优的相关知识,给出了一个demo案例;
2.JVM调优的主要参数;
3.jdk自带的jvm分析工具的使用;
3.内存溢出的调优场景,逐步分析定位问题;
4.发生死锁的分析案例