54 归档分页
370 留言互动
4 核心专题

最近更新

Java 2021-10-27

JVM垃圾收集器汇总

Serial 是单线程复制收集器,适用于 Client 模式小堆,停顿可接受;ParNew 为其多线程版,可配合 CMS 使用,在 Server 环境多 CPU 时提升并行度。Parallel Scavenge 同样是多线程复制收集器,侧重吞吐量,通过‑XX:GCTimeRatio、‑XX:MaxGCPauseMillis 调节;对应的老年代有 Serial Old(单线程标记‑整理)和 Parallel Old(多线程标记‑整理),后者与 Parallel Scavenge 组合实现高吞吐。CMS 采用并发标记‑清除,目标最短停顿,但对 CPU 敏感、产生碎片且无法处理浮动垃圾。G1 采用分区‑并行‑增量回收,提供可预测的停顿时间,调参主要是‑XX:MaxGCPauseMillis 等。整体上,JVM 提供了从单线程到并行、从低停顿到高吞吐的多种收集器,以满足不同应用场景的性能需求。

Java 2021-10-27

什么是桥接方法?

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

泛型 阅读全文
Java 2021-10-18

什么是类型擦除?

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

泛型 阅读全文
Java 2021-10-26

什么是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`,两者兼顾则不使用通配符。

泛型 阅读全文
Java 2021-10-25

什么是类型通配符?

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

泛型 阅读全文
Java 2021-10-20

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

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

Redis 阅读全文