簡體   English   中英

為什么Java代碼在調試器中會變慢?

[英]Why does Java code slow down in debugger?

通過調試器運行時,一些CPU密集型例程會顯着變慢。 為什么是這樣?

目前我只是使用IntelliJ來逐步運行在JBoss中運行的代碼。 當我啟動JBoss時,我使用以下選項:

set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MaxPermSize=256m -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n %JAVA_OPTS%

有沒有辦法加快執行速度? 或者加速我不需要介入的某些方法執行?


更新 :似乎我沒有跨越/進入CPU密集型例程(即:只運行直到例程之后設置的斷點),然后執行時間就好像不在調試器中。

通過調試器運行時,一些CPU密集型例程會顯着變慢。 為什么是這樣?

因為啟用調試時,JITter不會優化代碼(通常,根本不會)。

它還取決於“斷點式”。 例如,在變量上設置觀察點或在接口級別上設置斷點(調試器將在執行時停止在所有方法實現上),這通常會大大減慢處理時間。

調試時,除運行應用程序外,還運行調試器。

代碼在調試模式下編譯,包含有關局部變量和其他源級信息的元數據符號。 調試器讀取以知道哪一行源代碼與當前指令相對應。 該過程稱為符號調試 存儲的符號會增加代碼大小並解釋它們會增加執行時間。

有些調試器實際上會動態解釋代碼,這幾乎總是一個主要的性能損失。

有關Java的調試編譯模式的更多信息,該模式由javac執行,並在類文件中包含調試信息Java語言編譯器選項 例如: -g生成所有調試信息,包括局部變量。

你需要考慮另一個程序 - 調試器 - 被掛鈎到你的程序中,並且正在觀察異常之類的事情。 它還監視當前行,以便對斷點或用戶請求的中斷作出反應(如暫停請求或監視條件)。

調試由JIT生成的優化代碼將非常困難,因為一系列本機指令與一系列Java代碼之間沒有直接關系,就像一系列Java字節碼和一行Java代碼之間存在關系。

因此,在調試器中進入函數會強制JVM取消優化您正在逐步執行的方法。 Hotspot根本不生成本機代碼,只是解釋方法的字節碼。

在JDK 1.4.1開始啟用調試之前,強制JVM僅使用解釋器: http//java.sun.com/products/hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_3.html#full

頂部提示: 在IDEA中,您可以使用ALT + F9運行到放置光標的位置,而不是設置額外的斷點。

我發現有趣的是,如果您正在遍歷可從堆棧訪問的大量數據的代碼,則IDEA中的調試變得非常慢。 不要忘記,IDEA收集這些數據(當前在詞匯范圍內的任何內容)並將其作為一個對象樹呈現給您,以瀏覽您是否“正在觀看”並在每個后續步驟中執行此操作(可能是每次創建樹?)。

例如,當存在大集合作為“當前”對象的實例變量時,這尤其明顯。

如果使用Java 5,則調試參數為:

-agentlib:JDWP =運輸= dt_socket,服務器= Y,暫停= n時,地址=

在Java 5之前

-Xdebug -Xrunjdwp:transport = dt_socket,address = 5005,server = y,suspend = n

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM