簡體   English   中英

使用ASM將現有的Java對象加載到堆棧上

[英]Loading an existing java object onto stack using ASM

我正在嘗試將ASM用於我的項目,並遇到一個性能問題,在該問題中,我嘗試使用靜態方法來獲取所需的對象,其調用時間約為1000次

visitor.visitMethodInsn(Opcodes.INVOKESTATIC, TrackingConstants.TO_HELPER_CLASS, "getRTTDObject",TrackingConstants.TO_HELPER_GET_CLIENT_METHOD_DESC);

visitor.visitMethodInsn(Opcodes.INVOKEINTERFACE, TrackingConstants.CLIENT_INTERFACE_CLASS, "getPattern",TrackingConstants.CLIENT_INTERFACE_CLASS_GETPATTERN_METHOD_DESC);     

第一次調用使我產生開銷(在這里我得到了所需的對象,並傳遞到下一行以對該對象執行“ getPattern”。在調查過程中,我意識到我嘗試通過靜態方法檢索的對象對我來說是可用的)。自啟動,因此,如果我能夠將該Java對象推入堆棧並避免進行靜態調用,那么我就不會遇到任何性能問題。

我嘗試了幾種運氣不佳的方法,最后嘗試創建對象的新字段,但得到了一個類似於本文的IllegalArgumentException。通過鏈接后,我用匯編語言4創建了一個新字段,我意識到我們需要編寫代碼來創建對象並不能直接使用現有對象。

所以沒有辦法將現有的Java對象加載到堆棧上(我想它已經在堆棧上了,有沒有辦法可以使用它)並執行所需的操作,而不是使用靜態調用來獲取它? 有辦法可以實現嗎?

一旦對象位於堆棧上(大概是在您第一次調用靜態方法之后),您可以:

  1. 每次發出一條DUP指令以復制堆棧中已經存在的值。 這可能是性能最高的選項,但是它要求您以某種方式設計字節碼,以使該值在需要時始終位於堆棧的頂部/附近。 DUP指令有幾種變體可供選擇,每種變體具有不同的行為。 有關詳細信息,請參見JVM規范§6.5

  2. 調用一次靜態方法,然后將結果存儲在一個臨時變量中(使用ASTORE指令變體之一)。 需要時,使用相應的ALOAD變體將其壓入堆棧。

根據您的方法的結構,您還可以結合使用這些技術(從臨時本地加載,根據需要DUP ,執行無關的操作,重復操作等)。

暫無
暫無

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

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