Java 8 是否缓存方法引用以及何时应考虑缓存它们?
Java 8 中的方法引用缓存:详细检查
简介
使用时Java 8 的方法参考中,出现了一个关于缓存的潜在好处的问题。本文探讨了缓存方法引用的含义,并就其何时发挥优势提供了指导。
区分调用站点和方法引用执行
区分这一点至关重要使用无状态或有状态 lambda 频繁执行同一调用点,以及不同方法频繁使用对同一方法的方法引用之间call-sites.
示例分析
考虑以下示例:
Runnable r1 = null; for (int i = 0; i < 2; i++) { Runnable r2 = System::gc; if (r1 == null) { r1 = r2; } else { System.out.println(r1 == r2 ? "shared" : "unshared"); } }
这里,同一个调用点被执行两次,产生无状态 lambda,实现将打印“共享”。
Runnable r1 = null; for (int i = 0; i < 2; i++) { Runnable r2 = Runtime.getRuntime()::gc; if (r1 == null) { r1 = r2; } else { System.out.println(r1 == r2 ? "shared" : "unshared"); System.out.println(r1.getClass() == r2.getClass() ? "shared class" : "unshared class"); } }
与在这个示例中,同一个调用站点被执行两次,生成一个包含对运行时实例的引用的 lambda,并且该实现将打印“unshared”但“shared class”。
Runnable r1 = System::gc, r2 = System::gc; System.out.println(r1 == r2 ? "shared" : "unshared"); System.out.println(r1.getClass() == r2.getClass() ? "shared class" : "unshared class");
相反,最后一个示例包括两个单独的调用站点,生成等效的方法引用,但从 Java 8.0.05 开始,它将打印“unshared”和“unshared” class."
JVM 行为
Java 虚拟机 (JVM) 在处理方法引用方面发挥着重要作用。它使用invokedynamic指令,该指令引用LambdaMetafactory中的JRE引导方法。编译器提供生成 lambda 实现类所需的参数。
JVM 可以灵活地记住和重用第一次调用期间形成的 CallSite 实例。对于无状态 lambda 和单个调用站点,JVM 通常会创建一个 ConstantCallSite,其中包含常量对象的 MethodHandle。
另一方面,对于带有参数的 lambda(例如 this::func),JVM 可能会缓存它们,但它涉及维护参数和 lambda 实例之间的映射的额外开销。目前,JVM 不缓存此类 lambda。此行为类似于对不同调用站点创建的相同目标方法的方法引用。
缓存注意事项
基于上述几点,缓存方法引用可能会产生不同的结果,但不一定有更好的性能。在实施任何缓存机制之前应测量性能影响。在某些特定情况下,缓存可能会有所帮助:
- 当多个调用点引用同一个方法时
- 当在构造函数/类初始化中创建 lambda 时
- 当使用点将由多个并发执行时线程
- 当第一个 lambda 调用的较低性能是关注
结论
在某些场景下,缓存方法引用可以是一种优化技术。然而,缓存的决定应该基于对代码和具体性能要求的仔细分析。 JVM 对方法引用的处理为优化 Java 8 中的 lambda 和方法引用使用提供了坚实的基础。
以上是Java 8 是否缓存方法引用以及何时应考虑缓存它们?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

在使用IntelliJIDEAUltimate版本启动Spring...

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...

在使用TKMyBatis进行数据库查询时,如何优雅地获取实体类变量名以构建查询条件,是一个常见的难题。本文将针...
