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

jvm是運行二進制字節(jié)碼和操作系統(tǒng)交互,沒有與硬件的直接交互。
作用:
Java虛擬機是二進制字節(jié)碼的運行環(huán)境,負責把二進制字節(jié)碼裝載到其內部,解釋/編譯成相應的機器指令執(zhí)行。
每一條Java指令,java虛擬機中都有詳細的定義,比如怎么拿到操作數(shù)、怎么處理操作數(shù)、結果存放在哪里等等。
特點:
一次編譯,到處運行。
自動內存管理。
自動垃圾回收。
jvm內存結構概覽

方法區(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í)行的具體指令