2010-06-17 72 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應用程序的內存佔用量產生很大影響。