欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java JVM的基本概念、結(jié)構(gòu)、生命周期詳解

 更新時間:2025年05月16日 08:55:51   作者:劉Java  
這篇文章主要介紹了Java JVM的基本概念、結(jié)構(gòu)、生命周期使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

1 JVM簡介

JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設(shè)備的規(guī)范,它是一個虛構(gòu)出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的。

引入Java語言虛擬機JVM后,Java語言在不同平臺上運行時不需要重新編譯。JVM在執(zhí)行字節(jié)碼時,實際上最終還是把字節(jié)碼解釋成具體平臺上的機器指令執(zhí)行,因此屏蔽了與具體平臺(win、mac)相關(guān)的信息,使得只需要一份字節(jié)碼文件,就可以在多種平臺上不加修改地運行。

不僅如此,現(xiàn)在的JVM還實現(xiàn)了語言的無關(guān)性,Scala、Kotlin、Groovy等語言都可以使用JVM運行。

編譯后被Java虛擬機所執(zhí)行的代碼使用了一種平臺中立(不依賴于特定硬件及操作系統(tǒng))的二進制格式來表示, 并且經(jīng)常(但并非絕對)以文件的形式存儲, 因此這種格式稱為class 文件格式。 實際上JVM的平臺、語言無關(guān)性的上層原因也是因為.class文件格式的平臺、語言無關(guān)性。

2 JVM的生命周期

2.1 啟動

JVM實例對應(yīng)了一個獨立運行的java程序,它是進程級別。

啟動一個Java程序時,會首先建立一個JVM實例,任何一個擁有public static void main(String[] args)函數(shù)的class都可以作為JVM實例運行的起點

2.2 運行

main()作為該程序初始線程的起點,任何其他線程均由該線程啟動。

JVM內(nèi)部有兩種線程:守護線程和非守護線程,main()屬于非守護線程,守護線程通常由JVM自己使用,java程序也可以標明自己創(chuàng)建的線程是守護線程(Thread的setDaemon(true)方法)。

2.3 消亡

  1. 當(dāng)程序中的所有非守護線程都終止時,JVM退出;
  2. 若安全管理器允許,程序也可以使用System.exit(0)或 Runtime.getRuntime().exit()來退出。
  3. 程序所在平臺強制結(jié)束JVM進程

3 JVM的體系結(jié)構(gòu)

3.1 JVM組成

主要分成三塊:

  • 類裝載器(ClassLoader)(用來裝載.class文件)
  • 執(zhí)行引擎(執(zhí)行字節(jié)碼,或者執(zhí)行本地方法)
  • 運行時數(shù)據(jù)區(qū)(方法區(qū)、堆、java棧、PC寄存器、本地方法棧)

注意:

java編譯器把java源文件(.java文件)編譯成字節(jié)碼文件(.class文件),然后JVM對字節(jié)碼文件進行加載、解釋執(zhí)行。

java的源代碼是無法直接在JVM上運行的,Java編譯器在JDK中,可以使用javac命令對Java源文件進行編譯。

3.1 JVM各模塊簡介

我們的后續(xù)學(xué)習(xí)主要學(xué)習(xí)的內(nèi)容是JVM的類加載機制、運行時數(shù)據(jù)區(qū)域、GC機制、執(zhí)行引擎機制、以及一些JVM優(yōu)化

對于源文件的編譯,并不屬于JVM的范疇,編譯原理的內(nèi)容比較復(fù)雜,但是我們可以了解一下,Java源代碼編譯大概步驟為:

生成的字節(jié)碼文件中包含結(jié)構(gòu)信息、元數(shù)據(jù)、方法信息等,具體的字節(jié)碼結(jié)構(gòu)在類文件結(jié)構(gòu)部分。深入了解編譯器可以看《自己動手實現(xiàn)jvm》、《編譯原理》等書。

JVM對Java字節(jié)碼進行加載、執(zhí)行,JVM的類加載是通過ClassLoader及其子類來完成的,執(zhí)行的過程抽象如下:

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 教你如何使用idea管理docker

    教你如何使用idea管理docker

    其實idea也提供了docker的管理功能,比如查看容器列表,啟動容器,停止容器等,本文來看下如何管理本地的docker?daemon和遠程的dockers?daemon,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Java中的日期和時間類以及Calendar類用法詳解

    Java中的日期和時間類以及Calendar類用法詳解

    這篇文章主要介紹了Java中的日期和時間類以及Calendar類用法詳解,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • Spring @Cacheable自定義緩存過期時間的實現(xiàn)示例

    Spring @Cacheable自定義緩存過期時間的實現(xiàn)示例

    本文主要介紹了Spring @Cacheable自定義緩存過期時間的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • SpringBoot 之啟動流程詳解

    SpringBoot 之啟動流程詳解

    SpringBoot 是一個基于 Spring 框架的快速開發(fā)框架,旨在簡化 Spring 應(yīng)用程序的開發(fā)和部署。在本文中,我們將深入分析 SpringBoot 啟動過程的源代碼,并提供必要的解釋和說明
    2023-04-04
  • Java序列化(Serialization) 機制

    Java序列化(Serialization) 機制

    本篇文章是對Java中對象的序列化(Serialization) 機制進行了詳細的分析介紹,并附實例,需要的朋友可以參考下
    2016-07-07
  • Java使用RedisTemplate操作Redis遇到的坑

    Java使用RedisTemplate操作Redis遇到的坑

    這篇文章主要介紹了Java使用RedisTemplate操作Redis遇到的坑,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • MyBatis Map結(jié)果的Key轉(zhuǎn)為駝峰式

    MyBatis Map結(jié)果的Key轉(zhuǎn)為駝峰式

    今天小編就為大家分享一篇關(guān)于MyBatis Map結(jié)果的Key轉(zhuǎn)為駝峰式,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 使用JPA自定義VO類型轉(zhuǎn)換(EntityUtils工具類)

    使用JPA自定義VO類型轉(zhuǎn)換(EntityUtils工具類)

    這篇文章主要介紹了使用JPA自定義VO類型轉(zhuǎn)換(EntityUtils工具類),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 基于java構(gòu)造方法Vector刪除元素源碼分析

    基于java構(gòu)造方法Vector刪除元素源碼分析

    這篇文章主要介紹了基于java構(gòu)造方法中對Vector刪除元素的源碼分析,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家早日升職加薪
    2021-09-09
  • Spring為IOC容器注入Bean的五種方式詳解

    Spring為IOC容器注入Bean的五種方式詳解

    這篇文章主要介紹了Spring為IOC容器注入Bean的五種方式詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10

最新評論