jvm和反射

jvm和反射


仅作为作者学习笔记


前言


仅作为作者学习笔记

一、反射的基本实现

反射有两种实现方式:

  • 本地方法调用(就是字节码中已经定义好的方法)
  • 动态生成字节码

两者有什么区别?

  • 动态生成字节码(以下简称动态实现),生成字节码的过程很慢(类似于准备工作),但是执行效率高。
  • 本地方法调用,不用生成字节码,直接调用本地方法。所以准备工作几乎没有,很快。但是执行效率就差很多。

JVM如何做决定选择哪种实现方式?

动态实现和本地实现相比,其运行效率要快上 20 倍 。这是因为动态实现无需经过 Java 到 C++ 再到 Java 的切换,但由于生成字节码十分耗时仅调用一次的话,反而是本地实现要快上 3 到 4 倍 。考虑到许多反射调用仅会执行一次,Java 虚拟机设置了一个阈值 15(可以通过 -Dsun.reflect.inflationThreshold= 来调整),当某个反射调用的调用次数在 15 之下时,采用本地实现;当达到 15 时便开始动态生成字节码,并将委派实现的委派对象切换至动态实现这个过程我们称之为 Inflation

  • 通过反射执行的次数来决定,默认值是15。15次之前直接本地调用,之后动态实现。

JVM为啥分两种实现方式?

  • 本地实现的调用流程复杂。而在执行多次的情况下,复杂意味着性能损耗,所以有一种适合多次执行的解决方案,就是动态生成字节码。

反射的缺点原因?

  • 方法的反射调用会带来不少性能开销,原因主要有三个变长参数方法导致的 Object 数组基本类型的自动装箱、拆箱还有最重要的方法内联。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值