1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          jvm內存模型(java中JVM內存模型的介紹)

          來源:互聯網轉載 時間:2024-05-12 22:05:51

          JVM 的重要性

          首先你應該知道,運行一個 Java 應用程序,我們必須要先安裝 JDK 或者 JRE 。這是因為 Java 應用在編譯后會變成字節碼,然后通過字節碼運行在 JVM 中,而 JVM 是 JRE 的核心組成部分。

          優點

          JVM 不僅承擔了 Java 字節碼的分析(JIT compiler)和執行(Runtime),同時也內置了自動內存分配管理機制。這個機制可以大大降低手動分配回收機制可能帶來的內存泄露和內存溢出風險,使 Java 開發人員不需要關注每個對象的內存分配以及回收,從而更專注于業務本身。

          缺點

          這個機制在提升 Java 開發效率的同時,也容易使 Java 開發人員過度依賴于自動化,弱化對內存的管理能力,這樣系統就很容易發生 JVM 的堆內存異常、垃圾回收(GC)的不合適以及 GC 次數過于頻繁等問題,這些都將直接影響到應用服務的性能。

          內存模型

          JVM 內存模型共分為5個區:堆(Heap)、方法區(Method Area)、程序計數器(Program Counter Register)、虛擬機棧(VM Stack)、本地方法棧(Native Method Stack)。

          其中,堆(Heap)、方法區(Method Area)線程共享,程序計數器(Program Counter Register)、虛擬機棧(VM Stack)、本地方法棧(Native Method Stack)線程隔離。

          堆(Heap)

          堆是 JVM 內存中最大的一塊內存空間,該內存被所有線程共享,幾乎所有對象和數組都被分配到了堆內存中。

          堆被劃分為新生代和老年代,新生代又被進一步劃分為 Eden 區和 Survivor 區,最后 Survivor 由 From Survivor 和 To Survivor 組成。

          隨著 Java 版本的更新,其內容又有了一些新的變化: >在 Java6 版本中,永久代在非堆內存區;到了 Java7 版本,永久代的靜態變量和運行時常量池被合并到了堆中;而到了 Java8,永久代被元空間(處于本地內存)取代了。

          為什么要用元空間替換永久代呢?

          1. 為了融合 HotSpot JVM 與 JRockit VM,因為 JRockit 沒有永久代,所以不需要配置永久代。

          2. 永久代內存經常不夠用或發生內存溢出(應該是 JVM 中占用內存最大的一塊),產生異常 java.lang.OutOfMemoryError: PermGen。在 JDK1.7 版本中,指定的 PermGen 區大小為 8M,由于 PermGen 中類的元數據信息在每次 FullGC 的時候都可能被收集,回收率都偏低,成績很難令人滿意;還有,為 PermGen 分配多大的空間很難確定,PermSize 的大小依賴于很多因素,比如,JVM 加載的 class 總數、常量池的大小和方法的大小等。

          看到這兒,自然就想到了 GC 回收算法,不用急,我會在之后的文章中進行講解,現在還是以 JVM 內存模型為主。

          方法區(Method Area)

          什么是方法區? >方法區主要是用來存放已被虛擬機加載的類相關信息,包括類信息、常量池(字符串常量池以及所有基本類型都有其相應的常量池)、運行時常量池。這其中,類信息又包括了類的版本、字段、方法、接口和父類等信息。

          類信息

          JVM 在執行某個類的時候,必須經過加載、連接、初始化,而連接又包括驗證、準備、解析三個階段。

          在加載類的時候,JVM 會先加載 class 文件,而在 class 文件中便有類的版本、字段、方法和接口等描述信息,這就是類信息。

          常量池

          在 class 文件中,除了類信息,還有一項信息是常量池 (Constant Pool Table),用于存放編譯期間生成的各種字面量符號引用。

          字面量符號引用又是什么呢?

          字面量包括字符串(String a=“b”)、基本類型的常量(final 修飾的變量),符號引用則包括類和方法的全限定名(例如 String 這個類,它的全限定名就是 Java/lang/String)、字段的名稱和描述符以及方法的名稱和描述符。

          運行時常量池

          當類加載到內存后,JVM 就會將 class 文件常量池中的內容存放到運行時常量池中;在解析階段,JVM 會把符號引用替換為直接引用(對象的索引值)。

          例如: >類中的一個字符串常量在 class 文件中時,存放在 class 文件常量池中的。 > >在 JVM 加載完類之后,JVM 會將這個字符串常量放到運行時常量池中,并在解析階段,指定該字符串對象的索引值。

          運行時常量池是全局共享的,多個類共用一個運行時常量池,因此,class 文件中常量池多個相同的字符串在運行時常量池只會存在一份。

          講到這里,大家是不是有些頭暈了,說實話,我在看到這些內容的時候,也是云里霧里的,這里舉個例子幫助大家理解:

          publicstaticvoidmain(String[]args){Stringstr="Hello";System.out.println((str==("Hel"+"lo")));StringloStr="lo";System.out.println((str==("Hel"+loStr)));System.out.println(str==("Hel"+loStr).intern());}

          其運行結果為:

          truefalsetrue

          第一個為 true,是因為在編譯成 class 文件時,能夠識別為同一字符串的, JVM 會將其自動優化成字符串常量,引用自同一 String 對象。

          第二個為 false,是因為在運行時創建的字符串具有獨立的內存地址,所以不引用自同一 String 對象。

          最后一個為 true,是因為 String 的 intern() 方法會查找在常量池中是否存在一個相等(調用 equals() 方法結果相等)的字符串,如果有則返回該字符串的引用,如果沒有則添加自己的字符串進入常量池。

          涉及到的Error
          1. OutOfMemoryError出現在方法區無法滿足內存分配需求的時候,比如一直往常量池中加入數據,運行時常量池就會溢出,從而報錯。

          程序計數器(Program Counter Register)

          程序計數器是一塊很小的內存空間,主要用來記錄各個線程執行的字節碼的地址,例如,分支、循環、跳轉、異常、線程恢復等都依賴于計數器。

          由于 Java 是多線程語言,當執行的線程數量超過 CPU 數量時,線程之間會根據時間片輪詢爭奪 CPU 資源。如果一個線程的時間片用完了,或者是其它原因導致這個線程的 CPU 資源被提前搶奪,那么這個退出的線程就需要單獨的一個程序計數器,來記錄下一條運行的指令。

          由此可見,程序計數器和上下文切換有關。

          虛擬機棧(VM Stack)

          >虛擬機棧是線程私有的內存空間,它和 Java 線程一起創建。 > >當創建一個線程時,會在虛擬機棧中申請一個線程棧,用來保存方法的局部變量、操作數棧、動態鏈接方法和返回地址等信息,并參與方法的調用和返回。 > >每一個方法的調用都伴隨著棧幀的入棧操作,方法的返回則是棧幀的出棧操作。

          可以這么理解,虛擬機棧針對當前 Java 應用中所有線程,都有一個其相應的線程棧,每一個線程棧都互相獨立、互不影響,里面存儲了該線程中獨有的信息。

          涉及到的Error
          1. StackOverflowError出現在棧內存設置成固定值的時候,當程序執行需要的棧內存超過設定的固定值時會拋出這個錯誤。

          2. OutOfMemoryError出現在棧內存設置成動態增長的時候,當JVM嘗試申請的內存大小超過了其可用內存時會拋出這個錯誤。

          本地方法棧(Native Method Stack)

          >本地方法棧跟虛擬機棧的功能類似,虛擬機棧用于管理 Java 方法的調用,而本地方法棧則用于管理本地方法的調用。 > >但本地方法并不是用 Java 實現的,而是由 C 語言實現的。

          也就是說,本地方法棧中并沒有我們寫的代碼邏輯,其由native修飾,由 C 語言實現。

          感謝各位的閱讀,以上就是“java中JVM內存模型的介紹”的內容了,經過本文的學習后,相信大家對java中JVM內存模型的介紹這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是本站,小編將為大家推送更多相關知識點的文章,歡迎關注!

          標簽:jvm內存模型-

          c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...

          2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...

          :喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...

          開通花唄有風險嗎?開通花唄是沒有風險的,其本質是個人小額貸款服務,主要依托于各種消費場景。用戶在開通花唄時,假如頁面跳轉到了人臉識別,則需要用戶完成人臉識別后才可以開通花唄。開通花唄是好還是不好?有利的方面:與很多信貸產品相比較,花唄支持的場景幾乎是最全面的,不僅包括支付寶本身的購物商城,小到日常生活中比如買早餐等都是可以進行支付的,很多平臺的產品基本上都不能做到;其次花唄使用是沒有費用的,除了用...

          什么是基金交易賬戶?基金交易賬戶是銀行為投資者設立的用于在本行進行基金交易的帳戶。投資者通過銀行代銷網點辦理基金業務時,必須先開立基金交易帳戶。該帳戶用于記載投資者進行基金交易活動的情況和所持有的基金份額?;鸾灰踪~戶是投資人通過該銷售機構買賣基金份額的變動及結余情況的賬戶?;鸾灰踪~戶和TA賬戶的區別在哪?1、同一個人的身份證只能對應一個TA賬戶,但是基金賬戶可以對應多個;2、TA賬戶相關的是銀...

          (資料圖片)關于林依晨什么時候結的婚的知識大家了解嗎?以下就是小編整理的關于林依晨什么時候結的婚的介紹,希望可以給到大家一些參考,一起來了解下吧!林依晨是2014年12月24日結婚的,她的老公是林于超兩人戀愛和結婚都非常的低調,在結婚的時候也沒有開放媒體采訪,并且兩人也只是邀請了親朋好友并沒有搞的非常盛大。不過兩人的婚禮現場還是被一些親友曝光了,現場主題以紅色為主看起來很喜慶。林依晨和林于超相識多...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>