当前位置: 首页 > 面试题库 >

为什么将类定义为final可以提高JVM性能?

戚逸清
2023-03-14
问题内容

引用http://sites.google.com/site/gson/gson-design-
document

为什么Gson中的大多数课程都标记为期末考试?

尽管Gson通过提供可插入的串行器和反序列化器提供了相当可扩展的体系结构,但Gson类并不是专门设计为可扩展的。提供非最终类将允许用户合法地扩展Gson类,然后期望该行为在所有后续修订版中均有效。我们选择通过将类标记为final来限制此类用例,并等待一个好的用例出现以允许扩展。将课程标记为final还具有次要的好处,那就是为Java编译器和虚拟机提供其他优化机会。

为什么会这样呢?[如果我猜:JVM知道类是最终的,它不会维护方法重写表吗?还有其他原因吗?]

性能有什么好处?

这是否适用于频率实例化的类(POJO?)或适用于持有者静态方法的类(实用程序类)?

理论上定义为final的方法也可以提高性能吗?

有什么影响吗?

谢谢马克西姆。


问题答案:

虚拟(重写)方法通常是通过某种表(vtable)实现的,该表最终是一个函数指针。每个方法调用都有必须通过该指针的开销。当将类标记为final时,则无法覆盖所有方法,并且不再需要使用表-
这样可以更快。

某些VM(例如HotSpot)可能会更智能地执行操作,并知道何时不重写方法并酌情生成更快的代码。

这是有关HotSpot的一些更具体的信息。还有一些一般信息。



 类似资料:
  • 可以将hibernate的实体类定义为final,但这种做法不好。 因为hibernate会使用代理模式在延迟关联的情况下提高性能,如果你把实体类定义成final类之后,因为Java不允许对final类进行扩展,所以hibernate就无法再使用代理了,如此一来就限制了使用可以提升性能的手段。 不过,如果你的持久化类实现了一个接口,而且在该接口中声明了所有定义于实体类中的所有public的方法的话

  • 本文向大家介绍hibernate 实体类可以被定义为 final 吗?相关面试题,主要包含被问及hibernate 实体类可以被定义为 final 吗?时的应答技巧和注意事项,需要的朋友参考一下 实体类可以定义为 final 类,但这样的话就不能使用 hibernate 代理模式下的延迟关联提供性能了,所以不建议定义实体类为 final。

  • 我正在讨论以下问题:使用Java 8的可选和stream::FlatMap并希望向自定义的添加一个方法,然后检查它是否工作。 更准确地说,我希望向我的添加一个。如果不存在值,则返回一个空流,如果存在,则返回一个包含单个元素的流。 但是,我得出的结论是,声明为final。 为什么会这样呢?有一些类没有声明为final,我个人认为这里没有理由声明final。 作为第二个问题,为什么不是所有的方法都是f

  • 问题内容: 在我的Linux机器上,是一个普通的旧机器。DO 拥有一种特殊的原子质量? 问题答案: C99 仅符合非常小的“原子性”定义,因为 C99没有并发概念 ,只有可中断性。(C2011添加了一个并发模型,并使用它来保证更强的类型;但是,AFAIK 保持不变,因为其 存在的理由 仍然是与信号处理程序通信,而不是跨线程。) 这就是C99所说的: (第7.14节,第2段)定义的类型为,它是对象的

  • 问题内容: 当我得知该类在Java中被声明为final时,我想知道为什么会这样。那时我没有找到任何答案,但是这篇文章:如何在Java中创建String类的副本?让我想起了我的疑问。 当然,String提供了我所需要的所有功能,而且我从未想过需要扩展String类的任何操作,但是您仍然永远不会知道有人可能需要什么! 那么,有谁知道设计师决定将其定稿时的意图是什么? 问题答案: 将字符串实现为不可变对

  • 本文向大家介绍为什么虚拟dom会提高性能?相关面试题,主要包含被问及为什么虚拟dom会提高性能?时的应答技巧和注意事项,需要的朋友参考一下 虚拟dom相当于在js和真实dom中间加了一个缓存,利用dom diff算法避免了没有必要的dom操作,从而提髙性能。 具体实现步骤如下: 1. 用JavaScript对象结构表示DOM树的结构;然后用这个树构建一个真正的DOM树,插到文档当中 2.当状态变更