日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入理解JVM(8)——类加载的时机

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解JVM(8)——类加载的时机 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、類的生命周期

  • 一個類從加載進內存到卸載出內存一共要經歷7個階段:加載—》驗證—》準備--》解析—》初始化—》使用—》卸載。
  • 類加載包括五部分:加載—》驗證—》準備--》解析—》初始化
  • 在類加載的過程中,以下三個過程成為連接:驗證—》準備--》解析
  • 因此,JVM的類加載過程可以分為三個部分:加載—》連接—》初始化
  • c/c++語言在程序運行之前需要完成預處理、編譯、匯編、連接,但是在Java語言中類加載(加載、連接、初始化)是在程序運行期間完成。在程序運行期間完成類加載過程會增加程序的開銷,但是隨之會帶來更大的好處—能夠提高程序的靈活性。Java語言的靈活性主要體現在在程序運行期間能夠動態的擴展,所謂的動態擴展就是動態加載和動態鏈接。
  • 二、類加載的時機

  • 類加載過程中每個步驟的順序
  • a)??????? 加載、驗證、準備、初始化是按照先后順序依次執行的

    b)??????? 解析過程會發生在初始化過程中

  • 類加載過程中“初始化”開始的時機:JVM規范中只定義了類加載過程中初始化過程開始的時機,加載、連接過程都應該在初始化之前開始(解析除外)
  • a)??????? 在類加載過程中遇到如下指令(new、getstatic、putstatic、invokestatic),如果當前的類尚未初始化,那么就要進行初始化。分別對應的Java代碼場景為:

  • 通過new創建一個對象
  • 讀取、設置一個類的靜態成員變量(final修飾的成員變量除外)
  • 調用一個類的靜態成員函數
  • b)??????? 使用Java.lang.reflect進行發射調用的時候,如果這個類沒有被初始化,那么就要先進行初始化

    c)??????? 當初始化一個類時,如果這個類的父類還沒有被初始化,那么先初始化這個類的父類,再初始化這個類

    d)??????? 當虛擬機啟動的時候,虛擬機會首先初始化帶有main方法的類

  • 主動引用和被動引用
  • JVM虛擬機規范中要求在程序運行過程中,“當且僅當”出現上述4個條件之一的情況才會初始化一個類。如果間接滿足上述初始化條件是不會初始化類的。其中,直接滿足上述初始化條件的情況叫做主動引用;間接滿足上述初始化過程的情況叫做被動引用。

    那么,只有當程序在運行過程中滿足主動引用的時候才會初始化一個類,若滿足被動引用就不會初始化一個類。

  • 接口的初始化和類的初始化比較和區別
  • 類和接口都需要初始化,他們初始化的過程大致相同,不同點在于:類初始化過程中如果發現該類的父類尚未被初始化,那么會先初始化父類,然后再初始化這個類;但是接口初始化的時候,并不要求父類已經全部初始化,當程序運行過程中需要用到父類的東西的時候在初始化父類接口。

    轉載于:https://www.cnblogs.com/BaoZiY/p/10632227.html

    總結

    以上是生活随笔為你收集整理的深入理解JVM(8)——类加载的时机的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。