jdk8-21特性
核心特征:
(8)lambda,stream api,optional,方法引用,函数接口,默认方法,新时间Api,函数式接口,并行流,ComletableFuture。
(9)模块系统,jshell命令工具直接写java代码,集合的of方法,接口的private方法,Stream的takeWhile和dropWhile,多版本兼容jar,optional新增ifPresentOfElse(),or(),更强大的
ProcessHandle
获取进程信息,响应式流。(10)var局部变量类型推断,不可变集合的增强(CopyOf),Optional.orElseThrow(),并行全垃圾回收器(G1),DK默认包含CA根证书,支持TLS安全通信, 线程本地握手,版本号改为基于发布周期(如
10.0.1
),非之前的1.8.0_291
格式(11)HTTP Client API(正式版),允许在Lambda表达式中使用
var
声明参数(需显式注解@NonNull
等),字符串增强方法isBlank()
、lines()
、repeat(),
新的文件读写方法(Files类),直接运行.java
文件(无需先编译),Epsilon垃圾回收器,JVM内部优化,允许嵌套类直接访问彼此的私有成员,JVM新增CONSTANT_Dynamic
常量池类型,提升动态语言支持,移除Java EE和CORBA模块(如javax.xml.ws
),原商业版JFR成为开源功能,用于低开销性能监控。(12-16)简化
switch
语法,支持返回值和多标签匹配,Shenandoah GC低停顿时间的垃圾回收器,适合大堆内存应用,Microbenchmark Suite(JMH集成)JDK内置微基准测试工具,简化多行字符串书写,避免转义符String json = """ { "name": "Java", "version": 13 } """;动态CDS归档,底层NIO实现优化,提升性能,instanceof模式匹配(预览)直接类型转换,减少冗余代码,Record类(预览),NullPointerException增强,明确提示NPE发生的具体变量,ZGC(生产就绪)。
(17)record类,密封类,隐藏类,模式匹配,文本块,swith增强,新ZGC/Shenandoah GC,弃用Applet API,强封装JDK内部API,伪随机数生成器(新API),移除实验性AOT和JIT编译器,外部函数和内存API(孵化器模块)
(18-20)默认UTF-8字符集,简易Web服务器(jwebserver)
(21)虚拟线程,记录模式,匹配模式再增强,分代ZGC,有序集合,外部函数与内存API, 弃用Windows 32位安装包,密钥封装机制API(KEM)
jvm
内存模型:本地方法栈,pc register,虚拟机栈,堆
作用:
堆:
类加载器的双亲委派机制:
加载流程:
gc
有哪些垃圾回收器:
gc算法:
arthas
内存泄漏定位过程以及使用的命令:
确认泄漏现象 → 定位TOP对象 → 追踪引用链 → 监控增量 → 分析创建路径 → 生成堆转储 → 修复代码 → 验证回收
# 查看JVM内存实时状态(重点关注Old Gen)
dashboard -i 3000 -n 3 | grep -E 'Heap|Old Gen'# 监控GC活动(频繁Full GC是泄漏标志)
jvm | grep -A 5 'GC'# 统计堆内存中对象数量TOP 10(立即执行)
memory --classloader -t 10# 示例输出(泄漏对象通常数量异常):
# com.example.CacheEntry 1,234,567 1.2GB
# java.util.HashMap$Node 890,123 450MB
# 获取对象实例地址(以com.example.CacheEntry为例) vmtool --action getInstances --className com.example.CacheEntry --limit 1 # 输出实例地址后,追踪GC Roots引用路径 ognl '@com.taobao.arthas.core.advisor.Advice@toGCRoots(<INSTANCE_ADDRESS>)'# 每30秒统计一次泄漏对象的增量(持续观察)
monitor -c 30 -n 5 'java.lang.Class getInstancesCount "com.example.CacheEntry"'# 动态观察对象创建堆栈(关键!)
stack com.example.CacheManager "addEntry" -n 10# 生成轻量级堆转储(建议低峰期执行)
heapdump --live /tmp/leak_snapshot.hprof# 仅dump可疑对象(减少文件大小)
heapdump --include com.example.CacheEntry /tmp/partial_dump.hprof# 检查对象是否被正确释放(对比操作前后)
watch com.example.CacheService clearCache '{params,returnObj,throwExp}' -n 5 -x 3# 追踪对象finalize情况
trace java.lang.Object finalize -n 5
- 临时缓解:通过Arthas强制清除泄漏集合(慎用!)
ognl '@com.example.CacheManager@clearAll()'
- 立即告警:当Old Gen使用率超过90%时触发告警
jvm | grep 'Old Gen' | awk '{if($3>90) print "ALERT"}'
cpu过高:
dashboard -i 2000 -n 3
thread -n 5前五个cpu占用最高的完整堆栈 最忙的5个线程的堆栈(推荐)
thread -b看哪里阻塞死锁堆栈
thread pid查看指定线程的完整堆栈
watch com.example.aa.类名 方法名 '{params,returnObj,throwExp}' -n 5 -x 3通过输出最近5次方法的调用查看这个方法的参数返回和异常
trace 类名 方法名 -n 5过输出最近5次方法调用查看方法得耗时
stack 类名 方法名 -n 5通过输出最近5次方法的调用栈 查看被哪里调用了
monitor -c 10 -n 5 'java.lang.Class getInstancesCount "com.example.*"' 每10秒统计一次类实例数(持续监控)
jad 类名 反编译看下代码是不是没更新
# 1. 启动采样(默认30秒)
profiler start# 2. 停止采样生成SVG
profiler stop --format svg# 3. 下载文件并用浏览器打开
其它场景:
线程
生命周期:
线程池:
java原生包:java.util.concurrent.Executor创建线程池:固定线程数的,单线程的,带缓存的,周期性执行的,自定义的,jdk7开始有的ForkJoinPool spring封装:
org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
每个参数的意思:
拒绝策略:
CallerRunsPolicy是不是立即调用:
匹配队列:
ThreadLocal原理:
Volitale原理:
指令重排原理:
锁
乐观锁:
悲观锁:
事务
acid:
事务隔离级别:
spring事务原理和流程:
分布式事务原理和流程:
mysql
函数:
索引:
事务:
锁:
存储结构:
同步机制:
优化:
redis
数据类型:
缓存击穿:
缓存穿透:
缓存雪崩:
分布式锁实现原理:
lua:
redis与mysql的同步机制与原理:
mongodb
存储格式:
索引:
优化:
原理:
rocketmq / kafka
角色:
消息路由:
顺序消费如何保证:
重试队列机制:
死信队列机制:
背压机制:
sharding-jdbc
大数据分库分表方案:
具体配置:
spring全家桶
如何理解spring:
如何理解springboot:
springboot如何优化启动速度和内存占用量:
springcloud有哪些组件:
springcloudalibaba有哪些组件:
版本对应问题:
nacos:
openfeign:
setinel:
loadbalance:
seata:
es
归档方案:
复杂的查询语句:
ik分词器原理:
算法
设计模式
单例:
工厂:
策略:
发布订阅:
责任链:
装饰器:
适配器模式: