JVM JIT编译器如何优化“重复”的Java代码?

7
我负责维护一个基于JSP的应用程序,运行在IBM WebSphere 6.1(IBM J9 JVM)上。所有的JSP页面都有一个静态包含引用,在这个包含文件中声明了一些静态Java方法。它们被包含在所有的JSP页面中,以提供对这些实用静态方法的“易存取性”。我知道这是一种非常糟糕的工作方式,我正在努力改变这种情况。但是,仅仅出于好奇,并为了支持我改变这种情况的努力,我想知道JVM JIT编译器如何优化这些“重复”的静态方法。
  • 即使具有完全相同的签名,它们也会被分别优化吗?
  • JVM JIT编译器是否“看到”这些方法完全相同并提供“统一”的JIT编译代码?

你能否提醒我一下 static include 的语法是什么? - OscarRyz
1
这是一个使用JSP指令(<%@ page include="includeFile.inc" %>)的包含文件。在编译时,“includeFile.inc”的内容被静态地包含在JSP代码中。可以使用JSP标签(jsp:include)进行动态包含,其中可以引用URL并在运行时包含内容。使用该标签,您还可以选择进行静态包含。 - Renan Mozone
+1 支持。我曾经和你现在的处境一模一样。唯一不同的是,在我继承的项目中,这些“静态”方法被剪切并粘贴到每个 JSP 页面中。 - Alexander Pogrebnyak
3个回答

11
每个 JSP 页面都会被编译成一个唯一的类,因此包含的代码也将编译为不同的类。JIT 不会将各个副本的代码合并为一个。
为避免这种情况,您可以将导入的代码放入一个真正的 Java 类中,并在 JSP 中导入该类。然后由于您正在重用相同的类,所以不会有重复的问题。

3
@mdma的回答对于当前的JVM是正确的,但需要在几个方面做出说明。
1. 未来JVM中的即时编译器可能会支持侵略性优化,以减少本地代码的内存占用。
2. 另一方面,除非您有数千个不同的JSP文件,否则每个JSP类的少量静态方法开销对您的Web应用程序的内存占用不会产生太大影响。

0

您可以从单个类中使用静态导入:<%@ page import="static foo.*" %>。

这样,您就不再需要所有这些重复的内容。除了导入之外,您不需要触及任何其他东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接