文章

Java虛擬機器類載入機制

Java程式運行於Java虛擬機器之上,JVM遮罩了底層細節,使得Java程式能夠“一次編譯,到處運行”。在Java語言中,一切皆是物件,代碼一般由類、介面、enum等構成,是一種物件導向的程式設計語言。本文將為你揭示Java虛擬機器如何載入類,一窺Java底層的秘密。類在虛擬機器中的生命週期,可以分為載入、驗證、準備、解析、初始化、使用、卸載幾個階段,其中的驗證、準備、解析統稱為連接。在這裡,讀者可以回憶一下以C語言為代表的面向過程語言如何實現動態連結程式庫,以更好地理解Java物件導向程式設計。通常情況下,虛擬機器都會按照上圖流程管理類的生命週期。然而,Java語言的一大特性——多態支援...

對《深入理解Java虛擬機器》的總結(一)

這是《深入理解Java虛擬機器》第二章和第三章的讀書筆記。Java記憶體區域以下的這張圖給出了JVM所管理的記憶體在運行時的資料區域:JVM棧:它的生命週期和執行緒相同。它描述的是Java方法執行的記憶體模型:每個方法被執行的時候都會創建一個棧幀用於存儲區域變數表、操作棧、動態連結、方法出口等資訊。每一個方法被調用直至執行完成的過程,就對應著一個棧幀在虛擬機器棧中從入棧到出棧的過程。Java堆:Java堆是被所有執行緒共用的一塊記憶體區域,在虛擬機器啟動時創建。此記憶體區域的唯一目的是存放物件的實例,幾乎所有的物件實例都在這裡進行分配記憶體。是垃圾收集器管理的主要區域,因此很多時候也被稱為“...

Java虛擬機器內部結構——JVM8

JVM規範描述的是一種抽象化的虛擬機器的行為,而不是任何一種廣泛使用的虛擬機器實現。要去“正確地”實現一台Java虛擬機器,其實並不像大多數人所想的那樣高深和困難——只需要正確讀取class檔中每一條位元組碼指令,並且能正確執行這些指令所蘊含的操作即可。所有在虛擬機器規範之中沒有明確描述的實現細節,都不應成為虛擬機器設計者發揮創造性的牽絆,設計者可以完全自主決定所有規範中不曾描述的虛擬機器內部細節,例如,運行時資料區的記憶體如何佈局,選用哪種垃圾收集演算法,是否要對虛擬機器位元組碼指令進行一些內部優化操作(如使用即時編譯器把位元組碼編譯為機器碼)。1. Class檔案格式編譯後被Java虛擬...

讀《深入理解Java虛擬機器》

Java虛擬機器運行時資料區物件的創建Java創建物件,在語言層面上使用new關鍵字。虛擬機遇到new關鍵字時,會檢查這個指令的參數是否能在常量池中定位到一個類的符號引用,並且檢查這個符號引用代表的類是否已經被載入、解析和初始化過。如果沒有,那就必須先執行類載入過程。類載入通過之後,虛擬機器將會為新生物件分配記憶體。物件所需的記憶體在類載入完成後就能完全確定。分配記憶體的方法有“指標碰撞”和“空閒清單”兩種方式,如果Java堆是規整的,則採用前者;否則,採用後者。Java堆是否規則和虛擬機器有關。OOM在虛擬機器中,能夠發生OOM的有:虛擬機器棧,本地方法棧,Java堆,方法區,運行時常量。...

Java虛擬機器的體系結構

剛才已經提到,JVM可以由不同的廠商來實現。由於廠商的不同必然導致JVM在實現上的一些不同,然而JVM還是可以實現跨平臺的特性,這就要歸功於設計JVM時的體系結構了。我們知道,一個JVM實例的行為不光是它自己的事,還涉及到它的子系統、存儲區域、資料類型和指令這些部分,它們描述了JVM的一個抽象的內部體系結構,其目的不光規定實現JVM時它內部的體系結構,更重要的是提供了一種方式,用於嚴格定義實現時的外部行為。每個JVM都有兩種機制,一個是裝載具有合適名稱的類(類或是介面),叫做類裝載子系統;另外的一個負責執行包含在已裝載的類或介面中的指令,叫做運行引擎。每個JVM又包括方法區、堆、 Java棧...

從Java虛擬機器的記憶體區域、垃圾收集器及記憶體分配原則談Java的記憶體回收機制

一、引言:在Java中我們只需要輕輕地new一下,就可以為產生實體一個類,並分配對應的記憶體空間,而後似乎我們也可以不用去管它,Java自帶垃圾回收器,到了對象死亡的時候垃圾回收器就會將死亡物件的記憶體回收。真的只要根據需要巴拉巴拉地new而不用管記憶體回收了嗎?那為什麼會存在這麼多的記憶體溢出情況呢?下面我們就需要瞭解一下Java記憶體的回收機制,只有瞭解了其虛擬機器的回收原理才能更好的管理記憶體,避免記憶體溢出。二、Java虛擬機器的記憶體區域首先,我們得知道在我們的虛擬機器中記憶體到底是怎麼劃分區域的,下面借用《深入理解Java虛擬機器》一書中的一張圖。我們首先是把上述5個記憶體區域劃...

Java虛擬機器:記憶體模型詳解

我們都知道,當虛擬機器執行Java代碼的時候,首先要把位元組碼檔載入到記憶體,那麼這些類的資訊都存放在記憶體中的哪個區域呢?當我們創建一個物件實例的時候,虛擬機器要為物件分配記憶體,Java虛擬機器又是如何配分記憶體的呢?這些都涉及到Java虛擬機器的記憶體劃分機制,今天我們就來探究一下Java虛擬機器的記憶體模型。Java虛擬機器在執行Java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域,這些區域都有各自的用途以及創建和銷毀的時間,有的區域隨著虛擬機器進程的啟動而存在,有些區域則依賴使用者執行緒的啟動和結束而建立和銷毀。根據Java虛擬機器規範的規定,Java虛擬機器所管理的...

Java虛擬機器:如何判定哪些物件可回收?

在堆記憶體中存放著Java程式中幾乎所有的物件實例,堆記憶體的容量是有限的,Java虛擬機器會對堆記憶體進行管理,回收已經“死去”的物件(即不可能再被任何途徑使用的物件),釋放記憶體。垃圾收集器在對堆記憶體進行回收前,首先要做的第一件事就是確定這些物件中哪些還存活著,哪些已經死去。Java虛擬機器是如何判斷物件是否可以被回收的呢?引用計數演算法引用計數演算法的原理是這樣的:給物件添加一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;在任何時刻計數器的值為0的物件就是不可能再被使用的,也就是可被回收的物件。引用計數演算法的效率很高,但是主流的JVM並沒有選用...

Java虛擬機器:JVM記憶體分代策略

Java虛擬機器根據物件存活的週期不同,把堆記憶體劃分為幾塊,一般分為新生代、老年代和永久代(對HotSpot虛擬機器而言),這就是JVM的記憶體分代策略。為什麼要分代?堆記憶體是虛擬機器管理的記憶體中最大的一塊,也是垃圾回收最頻繁的一塊區域,我們程式所有的物件實例都存放在堆記憶體中。給堆記憶體分代是為了提高物件記憶體分配和垃圾回收的效率。試想一下,如果堆記憶體沒有區域劃分,所有的新創建的物件和生命週期很長的物件放在一起,隨著程式的執行,堆記憶體需要頻繁進行垃圾收集,而每次回收都要遍歷所有的物件,遍歷這些物件所花費的時間代價是巨大的,會嚴重影響我們的GC效率,這簡直太可怕了。有了記憶體分代,...

重讀 Java虛擬機器(jvm)

1. Java 記憶體區域與記憶體溢出異常1.1 運行時資料區域根據《Java 虛擬機器規範(Java SE 7 版)》規定,Java 虛擬機器所管理的記憶體如下圖所示。1.1.1 程式計數器記憶體空間小,執行緒私有。位元組碼解譯器工作是就是通過改變這個計數器的值來選取下一條需要執行指令的位元組碼指令,分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴計數器完成如果執行緒正在執行一個 Java 方法,這個計數器記錄的是正在執行的虛擬機器位元組碼指令的位址;如果正在執行的是 Native 方法,這個計數器的值則為 (Undefined)。此記憶體區域是唯一一個在 Java 虛擬機器規範...

Java虛擬機器的記憶體結構

我們都知道虛擬機器的記憶體劃分了多個區域,並不是一張大餅。那麼為什麼要劃分為多塊區域呢,直接搞一塊區域,所有用到記憶體的地方都往這塊區域裡扔不就行了,豈不痛快。是的,如果不進行區域劃分,扔的時候確實痛快,可用的時候再去找怎麼辦呢,這就引入了第一個問題,分類管理,類似於衣櫃,系統磁片等等,為了方便查找,我們會進行分區分類。另外如果不進行分區,記憶體用盡了怎麼辦呢?這裡就引入了記憶體劃分的第二個原因,就是為了方便記憶體的回收。如果不分,回收記憶體需要全部記憶體掃描,那就慢死了,記憶體根據不同的使用功能分成不同的區域,那麼記憶體回收也就可以根據每個區域的特定進行回收,比如像棧記憶體中的棧幀,隨著方...

探究Java虛擬機器棧

前言Java 虛擬機器的記憶體模型分為兩部分:一部分是執行緒共用的,包括 Java 堆和方法區;另一部分是執行緒私有的,包括虛擬機器棧和本地方法棧,以及程式計數器這一小部分記憶體。今天我就 Java 虛擬機器棧做一些比較淺的探究。熟悉 Java 的同學應該都知道了,JVM 是基於棧的。但是這個“棧” 具體指的是什麼?難道就是虛擬機器棧?想要回答這個問題我們先要從虛擬機器棧的結構談起。虛擬機器棧何為虛擬機器棧虛擬機器棧的棧元素是棧幀,當有一個方法被調用時,代表這個方法的棧幀入棧;當這個方法返回時,其棧幀出棧。因此,虛擬機器棧中棧幀的入棧順序就是方法調用順序。什麼是棧幀呢?棧幀可以理解為一個方法...
图库

90天java衝刺訓練營開班了,只需149元

全球10大最常用的程式設計語言,PHP第五,Java第三,Python第二

“JAVA之父”高斯林,曾是比爾蓋茨的噩夢,如今遭遇年齡歧視

Ubuntu下載與虛擬機器下安裝

還記得這個介面嗎?老手機登錄JavaQQ,竟然成功,穿越的感覺!

這部塵封六年的手機,開機竟還有電,支持JAVA能後臺,古董獲新生

Python 和Java 共用單車驚現雲棲大會,程式師集體興奮了!

30+的人學Java,推薦的學習路線

超級名模|Katlin Aas和Valerija Kelava~2017年7月英國時尚芭莎

美軍測試模擬機器人,準備用這些機器與士兵協同作戰

喜欢就按个赞吧!!!
点击关闭提示