2009-12-09 64 views
19

我最近注意到有幾個java庫(JDK,joda time,iText)沒有一些/所有的調試信息。局部變量信息丟失,或者局部變量信息和行號都丟失。爲什麼一些java庫沒有調試信息編譯

這是否有任何理由?我意識到它使編譯的代碼更大,但我不認爲這是一個特別大的考慮因素。或者它只是建立在默認的編譯選項上?

謝謝。

+0

通常情況下,您應該能夠下載lib的未優化/「可調試」版本,或者您可以咬下子彈並自己下拉src – Ian 2009-12-09 09:06:40

回答

34

默認的編譯選項不包含調試信息,您必須具體告訴編譯器將其包含在內。大多數人省略它有幾個原因:

  • 某些庫被用於嵌入式系統(如手機)。直到最近,每一點都算在內。今天,大多數移動設備的內存都比1985年的所有計算機都多;
  • 在調試活動時編譯時,代碼運行速度降低了5%。沒有太多,但再次,在某些情況下,每個週期都很重要
  • 今天的高級開發人員出生在64KB內存非常龐大的時代。昨天,我又在地下室的另一臺服務器上增加了2TB硬盤。這是25年來的7個數量級。人類需要更多時間進行調整。

正如John指出的那樣,Java字節碼在今天已經不再被優化(很多)了。所以對於這兩種情況,類文件的輸出將是相同的(只有帶調試信息的類文件會更大)。該代碼在JIT運行時進行了優化,允許運行時爲CPU優化代碼,內存(數量和佈局)等。

提到的5%懲罰是當您運行代碼並添加命令行允許遠程調試器附加到進程的選項。如果您不啓用遠程調試,則不會受到任何處罰(類加載除外,但只發生一次)。

+0

此外,當您在調試時編譯你也可以在不優化代碼的情況下進行編譯(否則行號將毫無意義),所以你會失去(靜態/最終/私有)方法/屬性的性能優勢 – Ian 2009-12-09 09:05:03

+2

@iAn:在Java中,使用優化進行編譯是總之毫無意義 - IIRC他們已經取消了這個選項,或者讓它變成了一個無效的選項。您不會失去性能,因爲優化是由JIT執行的。 – 2009-12-09 09:10:44

+7

是的,今天,Java代碼在運行時進行了優化。 5%的速度懲罰實際上是在*運行附帶遠程調試器選項的代碼時。 – 2009-12-09 09:52:16

0

安裝的可能大小。調試信息增加了Sun可能不喜歡的jar文件的開銷。

我最近研究一個Java Web Start的問題 - 沒有調試信息可用 - 所以加滿跟蹤到java控制檯和下載源代碼幫助一些,但代碼是相當糾結所以我只是想調試建立。

JDK應該隨處編譯FULL調試信息!

+0

FYI有一個包含調試信息的JDK6u18 DEBUG jar。它比替代品大20mb左右。看到這裏:http://download.java.net/jdk6/ – 2010-01-13 01:27:07