JVM簡介

概念:

Java虛擬機:用來解釋執(zhí)行Java字節(jié)碼文件的虛擬計算機,它擁有獨立的運行機制。其運行的java字節(jié)碼未必是由Java語言編譯而成。

jvm的位置:


jvm的位置.png

jvm是運行二進制字節(jié)碼和操作系統(tǒng)交互,沒有與硬件的直接交互。

作用:

Java虛擬機是二進制字節(jié)碼的運行環(huán)境,負責把二進制字節(jié)碼裝載到其內部,解釋/編譯成相應的機器指令執(zhí)行。
每一條Java指令,java虛擬機中都有詳細的定義,比如怎么拿到操作數(shù)、怎么處理操作數(shù)、結果存放在哪里等等。

特點:

一次編譯,到處運行。
自動內存管理。
自動垃圾回收。

jvm內存結構概覽

內存結構.png

方法區(qū)和堆區(qū)時所有線程共享的區(qū)域,而Java棧、本地方法棧、程序計數(shù)器是線程私有的區(qū)域;
方法區(qū)(永久代)在jdk8中又叫做元空間Metaspace,方法區(qū)用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器(JIT編譯器,英文寫作Just-In-Time Compiler)編譯后的代碼等數(shù)據(jù)。雖然Java虛擬機規(guī)范把方法區(qū)描述為堆的一個邏輯部分,但是它卻有一個別名叫做 Non-Heap(非堆),目的應該是與 Java 堆區(qū)分開來。
在JDK1.7之前運行時常量池邏輯包含字符串常量池存放在方法區(qū), 此時hotspot虛擬機對方法區(qū)的實現(xiàn)為永久代
在JDK1.7 字符串常量池被從方法區(qū)拿到了堆中, 這里沒有提到運行時常量池,也就是說字符串常量池被單獨拿到堆,運行時常量池剩下的東西還在方法區(qū), 也就是hotspot中的永久代
在JDK1.8之后JVM 已經(jīng)將運行時常量池從方法區(qū)中移了出來,在 Java 堆(Heap)中開辟了一塊區(qū)域存放運行時常量池。同時在 jdk 1.8中移除整個永久代,取而代之的是一個叫元空間(Metaspace)的區(qū)域。

Java代碼的執(zhí)行流程:
Java程序--javac編譯-->字節(jié)碼文件----->類加載子系統(tǒng)(數(shù)據(jù)加載到方法區(qū)、內存中生成java.lang.class對象作為各種數(shù)據(jù)訪問口)----->運行時數(shù)據(jù)區(qū)----->執(zhí)行引擎(解釋執(zhí)行)----->操作系統(tǒng)執(zhí)行的具體指令

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容