加载中

Java

文章分类

浏览该分类下的所有文章

237 篇文章 20

什么是桥接方法?

桥接方法是 JDK 1.5 为兼容泛型擦除后产生的编译器合成方法,字节码中标记为 ACC_BRIDGE 与 ACC_SYNTHETIC,可通过 Method.isBridge() 判断。它在以下情况下生成:①实现带泛型参数的接口,编译器为子类补充一个返回 Object、参数为 Object 的方法;②子类覆盖父类方法并使用协变返回类型(返回子类更具体的类型),编译器生成与父类签名相同的桥接方法。参数类型、数量、修饰符提升或 static 方法的覆盖都不会产生桥接方法。生成桥接方法的目的在于保持泛型代码在擦除后的二进制兼容性,使得在运行时通过父类或接口引用调用时仍能正确分派到子类实现,同时避免因类型不匹配而产生的运行时错误。

什么是类型擦除?

Java 泛型在编译后会被擦除,进入 JVM 时只剩原始类型。未限定的类型参数被替换为 Object,限定上限的则替换为上限类型,因而不同类型参数的实例在运行时属于同一类。通过反射可以绕过编译期的类型检查,在已擦除的集合中加入不匹配的元素,体现了 Java 泛型的“伪泛型”本质。

什么是PECS?

PEPS(Producer Extends Consumer Super)是 Java 泛型的核心规则。使用 `? extends T` 表示协变,只能安全读取 T 或其子类元素,不能写入;`? super T` 表示逆变,只能安全写入 T 或其子类,读取时只能得到 Object。文章通过 `List<? extends Fruit>`、`List<? super Fruit>` 示例说明了编译错误的原因,并比较了 Kotlin 中的 `out`(只读)和 `in`(只写)对应关系。还指出数组在 Java 中是协变的,以及 Kotlin 的 `inline` + `reified` 实现了运行时泛型保留。最后总结:读取用 `extends`,写入用 `super`,两者兼顾则不使用通配符。

什么是类型通配符?

类型通配符用于在泛型中表示未知或受限的元素类型。 - `<?>` 表示元素类型未知的 List,是所有具体泛型 List 的父类,但不能向其中写入元素。 - `<? extends T>` 表示元素类型为 T 或其子类的 List,只能读取元素,写入受限。 - `<? super T>` 表示元素类型为 T 或其父类的 List,可安全写入 T 类型元素,读取时只能得到 Object。 文章通过 `GenericDemo` 示例演示了三种通配符的声明方式及合法/非法的赋值情况,帮助理解它们在类型安全和灵活性上的作用。

Redis持久化、主从与哨兵架构

Redis提供RDB快照(save同步、bgsave异步)和AOF日志(appendfsync策略、重写),并可开启混合持久化以加速重启。可用crontab实现定时备份。主从复制使用PSYNC,支持全量/增量同步和断点续传,并可配置只读从节点。Jedis示例展示连接池、Pipeline批量请求及Lua脚本实现原子操作。

JVM垃圾收集器G1&ZGC

G1 是面向服务器的分代收集器,将堆划分为约 2048 个等大小 Region,动态在年轻代、老年代和 Humongous 区之间切换。通过并发标记、STW 初始/最终标记以及基于回收价值排序的 Cleanup 阶段,G1 在用户指定的 ‑XX:MaxGCPauseMillis 目标停顿内优先回收收益最高的 Region,采用复制算法几乎消除碎片,并提供丰富的调参手段(Region 大小、年轻代比例、触发阈值等),适合 8 GB 以上、停顿要求在数百毫秒的高吞吐场景。 ZGC(JDK 11 起)是面向低延迟的单代收集器,支持 TB 级堆,停顿始终 ≤ 10 ms,且不随堆大小增长。它同样采用 Region(小/中/大)布局,利用读屏障、颜色指针和自愈转发实现全并发的标记‑整理、准备‑重分配、重映射四阶段,并对 NUMA 架构感知。ZGC 牺牲约 15% 吞吐以换取极短、可预测的停顿,适用于对响应时间极其敏感的大内存应用。

Nacos 注册中心的心跳机制

微服务启动后,内置的 Nacos 客户端每 5 秒向 Nacos 服务器的 /nacos/v1/ns/instance/beat 接口发送一次心跳,携带实例名称、IP、端口、集群、权重等信息。服务器的 naming 模块收到心跳后,先依据 IP+端口判断实例是否已存在;不存在则在实例 Map 中注册;已存在则记录本次心跳时间、标记为健康并推送状态变更消息,随后返回新的心跳间隔。为防止无效实例长期占用,Nacos 每 20 秒扫描实例 Map,将“非健康”实例剔除。这样实现了服务实例的实时注册、健康监测与自动清理。

JVM内存模型深度剖析与优化

文章系统阐述了JVM的整体结构与内存模型,解释了Minor GC中对象复制后引用的更新机制,并详细列举了常用JVM参数(-Xms、-Xmx、-Xmn、-Xss、-XX:NewRatio、-XX:SurvivorRatio、-XX:MetaspaceSize/MaxMetaspaceSize)的含义与调优策略。通过示例演示StackOverflowError,指出‑Xss对栈帧数和线程数的影响,提出在高并发业务中应让对象尽量在新生代分配回收、限制老年代晋升并预留充足内存的实用建议。

List去除重复数据的五种方式

本文介绍了在Java中对ArrayList去重的五种实现方式:①利用LinkedHashSet既去重又保序;②Java 8 Stream的distinct()配合collect;③通过HashSet判断并手动保持顺序;④遍历列表并用contains检测防止重复;⑤使用双层for循环逐一比较并删除。每种方法均附有代码示例并说明其特点。