2010-06-17 123 views
7

我负责维护在IBM WebSphere 6.1(IBM J9 JVM)上运行的基于JSP的应用程序。所有的JSP页面都有一个静态包含引用,在这个包含文件中有一些声明的静态Java方法。它们被包含在所有JSP页面中,以提供对这些实用程序静态方法的“轻松访问”。我知道这是一种非常糟糕的工作方式,我正在努力改变这种情况。但是,仅仅为了好奇,并且为了支持我改变它的努力,我想知道如何通过JVM JIT编译器优化这些“重复”的静态方法。JVM JIT编译器如何优化“重复”Java代码?

  • 即使拥有完全相同的签名,它们是单独优化的吗?
  • JVM JIT编译器是否“看到”这些方法完全相同并提供了“统一的”JIT代码?
+0

你能不能刷新我的想法,告诉我'static include'的语法是什么? – OscarRyz 2010-06-17 23:12:03

+1

它是一个使用JSP指令的包含(<%@ page include =“includeFile.inc”%>)。 “includeFile.inc”的内容在编译时静态包含在JSP代码中。动态包含可以使用JSP标记()完成,您可以在其中引用URL并在运行时包含内容。使用标签你也可以选择做一个静态包含。 – 2010-06-17 23:26:08

+0

+1表示支持。我已经到了你现在所在的位置。在我继承的项目中,唯一的区别是这些'static'方法被剪切并粘贴到每个JSP页面中。 – 2010-06-17 23:33:26

回答

11

每个JSP页面都被编译为一个独特的类,因此包含的代码也将被编译为不同的类。 JIT不会将代码的各种副本合并为一个。

为了避免这种情况,您可以将导入的代码放入真实的Java类中,然后将其导入到JSP中。那么就不会有重复,因为你正在重复使用同一个类。

0

您可以使用来自单个类的静态导入:<%@ page import =“static foo。*”%>。

然后你不再有所有的重复。除了导入之外,您不需要再碰其他东西。

3

@ mdma的答案对于当前JVM是正确的,但需要在几个方面进行限定。

  1. 未来JVM中的JIT可能可以支持积极的优化以减少本机代码的内存占用量。

  2. 另一方面是,除非您有成千上万个不同的JSP,否则很可能每个JSP类的几个静态方法的开销不会对Web应用程序的内存占用量产生很大影响。