`
chong_zh
  • 浏览: 69654 次
  • 来自: 杭州
社区版块
存档分类
最新评论

关于Java反射的性能问题及其常见的处理方法

 
阅读更多
调用Java的反射API是有较高的性能开销的,这方面的性能比较文章较多,在此不赘述。

原因
纠其原因,性能的开销主要在两方面:
1.产生了Dynamic Resolve
无论是通过字符串获取Class、Method还是Field,都需要JVM的动态链接机制动态的进行解析和匹配,势必造成性能开销。

2.安全性验证
每一次的反射调用都会造成Java安全机制进行额外的安全性验证,造成性能开销。

3.影响运行时优化
反射代码使得许多JVM的运行时优化无法进行。


处理方法
针对此,常见的处理方法主要有以下几种:

1.使用Cache
针对上述原因1: 对通过反射调用获得的Class、Method、Field实例进行缓存,避免多次Dynamic Resolve。


2.使用MethodHandle类
针对上述原因2:Java 7开始提供了java.lang.invoke.MethodHandle类,MethodHandle类的安全性验证在获取实例时进行而不是每次调用时都要进行验证,减小开销。

3.使用Runtime创建的类
该方法最为强大,可以针对上述原因1、2、3进行全面优化。具体做法为:
  • 在编译时设计好一个接口,由该接口封装所有的反射调用。
  • 在运行时动态生成一个类实现该接口,该动态生成的类一旦完成define就和普通类没有区别,不需要后续的Dynamic Resolve,没有额外的安全性验证,也不会影响JVM的运行时优化。

该方法不能覆盖反射API的所有Use case,例如某个反射调用需要修改某实例的private字段,是无法动态生成一个合法的类这样去做的。

关于具体如何动态生成符合条件的类可以参考Javassit,本质上还是用到了Classloader截获技术,这种技术是有限制的,例如在安全性级别较高的Applet运行环境中就有很多使用限制。
分享到:
评论

相关推荐

    java面试常见问题.docx

    请解释Java中的抽象类和接口的概念及区别是什么? 请解释Java中的泛型(Generic)是什么?它有什么作用? Java中的异常处理机制是什么?如何处理异常? 请解释Java中的多线程是什么?如何创建多线程? Java中的反射...

    Java常见面试题208道.docx

    面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...

    Java 基础核心总结 +经典算法大全.rar

    节点流和处理流 Java IO 的核心类 File Java IO 流对象 字节流对象InputStream OutputStream 字符流对象Reader Writer 字节流与字符流的转换新潮的 NIO 缓冲区(Buffer)通道(Channel) 示例:文件拷贝案例 BIO 和 NIO ...

    Java基础知识点总结.docx

    无论是工作学习,不断的总结是必不可少的。只有不断的总结,发现问题,弥补不足,才能长久的进步!!Java学习更是如此,知识点总结目录如下: 目录 一、 Java概述 3 二、 Java语法基础 5 ...Java 性能优化 362

    常见数据结构及算法(Java语言描述).zip

    健壮性与高性能:Java通过垃圾回收机制确保内存的有效管理,同时也能通过JIT编译器优化来提升运行时性能。 标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用...

    2023java最新学习路线.docx

    5. 设计模式:学习常见的设计模式,如单例模式、工厂模式、观察者模式等,了解如何应用设计模式解决常见的软件设计问题。 第七阶段:企业级项目实战 在第七阶段,您将参与一个实际的企业级项目,将之前学到的...

    java必了解的六大问题

    java方向及学习方法 java分成J2ME(移动应用开发),J2SE(桌面应用开发),J2EE(Web企业级应用),所以java并不是单机版的,只是面向对象语言。建议如果学习java体系的话可以这样去学习: *第一阶段:Java基础,...

    达内java培训目录

    JavaSE核心 异常处理、多线程基础、IO系统、网络编程、Java反射机制、JVM性能调优(JVM内存结构剖析、GC分析及调优、JVM内存参数优化)、Java泛型、JDK新特性 熟练掌握JavaSE核心内容,特别是IO和多线程;...

    JAVA面试题最全集

    一、Java基础知识 1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入...

    java面试题

    50. Java中常见类,方法,接口 23 51. 多线程 23 51.1. 线程的基本概念 23 51.2. Java中的线程有四种状态 23 51.3. 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 24 51.4. 线程同步的方法。 24 51.5...

    Java 知识汇总(资源,工具,笔记,源码,文章,文档分类整理).zip

    多线程,虚拟机,性能优化技巧,反射,复杂算法(红黑树,贪心,动态规划等),网络通信; ## 功能模块 - 【Okhttp接口测试】在[com.gradle.http.uas](/tree/master/src/main/java/com/gradle/api/uas)包名下; - 【Java...

    精通并发与 netty 视频教程(2018)视频教程

    27_gRPC双向流式数据通信详解 28_gRPC与Gradle流畅整合及问题解决的完整过程与思考 29_Gradle插件问题解决方案与Nodejs环境搭建 30_通过gRPC实现Java与Nodejs异构平台的RPC调用 31_gRPC在Nodejs领域中的静态代码生成...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    本书为中南大学精品教材立项项目,分为上下两篇共21章,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领...

    asp.net知识库

    使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法 制作一个简单的多页Tab功能 一完美的关于请求的目录不存在而需要url重写的解决方案! 在C#中实现MSN消息框的功能 XmlHttp实现无刷新三联动ListBox 鼠标...

    java8看不到源码-QuickBuffers:适用于实时环境的Protobuf2库

    ,大多数常见用例在编码和解码速度方面的性能提升大约是 2 倍。 有关更多信息,请参阅 部分。 运行时库 您可以在 Maven Central 上的以下坐标中找到最新版本。 运行时与 Java 6 及更高版本兼容。 < dependency > ...

    leetcode回朔与贪心的题目-interview:面试官的编程

    反射 1.6 线程基础 1.7 Java 8+( >= 11) 新特性 1,8 常见面试题剖析 2. JVM 2.0 自己编译 JDK 2.1 内存区域与OOM 2.1.1 运行时数据区域 2.1.2 2.2 垃圾收集器与内存分配策略 2.3 类加载机制 2.4 JVM 内存模型 2.5 ...

    【卷一/共两卷】AJAX实战pdf高清版90M

    1.4.2 Java Web Start及其相关技术 1.5 小结 1.6 资源 第2章 Ajax新手上路 2.1 Aiax的关键元素 2.2 用JavaScript改善用户体验 2.3 用CSS定义应用的外观 2.3.1 CSS选择器 2.3.2 CSS样式属性 2.3.3简单的CSS例子 2.4 ...

    springmybatis

    而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经过去好久了。但最近突然又对这个ORM 工具感兴趣。因为接下来自己的项目中很有可能采用这个ORM工具。所以在此...

    Linux多线程服务端编程:使用muduo C++网络库

    5.2性能需求. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 112 5.3多线程异步日志. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 114 5.4其他方案. . . . . . . . . ....

Global site tag (gtag.js) - Google Analytics