JVM的演变

这篇具有很好参考价值的文章主要介绍了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的更多细节和深入内容感兴趣,可以查阅官方文档和其他相关资源进行深入学习。

参考资料:文章来源地址https://www.toymoban.com/news/detail-804281.html

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

到了这里,关于JVM的演变的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java八股文面试[JVM]——JVM内存结构

    参考: JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 JVM 是运行在操作系统之上的,它与硬件没有直接的交互 JVM内存结构:   方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实例,几乎所有的对象实例都在这里分配内存 虚拟机栈:虚拟机栈描述的是

    2024年02月12日
    浏览(47)
  • java-JVM内存区域&JVM运行时内存

    JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。 线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 HotspotVM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部

    2024年02月12日
    浏览(48)
  • JVM(Java虚拟机)-史上最全、最详细JVM笔记

    一、JVM概述 1、1为什么要学习JVM 1、2虚拟机 1、3JVM作用 1、4JVM整体组成部分  二、JVM结构--类加载器 2、1类加载子系统 2、2类加载过程 2、2、1加载 2、2、2链接 2、2、3初始化 2、3类加载器分类 2.3.1 引导类加载器(启动类加载器 BootStrap ClassLoader) 2.3.2 扩展类加载器(Extension ClassL

    2024年02月03日
    浏览(67)
  • 【Java高级应用:深入探索Java编程的强大功能,JVM 类加载机制, JVM 内存模型,垃圾回收机制,JVM 字节码执行,异常处理机制】

    本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:

    2024年01月16日
    浏览(90)
  • 3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优

    一篇文章掌握整个JVM,JVM超详细解析!!! JVM (Java虚拟机) 是运行 Java 字节码 的 虚拟机 。 JVM 针对 不同系统 有 特定实现 ( Windows 、 Linux 等),目的是 同样的代码 在 不同平台 能运行出 相同的结果 。 Java 语言 要经过 编译 和 解释 两个步骤: 编译 :通过 编译器 将 代码 一

    2024年02月15日
    浏览(50)
  • Java虚拟机快速入门 | JVM引言、JVM内存结构、直接内存

    目录 一:JVM引言 1. 什么是 JVM ? 2. 常见的 JVM 3. 学习路线 二:JVM内存结构 1. 程 序 计 数 器(PC Register) 2. 虚 拟 机 栈(JVM Stacks) 3. 本 地 方 法 栈(Native Method Stacks) 4. 堆(Heap) 5. 方 法 区(Method Area) 三:直接内存 tips: 首先给大家推荐两款好用的免费软件:动图抓取软

    2024年02月05日
    浏览(65)
  • jvm深入研究文档--java中的堆--详解!--jvm底层探索(1)

    JVM的内存分区包括以下几个部分: 堆区(Heap) - 这是JVM的主要部分,用于存储实例对象和大多数Java对象,如数组和用户定义的类。 方法区(Method Area) - 这是线程私有的,用于存放类对象(加载好的类)。 栈区(Stack) - 这是线程私有的,包括虚拟机栈和本地方法栈。虚拟

    2024年02月07日
    浏览(51)
  • 【从零开始学JVM】第一章_JVM和java体系结构

    Java是一门跨平台的语言 Java 语言的特点包括: 跨平台性 :Java 程序可以在不同操作系统上运行,只需安装对应平台的 Java 虚拟机(JVM)即可。 面向对象 :Java 是一种纯粹的面向对象编程语言,支持封装、继承、多态等面向对象特性。 健壮性 :Java 在设计时考虑了许多安全检

    2024年02月20日
    浏览(35)
  • 【Java JVM】垃圾回收

    当前大部分的垃圾收集器都遵循着 “分代收集” (Generational Collection) 的理论进行设计的, 建立在 2 个分代假设之上 弱分代假说 (Weak Generational Hypothesis): 绝大多数对象都是朝生夕灭的 强分代假说 (Strong Generational Hypothesis): 熬过越多次垃圾收集过程的对象就越难以消亡 根据这

    2024年03月14日
    浏览(46)
  • JVM(Java虚拟机)

    目录 1.JVM 简介 2. JVM 运行时数据区 2.1程序计数器 2.栈 3.堆 4.方法区 3.类加载 1.loading 2.linking 1.验证 2.准备 3.解析 3.Initializing 4.双亲委派模型 5.JVM垃圾回收机制 1.劣势 2.回收什么 3.垃圾回收具体怎么回收 1.找垃圾 方法: 问题: 2.释放垃圾 JVM 是 Java Virtual Machine 的简称,意为 Java虚

    2024年02月01日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包