admin管理员组文章数量:1033451
面试高峰季JDK24发布?赶快学点新特性之后跟面试官吹牛逼吧!震撼一下JDK1.8老兵
大家好,我是程序员牛肉。
2025年的3.18日JDK24正式发布,前几天一直在忙私事,所以没来得及更新。我真说白了:你发任你发,线上版本1.8。
不过我有写文章的需求嘛。那么今天就让我们来看一看JDK24都推出了哪些新特性吧,赶快学点之后和面试官吹牛逼吧。
[需要注意的是:JDK24JDK 24 属于非 LTS 版本,甲骨文仅为其提供 6 个月的高级支持.这意味着在 2025 年 9 月左右,官方将停止安全更新和漏洞修复,用户需升级到后续版本(如 JDK 25)以继续获得支持]
01
JVM虚拟机性能优化
JDK24中,Shenandoah垃圾回收器 支持分代模式(Generational Mode),将堆划分为年轻代(Young)和老年代(Old)。
该功能需要基于设置JVM参数来手动开启:
代码语言:javascript代码运行次数:0运行复制-XX:+UseShenandoahGC
-XX:+UnlockExperimentalVMOptions
-XX:+ShenandoahGenerational
[Shenandoah 是由 Red Hat 团队开发的一款低停顿时间、高并发性的垃圾回收器(GC),专为大堆内存(如数十 GB 到 TB 级)场景设计。
它的核心目标是通过并发执行垃圾回收任务,将 GC 停顿时间(STW, Stop-The-World)控制在极低水平(通常为毫秒级),从而满足实时性要求高的应用需求(如金融交易、在线游戏、实时数据分析等)。]
与此同时,ZGC分代模式成为JDK24的默认垃圾回收器。根据官方实验,大堆内存场景下STW时间压缩至1ms以下,内存回收效率提高40%
[ZGC 是 Oracle 开发的一款低延迟、高可扩展性的垃圾回收器(GC),专为大堆内存(TB 级)场景设计,核心目标是将 GC 停顿时间(STW, Stop-The-World)控制在亚毫秒级(<1ms),同时支持堆内存从几百 MB 到数 TB 的灵活扩展。它通过创新的并发算法和内存管理技术,显著提升了 Java 在实时性要求高、大内存场景下的性能表现。]
并且JDK24还对Java对象的对象头做了压缩,使得在相同的内存空间下可以加载更多的对象。
同样的,这个功能仍然是一项实验性功能。因此需要使用配置JVM参数的方式来开启这个功能:
代码语言:javascript代码运行次数:0运行复制-XX:+UnlockExperimentalVMOptions
-XX:+UseCompactObjectHeaders
传统对象头占用 96-128 位(如 64 位 JVM 默认 128 位),导致小对象内存浪费显著(如 Integer
对象实际数据仅 32 位,但头部占 128 位)。但本次优化通过优化元数据布局(如共享标记位、压缩哈希码),将对象头压缩至 64 位。
基于本次优化,堆整体内存减少 8-30%,尤其对海量小对象(如微服务中的 DTO、缓存条目)效果显著。
最后,为了更加适配现在主流的微服务化,JDK24对类的元数据进行了缓存,避免了其重复加载所造成的时间浪费,使得微服务冷启动时间缩短 42%,Serverless 场景资源消耗降低 30%
02
简化语法,便捷新手开发
目前我们写代码的时候,主方法都要写一长串的public static void main。终于在JDK24中对其进行了简化,主方法无需 public static void main
,直接使用 void main()
,降低学习门槛。
//老版本
public class Demo {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
// JDK24:
void main() {
System.out.println("Hello Java 24!");
}
对此我的评价是不如不优化,我直接psvm就可以生成对应的主方法。主流 Java IDE(如 IntelliJ IDEA、Eclipse)内置了 Live Templates(实时模板),允许开发者通过输入缩写(如 psvm
)快速生成常用代码片段。
在 IntelliJ IDEA 中,开发者可通过 File → Settings → Editor → Live Templates
查看和自定义模板。例如,psvm
对应一个预设模板,触发后自动生成完整的 main
方法签名。这一过程完全由 IDE 在代码编辑阶段处理,不涉及编译或运行。
并且,JDK24支持按照模块角度的进行导包。此特性特别适用于快速原型开发、教学场景或多模块库的高效调用。
代码语言:javascript代码运行次数:0运行复制// 传统方式(需逐个导入)
import java.util.Map;
import java.util.HashMap;
import java.util.stream.Collectors;
// JDK 24 模块导入
import module java.base; // 一键导入 java.util、java.lang 等基础包
根据官方文档所描述,该功能目前还处于预览状态,因此如果你想要使用的话,还需要经过一系列的配置:
从语法的角度上看,JDK24也推出了两个比较有用的点,第一个是推出了Stream Gatherers,其支持自定义中间操作,增强实时数据处理能力。
代码语言:javascript代码运行次数:0运行复制public class IncrementGathererExample {
// 自定义Gatherer:对每个元素加1
static Gatherer<Integer, ?, Integer> incrementGatherer() {
return Gatherer.of(
(_, element, downstream) -> {
int incremented = element + 1;
downstream.push(incremented); // 推送处理后的元素
returntrue; // 继续处理后续元素
}
);
}
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
// 应用自定义Gatherer
List<Integer> result = numbers.stream()
.gather(incrementGatherer())
.toList();
System.out.println(result); // 输出: [2, 3, 4, 5, 6]
}
}
第二点是:Instanceof和switch在JDK24中也支持基本数据类型了。这种优化在一定程度上优化了自动拆装箱所带来的性能损失。
代码语言:javascript代码运行次数:0运行复制//instacneof
int i = 42;
if (i instanceofbyte b) {
System.out.println("i is a byte: " + b);
}
//switch
int status = getStatus();
switch (status) {
case0 -> System.out.println("okay");
case1 -> System.out.println("warning");
case2 -> System.out.println("error");
caseint i -> System.out.println("unknown status: " + i);
}
03
并发方面又出新活
近几年面试官在出面试题的时候,经常喜欢考ThreadLocal跨线程传递变量的问题。
在之前我们的回答通常是InheritableThreadLocal,而随着虚拟线程的爆发,InheritableThreadLocal这种直接拷贝父线程的threadlocalMap所带来的性能问题逐渐被官方注意到。
被同组实习生吓一跳,他竟然知道InheritableThreadLocal和TransmittableThreadLocal
2024-11-02
于是JDK24推出了ScopedValue来解决解决虚拟线程场景下的上下文共享与内存泄漏问题:
代码语言:javascript代码运行次数:0运行复制ScopedValue<String> scopeVal = ScopedValue.newInstance();
ScopedValue.where(scopeVal, "B").run(() -> {
Thread.startVirtualThread(() -> System.out.println(scopeVal.get())); // 输出"B"
});
在这里我们就不详细的讲解这个变量了。后续我会单独出一篇文章讲解ScopedValue。
并且自从JDK21正式推出虚拟线程之后,虚拟线程就会有一个很大的问题是:虚拟线程在 synchronized
同步代码块中阻塞时(如 I/O 操作),虚拟线程会被固定(Pinned)到其底层的平台线程(OS 线程),导致平台线程无法释放,进而影响整体资源利用率
而JDK24实现了同步阻塞时释放底层线程,通过重新实现了 synchronized
关键字的底层机制,使虚拟线程在同步代码中阻塞时能够卸载(Unpark)并释放平台线程,从而允许调度器将其他虚拟线程分配到该平台线程上运行。
这样的话,我们就不再需要为了虚拟线程而强制使用Reentrantlock这种锁,在同步机制上有了更加灵活的选择。
并且JDK24对并发任务中的父子任务做了优化,将其视为了一个共同的逻辑单元,如果父任务取消的话,子任务会自动终止。避免了线程不安全的问题。
代码语言:javascript代码运行次数:0运行复制try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
Future<String> userTask = scope.fork(() -> fetchUser());
Future<Integer> orderTask = scope.fork(() -> fetchOrder());
scope.join(); // 等待所有子任务完成
scope.throwIfFailed(); // 若有子任务失败则抛出异常
return new Response(userTask.get(), orderTask.get());
} // 作用域结束时自动清理资源
这个听起来高大上,其实从代码的角度上看没有多难。其实就是手动维护父子任务的关系。
当父线程调用close方法终止任务的时候,手动关闭一下 子任务就好了。
剩下的特性我就不多做介绍了,主要都是关于安全性的。如果大家对这方面感兴趣的话,可以点击下面的链接:
官方更新文档
今天的文章就聊到这里了,其实我还想吐槽一下:现在国内推的最稳定的版本还是JDK1.8,都是14年前的东西了。虚拟线程都推了多久了,现在又有多少公司开始在生产环境中使用JDK21了?
相信通过我的介绍,你已经大致了解了JDK24都做了哪些更新。希望我的文章可以帮到你。
关于本次更新你还有什么想聊的吗?欢迎在评论区留言,大家一起交流解惑。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-03-31,如有侵权请联系 cloudcommunity@tencent 删除面试内存线程优化对象面试高峰季JDK24发布?赶快学点新特性之后跟面试官吹牛逼吧!震撼一下JDK1.8老兵
大家好,我是程序员牛肉。
2025年的3.18日JDK24正式发布,前几天一直在忙私事,所以没来得及更新。我真说白了:你发任你发,线上版本1.8。
不过我有写文章的需求嘛。那么今天就让我们来看一看JDK24都推出了哪些新特性吧,赶快学点之后和面试官吹牛逼吧。
[需要注意的是:JDK24JDK 24 属于非 LTS 版本,甲骨文仅为其提供 6 个月的高级支持.这意味着在 2025 年 9 月左右,官方将停止安全更新和漏洞修复,用户需升级到后续版本(如 JDK 25)以继续获得支持]
01
JVM虚拟机性能优化
JDK24中,Shenandoah垃圾回收器 支持分代模式(Generational Mode),将堆划分为年轻代(Young)和老年代(Old)。
该功能需要基于设置JVM参数来手动开启:
代码语言:javascript代码运行次数:0运行复制-XX:+UseShenandoahGC
-XX:+UnlockExperimentalVMOptions
-XX:+ShenandoahGenerational
[Shenandoah 是由 Red Hat 团队开发的一款低停顿时间、高并发性的垃圾回收器(GC),专为大堆内存(如数十 GB 到 TB 级)场景设计。
它的核心目标是通过并发执行垃圾回收任务,将 GC 停顿时间(STW, Stop-The-World)控制在极低水平(通常为毫秒级),从而满足实时性要求高的应用需求(如金融交易、在线游戏、实时数据分析等)。]
与此同时,ZGC分代模式成为JDK24的默认垃圾回收器。根据官方实验,大堆内存场景下STW时间压缩至1ms以下,内存回收效率提高40%
[ZGC 是 Oracle 开发的一款低延迟、高可扩展性的垃圾回收器(GC),专为大堆内存(TB 级)场景设计,核心目标是将 GC 停顿时间(STW, Stop-The-World)控制在亚毫秒级(<1ms),同时支持堆内存从几百 MB 到数 TB 的灵活扩展。它通过创新的并发算法和内存管理技术,显著提升了 Java 在实时性要求高、大内存场景下的性能表现。]
并且JDK24还对Java对象的对象头做了压缩,使得在相同的内存空间下可以加载更多的对象。
同样的,这个功能仍然是一项实验性功能。因此需要使用配置JVM参数的方式来开启这个功能:
代码语言:javascript代码运行次数:0运行复制-XX:+UnlockExperimentalVMOptions
-XX:+UseCompactObjectHeaders
传统对象头占用 96-128 位(如 64 位 JVM 默认 128 位),导致小对象内存浪费显著(如 Integer
对象实际数据仅 32 位,但头部占 128 位)。但本次优化通过优化元数据布局(如共享标记位、压缩哈希码),将对象头压缩至 64 位。
基于本次优化,堆整体内存减少 8-30%,尤其对海量小对象(如微服务中的 DTO、缓存条目)效果显著。
最后,为了更加适配现在主流的微服务化,JDK24对类的元数据进行了缓存,避免了其重复加载所造成的时间浪费,使得微服务冷启动时间缩短 42%,Serverless 场景资源消耗降低 30%
02
简化语法,便捷新手开发
目前我们写代码的时候,主方法都要写一长串的public static void main。终于在JDK24中对其进行了简化,主方法无需 public static void main
,直接使用 void main()
,降低学习门槛。
//老版本
public class Demo {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
// JDK24:
void main() {
System.out.println("Hello Java 24!");
}
对此我的评价是不如不优化,我直接psvm就可以生成对应的主方法。主流 Java IDE(如 IntelliJ IDEA、Eclipse)内置了 Live Templates(实时模板),允许开发者通过输入缩写(如 psvm
)快速生成常用代码片段。
在 IntelliJ IDEA 中,开发者可通过 File → Settings → Editor → Live Templates
查看和自定义模板。例如,psvm
对应一个预设模板,触发后自动生成完整的 main
方法签名。这一过程完全由 IDE 在代码编辑阶段处理,不涉及编译或运行。
并且,JDK24支持按照模块角度的进行导包。此特性特别适用于快速原型开发、教学场景或多模块库的高效调用。
代码语言:javascript代码运行次数:0运行复制// 传统方式(需逐个导入)
import java.util.Map;
import java.util.HashMap;
import java.util.stream.Collectors;
// JDK 24 模块导入
import module java.base; // 一键导入 java.util、java.lang 等基础包
根据官方文档所描述,该功能目前还处于预览状态,因此如果你想要使用的话,还需要经过一系列的配置:
从语法的角度上看,JDK24也推出了两个比较有用的点,第一个是推出了Stream Gatherers,其支持自定义中间操作,增强实时数据处理能力。
代码语言:javascript代码运行次数:0运行复制public class IncrementGathererExample {
// 自定义Gatherer:对每个元素加1
static Gatherer<Integer, ?, Integer> incrementGatherer() {
return Gatherer.of(
(_, element, downstream) -> {
int incremented = element + 1;
downstream.push(incremented); // 推送处理后的元素
returntrue; // 继续处理后续元素
}
);
}
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
// 应用自定义Gatherer
List<Integer> result = numbers.stream()
.gather(incrementGatherer())
.toList();
System.out.println(result); // 输出: [2, 3, 4, 5, 6]
}
}
第二点是:Instanceof和switch在JDK24中也支持基本数据类型了。这种优化在一定程度上优化了自动拆装箱所带来的性能损失。
代码语言:javascript代码运行次数:0运行复制//instacneof
int i = 42;
if (i instanceofbyte b) {
System.out.println("i is a byte: " + b);
}
//switch
int status = getStatus();
switch (status) {
case0 -> System.out.println("okay");
case1 -> System.out.println("warning");
case2 -> System.out.println("error");
caseint i -> System.out.println("unknown status: " + i);
}
03
并发方面又出新活
近几年面试官在出面试题的时候,经常喜欢考ThreadLocal跨线程传递变量的问题。
在之前我们的回答通常是InheritableThreadLocal,而随着虚拟线程的爆发,InheritableThreadLocal这种直接拷贝父线程的threadlocalMap所带来的性能问题逐渐被官方注意到。
被同组实习生吓一跳,他竟然知道InheritableThreadLocal和TransmittableThreadLocal
2024-11-02
于是JDK24推出了ScopedValue来解决解决虚拟线程场景下的上下文共享与内存泄漏问题:
代码语言:javascript代码运行次数:0运行复制ScopedValue<String> scopeVal = ScopedValue.newInstance();
ScopedValue.where(scopeVal, "B").run(() -> {
Thread.startVirtualThread(() -> System.out.println(scopeVal.get())); // 输出"B"
});
在这里我们就不详细的讲解这个变量了。后续我会单独出一篇文章讲解ScopedValue。
并且自从JDK21正式推出虚拟线程之后,虚拟线程就会有一个很大的问题是:虚拟线程在 synchronized
同步代码块中阻塞时(如 I/O 操作),虚拟线程会被固定(Pinned)到其底层的平台线程(OS 线程),导致平台线程无法释放,进而影响整体资源利用率
而JDK24实现了同步阻塞时释放底层线程,通过重新实现了 synchronized
关键字的底层机制,使虚拟线程在同步代码中阻塞时能够卸载(Unpark)并释放平台线程,从而允许调度器将其他虚拟线程分配到该平台线程上运行。
这样的话,我们就不再需要为了虚拟线程而强制使用Reentrantlock这种锁,在同步机制上有了更加灵活的选择。
并且JDK24对并发任务中的父子任务做了优化,将其视为了一个共同的逻辑单元,如果父任务取消的话,子任务会自动终止。避免了线程不安全的问题。
代码语言:javascript代码运行次数:0运行复制try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
Future<String> userTask = scope.fork(() -> fetchUser());
Future<Integer> orderTask = scope.fork(() -> fetchOrder());
scope.join(); // 等待所有子任务完成
scope.throwIfFailed(); // 若有子任务失败则抛出异常
return new Response(userTask.get(), orderTask.get());
} // 作用域结束时自动清理资源
这个听起来高大上,其实从代码的角度上看没有多难。其实就是手动维护父子任务的关系。
当父线程调用close方法终止任务的时候,手动关闭一下 子任务就好了。
剩下的特性我就不多做介绍了,主要都是关于安全性的。如果大家对这方面感兴趣的话,可以点击下面的链接:
官方更新文档
今天的文章就聊到这里了,其实我还想吐槽一下:现在国内推的最稳定的版本还是JDK1.8,都是14年前的东西了。虚拟线程都推了多久了,现在又有多少公司开始在生产环境中使用JDK21了?
相信通过我的介绍,你已经大致了解了JDK24都做了哪些更新。希望我的文章可以帮到你。
关于本次更新你还有什么想聊的吗?欢迎在评论区留言,大家一起交流解惑。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-03-31,如有侵权请联系 cloudcommunity@tencent 删除面试内存线程优化对象本文标签: 面试高峰季JDK24发布赶快学点新特性之后跟面试官吹牛逼吧!震撼一下JDK18老兵
版权声明:本文标题:面试高峰季JDK24发布?赶快学点新特性之后跟面试官吹牛逼吧!震撼一下JDK1.8老兵 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1748045535a2246174.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论