您好,登錄后才能下訂單哦!
JVM基礎知識都有什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
一、什么是JVM?
JVM是可運行Java代碼的假想計算機 ,包括一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收,堆和一個存儲方法域。JVM 是運行在操作系統之上的,它與硬件沒有直接的交互。
二、運行過程
① Java 源文件—->編譯器—->字節碼文件
② 字節碼文件—->JVM—->機器碼
三、JVM 內存區域
主要分為線程私有區域【程序計數器、虛擬機棧、本地方法區】、線程共享區
域【JAVA 堆、方法區】、直接內存。
四、jvm內加載機制
Java源代碼被編譯成class字節碼,JVM把描述類數據的字節碼.Class文件加載到內存,并對數據進行校驗、轉換解析和初始化,最終形成可以被虛擬機直接使用的java類型,這就是虛擬機的類加載機制。
類從被加載到虛擬機內存中開始,到卸載出內存為止,它的生命周期包括了:加載(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸載(Unloading)七個階段,其中驗證、準備、解析三個部分統稱鏈接。
五、JVM 運行時內存
新生代:gc回收主要用復制算法
老年代:gc回收主要用標記清除算法
永久代:jdk8移除,被元數據區取代
堆內存結構
棧和堆的區別?
棧的優勢:存取速度比堆要快,僅次于直接位于 CPU 中的寄存器。但缺點是,棧中的數據大小與生存周期必須是確定的。
堆的優勢:可以動態地分配內存大小,生存周期也不必事先告訴編譯器,Java 的垃圾回收器會自動收走那些不再使用的數據。但由于要在運行時動態分配內存,存取速度較慢。
六、GC垃圾回收
(1)如何確定垃圾
引用計數法
可達性分析
(2)回收對象
超出作用域的對象/引用計數為空的對象。
從gc root開始搜索,搜索不到的對象。
回收新生代區。
(3)回收算法
引用計數法
標記清除法
標記壓縮法
復制算法
分代算法
七、JAVA 引用類型
強引用:把一個對象賦給一個引用變量,這個引用變量就是一個強引
用。當一個對象被強引用變量引用時,它處于可達狀態,它是不可能被垃圾回收機制回收的,即使該對象以后永遠都不會被用到 JVM 也不會回收。因此強引用是造成 Java 內存泄漏的主要原因之一。
軟引用:需要用 SoftReference 類來實現,對于只有軟引用的對象來說,當系統內存足夠時它不會被回收,當系統內存空間不足時它會被回收。軟引用通常用在對內存敏感的程序中
弱引用:需要用 WeakReference 類來實現,它比軟引用的生存期更短,對于只有弱引用的對象來說,只要垃圾回收機制一運行,不管 JVM 的內存空間是否足夠,總會回收該對象占用的內存。
虛引用:需要 PhantomReference 類來實現,它不能單獨使用,必須和引用隊列聯合使用。虛引用的主要作用是跟蹤對象被垃圾回收的狀態。
八、常用JVM參數調優
Xss:每個線程的Stack大小
-verbose:gc 現實垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般設置為Xmx的3、4分之一
-XX:+UseParNewGC :縮短minor收集的時間
-XX:+UseConcMarkSweepGC :縮短major收集的時間
重要參數:
-Xms 堆初始值
-Xmx 堆最大可用值
-Xmn 新生代堆最大可用值
-Xmn 新生代大小,一般設為整個堆的1/3到1/4左右
注意:堆初始值=堆最大值,減少垃圾回收次數,提升效率。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。