天天看點

jvm自增,自減運作原理

在jvm中,涉及到變量運算時,會發生壓棧彈棧等動作,但如果僅僅是自增和自減,那麼jvm會直接在本地變量中實作。

這段代碼很簡單,運作結果為2,2,1,2。

對于這樣的結果大家可能都覺得是對的,因為c=c++的時候會先執行指派操作,再進行自增,是以c等于1。但是c進行指派之後,自增的操作也是c本身,為什麼c這個變量不等于自增後的數值呢?

我們使用javap來将這段代碼進行解析,結果如下:

下面我們來分析一下,前面0-7可以看出是定義了4個變量,分别進行壓棧和彈棧操作,将變量最終放入到本地變量中。9這個操作就對應于代碼中的a++,可以看出沒有進行壓棧和彈棧,隻是執行了iinc,也就是自增操作,是以這個時候,本地變量中a就等于2。12對應于代碼中的++b,情況和9類似。c=c++對應于15-19,從這裡可以看出,jvm先執行了壓棧,将c壓入棧頂,然後執行自增操作,是以這個時候,棧頂的c為1,本地變量c為2,但是在這個時候,19又将棧頂的c彈棧并指派給本地變量c了,是以本地變量c最終為1。d=++d和上面原理是一緻的。

通過對代碼的彙編碼的分析,我們可以知道c=c++為什麼等于自增前的c了,其實不是因為先進行了指派,自增後的資料沒有再次指派,而是由于自增後被原資料給覆寫了。