JVM的演变

Java虚拟机(JVM)是Java语言的核心组成部分,它负责将Java字节码转换为机器码并执行。随着时间的推移,JVM在不同版本的JDK中经历了许多演变和改进。本文将深入浅出地介绍从JDK 7到JDK 21不同主流版本的JVM结构变化及其特性,帮助你编写更适合的Java代码。

JDK 7

在JDK 7中,JVM引入了一些重要的特性和改进。

1. G1垃圾收集器

JDK 7引入了G1(Garbage-First)垃圾收集器,它是一种基于区域的垃圾收集器,旨在提供更好的吞吐量和更低的停顿时间。G1垃圾收集器使用了一种称为"分代并发"的算法,可以在多个CPU核心上并发地执行垃圾收集操作,从而减少了应用程序的停顿时间。

// 启用G1垃圾收集器
java -XX:+UseG1GC MyApp

2. 字符串拼接优化

在JDK 7之前,字符串拼接通常使用+操作符,这会导致创建大量的中间字符串对象。JDK 7引入了StringBuilder的自动优化,当使用+操作符拼接字符串时,JVM会自动将其转换为StringBuilder的方式,避免了中间字符串对象的创建。

String name = "John";
int age = 25;
String message = "My name is " + name + " and I'm " + age + " years old.";

3. InvokeDynamic指令

JDK 7引入了InvokeDynamic指令,它是一种动态方法调用的机制,可以在运行时动态地解析和绑定方法。这为动态语言和函数式编程提供了更好的支持,例如在Java 8中引入的Lambda表达式和方法引用。

// 动态调用方法
MethodHandle mh = MethodHandles.lookup().findVirtual(MyClass.class, "myMethod", MethodType.methodType(void.class));
mh.invoke(myObject);

JDK 8

JDK 8进一步改进了JVM,并引入了一些重要的特性。

1. Lambda表达式

JDK 8引入了Lambda表达式,它是一种简洁而强大的语法,用于表示匿名函数。Lambda表达式通过使用invokedynamic指令在运行时动态地创建函数对象。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream().filter(n -> n % 2 == 0).forEach(System.out::println);

2. PermGen空间移除

在JDK 8中,永久代(PermGen)被移除,取而代之的是元空间(Metaspace)。元空间是堆外的本地内存,用于存储类的元数据信息。这种改变解决了永久代容易出现内存溢出的问题,并提供了更好的性能和可扩展性。

3. 默认方法

JDK 8引入了默认方法(Default Method),允许在接口中定义具有默认实现的方法。这为接口的演化提供了更大的灵活性,可以向现有的接口添加新的方法,而不会破坏已有的实现类。

public interface MyInterface {default void myMethod() {System.out.println("Default implementation");}
}public class MyClass implements MyInterface {// 不需要实现myMethod,使用默认实现
}MyClass obj = new MyClass();
obj.myMethod(); // 输出: Default implementation

JDK 11

JDK 11引入了一些重要的改进和新特性。

1. Epsilon垃圾收集器

JDK 11引入了Epsilon垃圾收集器,它是一种无操作的垃圾收集器,用于测试和性能调优。Epsilon垃圾收集器不执行任何垃圾收集操作,只是简单地分配内存并丢弃它,适用于不需要垃圾收集的场景。

// 启用Epsilon垃圾收集器
java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC MyApp

2. 单文件源代码执行

JDK 11引入了单文件源代码执行的功能,允许直接执行单个Java源文件,而无需显式编译为字节码文件。这对于编写简单的脚本和小型应用程序非常方便。

// 直接执行单个Java源文件
java HelloWorld.java

3. ZGC垃圾收集器

JDK 11引入了ZGC垃圾收集器,它是一种低延迟的垃圾收集器,旨在处理大内存和超大内存的场景。ZGC垃圾收集器使用了一种称为"可并发压缩"的算法,可以在非常短的停顿时间内执行垃圾收集操作。

// 启用ZGC垃圾收集器
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC MyApp

JDK 17

JDK 17继续改进了JVM并引入了一些新特性。

1. 基于嵌套的访问控制

JDK 17引入了基于嵌套的访问控制,允许在类和接口中定义嵌套的访问控制上下文。这提供了更细粒度的访问控制,可以更好地封装和保护类的内部实现细节。

public class Outer {private int outerPrivateField;public class Inner {public void accessOuter() {System.out.println(outerPrivateField);}}
}

2. 静态嵌套类中的嵌套接口

JDK 17允许在静态嵌套类中定义嵌套接口。这使得代码更具可读性和组织性,可以更好地表示类之间的关系。

public class Outer {public static class Nested {public interface Inner {void doSomething();}}
}Outer.Nested.Inner obj = new Outer.Nested.Inner() {public void doSomething() {System.out.println("Doing something");}
};obj.doSomething(); // 输出: Doing something

3. 基于事件的垃圾收集器接口

JDK 17引入了基于事件的垃圾收集器接口,允许开发人员监视和控制垃圾收集器的行为。这为性能调优和故障排查提供了更多的工具和灵活性。

// 注册垃圾收集器事件监听器
GarbageCollectorMXBean gcBean = ManagementFactory.getGarbageCollectorMXBeans().get(0);
gcBean.addGarbageCollectionNotificationListener(new GarbageCollectionNotificationListener() {public void handleNotification(GarbageCollectionNotificationInfo info, Object handback) {System.out.println("GC event: " + info.getGcAction());}
}, null);

JDK 21

JDK 21是目前最新的JDK版本,它继续改进了JVM并引入了一些新特性。

1. 分代ZGC

分代 ZGC(Generational ZGC)在 hotspot/gc 包中。通过扩展Z垃圾回收器(ZGC)来维护年轻对象和年老对象的独立生成,从而提高应用程序性能。这将使ZGC能够更频繁地收集年轻对象——这些对象往往英年早逝。

2. 引入虚拟线程

将虚拟线程(Virtual Threads)引入Java平台。虚拟线程是轻量级线程,可以显著减少编写、维护和观察高吞吐量并发应用程序的工作量。

3.禁止动态加载代理

将代理动态加载到正在运行的JVM中时发出警告。这些警告旨在让用户为将来的版本做好准备,该版本默认情况下不允许动态加载代理,以提高默认情况下的完整性。在启动时加载代理的可服务性工具不会导致在任何版本中发出警告。

总结

本文深入浅出地介绍了JVM从JDK 7到JDK 21不同主流版本的演变和特性。我们学习了每个版本中的重要改进,包括垃圾收集器的改进、新的语言特性和性能优化。了解JVM的演变可以帮助我们编写更适合的Java代码,并充分利用JVM的功能和性能。

希望本文能够帮助你理解JVM的演变和特性,并在实际项目中应用这些知识。如果你对JVM的更多细节和深入内容感兴趣,可以查阅官方文档和其他相关资源进行深入学习。

参考资料:

  • The Java® Virtual Machine Specification
  • Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/632662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、RHCE--准备工作

一、RHCE---准备工作 1.修改主机地址&#xff08;由动态IP地址--> 静态IP地址&#xff09;第一种&#xff1a;通过命令行的方式第二种&#xff1a;通过vim编辑器修改配置文件的方式第三种&#xff1a;通过图形化的方式&#xff1a; 2.软件安装3.关闭防火墙4.禁用selinux 1.修…

xhr、jQuery、axios、fetch、vue-resource简单了解和对比

1. xhr 不常用&#xff08;太麻烦&#xff09;&#xff0c;一般进行二次封装&#xff0c;或者使用成型的第三方封装jQuery&#xff0c;axios等。axios和jQuery都是对xhr的封装。 2. jQuery 核心是封装Dom操作&#xff0c;80%的内容都是关于Dom的&#xff0c;Vue和React的使用…

【代码随想录算法训练营-第八天】【字符串】344,541,卡码网:54,151,卡码网:55

344.反转字符串 第一遍 思路 class Solution {public void reverseString(char[] s) {char tmp;for (int i 0, j s.length - 1; i < s.length && j > 0 && i < j; i, j--) {tmp s[i];s[i] s[j];s[j] tmp;}} }541. 反转字符串II 第一遍 思路…

kubernetes 权限控制

RBAC引入了4个顶级资源对象&#xff1a;Role、ClusterRole&#xff1a;角色&#xff0c;用于指定一组权限&#xff1b;RoleBinding、ClusterRoleBinding&#xff1a;角色绑定&#xff0c;用于将角色&#xff08;权限&#xff09;赋予给对象 咱们通过Role可以配置命名空间下资源…

第16章_网络编程拓展练习(TCP编程,UDP编程)

文章目录 第16章_网络编程拓展练习TCP编程1、学生与老师交互2、查询单词3、拓展&#xff1a;查询单词4、图片上传5、拓展&#xff1a;图片上传6、多个客户端上传文件7、群聊 UDP编程8、群发消息 第16章_网络编程拓展练习 TCP编程 1、学生与老师交互 案例&#xff1a;客户端模…

springboot3+springsecurity6集成druid启动报错

环境&#xff1a;springboot3security6druid1.2.20 druid1.2.20这个版本开始支持springboot3自动配置&#xff0c;不再需要手动引入 依赖为 <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId>…

概率论在激光雷达的目标检测和跟踪中的应用

概率论在激光雷达的目标检测和跟踪中发挥着重要的作用&#xff0c;通过建立概率模型和应用贝叶斯推断&#xff0c;可以处理激光雷达数据的不确定性&#xff0c;并提供准确的目标检测和跟踪结果。概率模型是激光雷达目标检测和跟踪的基础。激光雷达可以提供目标的位置、速度和形…

Qt程序如何在Release模式下进行断点调试

有些时候,因为某些工程pro文件设置了debug和Release版本的原因,导致在编译运行的时候,程序会自动生成带d后缀的一些库文件,进行调试。 debug模式下我们打断点进行调试,大家都知道。但是Release模式下,如果你直接Ctrl + R运行,肯定是无法断点调试的。 那么这个时候,我…

AEB滤镜再破碎,安全焦虑「解不开」?

不久前&#xff0c;理想L7重大交通事故&#xff0c;再次引发了公众对AEB的热议。 根据理想汽车公布的事故视频显示&#xff0c;碰撞发生前3秒&#xff0c;车速在178km/h时驾驶员采取了制动措施&#xff0c;但车速大幅超出AEB&#xff08;自动紧急刹车系统&#xff09;的工作范…

安卓之文本转视频的应用场景以及技术优劣分析

文章摘要 随着科技的进步&#xff0c;文本与视频这两种信息传递形式之间的界限正在逐渐模糊。特别是在安卓平台上&#xff0c;将文本转换为视频的功能已经成为一种重要的应用场景。本文将深入探讨这一功能的应用场景、涉及的关键技术&#xff0c;以及其优劣分析。 一、应用场景…

如何搭建Z-blog网站并结合内网穿透实现无公网ip访问本地站点

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

hadoop下载,安装

下载&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/ 从清华源下载 找到apache 找到hadoop 找到对应的版本 使用64位版本 上传到linux的 /usr/local 目录下 使用tar -zxvf 文件。 命令解压 添加path路径 1&#xff0c;vim /etc/profile 2, 追加hadoop的两个bin路径…

Ps:使用钢笔工具快速精准抠图的技巧

众所周知&#xff0c;钢笔工具是 Photoshop 中最精准的、适用于硬边缘&#xff08;清晰轮廓&#xff09;对象的抠图工具。但是&#xff0c;如果从头开始一个锚点一个锚点的勾勒&#xff0c;既费时又费眼。 我们可以先用选区工具或选区命令做一个基础选区&#xff0c;然后将选区…

【Linux】权限的深度解析

前言&#xff1a;在此之前我们学习了一些常用的Linux指令&#xff0c;今天我们进一步学习Linux下权限的一些概念 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:Linux的学习 &#x1f448; &#x1f4af;代码仓库:卫卫周大胖的学习日记&a…

python实现图片式PDF转可搜索word文档[OCR](已打包exe文件)

目录 1、介绍 1.1、痛点 1.2、程序介绍 2、安装方式 2.1、&#x1f53a;必要环节 2.2、脚本安装 2.2.1、不太推荐的方式 2.2.2、节约内存的方式 2.3、⭐完整版安装 3、使用 3.1、最终文件目录 3.2、主程序 3.2.1、绝对路径 3.2.2、是否为书籍 3.2.3、⭐截取区域 …

lvgl移植流程

移植准备 基于梁山派屏幕扩展板mcu屏幕源码Screen_MCU移植下载lvgl 8.3版本源码下载地址:https://github.com/lvgl/lvgl参考文档:Set-up a project — LVGL documentation 移植步骤 1. 删除源码 删除源码中不需要的文件夹&#xff0c;仅保留如下内容 demos : lvgl综合案例e…

QtCreator12无法识别Qt5.15.2的安卓SDK与NDK配置解决

解决方法: 设置JDK为JDK11 使用Android Studio下载 Android SDK Command-line Tools 10.0 打开Android SDK Location : 双击打开cmdline-tools 复制10.0中所有东西到latest中 点击Manage Kits并选择Devices 然后点击Android会弹出下图窗口,并自动更 安装完成 成功识别

股票套牢,如何解套?当下行情怎么赚钱?

今年开年大盘继续一路下行&#xff0c;今天更是直接跌破2800点&#xff0c;很多朋友都是套牢的阶段&#xff0c;这种时候我们怎样解套&#xff0c;在这种情况下&#xff0c;作为散户的我们又如何才可以赚到钱呢&#xff1f; 股票被套可以借用哪些工具解套&#xff1f;详细操作…

新数智空间:阿里云边缘云持续保持中国公有云市场第一

全球领先的 IT 市场研究和咨询公司 IDC 发布 《中国边缘云市场解读&#xff08;2023H1&#xff09;》报告 中国边缘公有云服务市场 阿里云持续第一 稳居市场第一&#xff0c;“边缘”逆势生长 近日&#xff0c;全球领先的 IT 市场研究和咨询公司 IDC 最新发布《中国边缘云市…

c++ 函数参数的传递

在 C++ 中,函数参数可以通过值传递、指针传递或引用传递的方式来传递。每种传递方式有其用途和行为特点。理解这些不同之处对于有效地使用 C++ 来说非常重要。 先大概了解一下各个指针的信息,再看实例 值传递(Pass by Value):创建实参的副本,函数中的改动不影响实际的变…