1、JVM概念
JVM是Java Virtual Machine的簡稱。意爲Java虛擬機。
虛擬機
指通過軟件模擬的具有完整硬件系統功能的、運行在一個完全隔離環境中的完整計算機系統
有哪些虛擬機
VMWare
Visual Box
JVM
VMWare或者Visual Box都是使用軟件模擬物理CPU的指令集
JVM使用軟件模擬Java 字節碼的指令集
2、JVM的發展史
1996年 SUN JDK 1.0 Classic VM
-- 純解釋運行,使用外掛進行JIT
1997年 JDK1.1 發佈
-- AWT、內部類、JDBC、RMI、反射
1998年 JDK1.2 Solaris Exact VM(JDK1.2開始 稱爲Java 2; J2SE J2EE J2ME 的出現;加入Swing Collections)
-- JIT 解釋器混合
-- Accurate Memory Management 精確內存管理,數據類型敏感
-- 提升的GC性能
2000年 JDK 1.3 Hotspot 作爲默認虛擬機發布(加入JavaSound)
2002年 JDK 1.4 Classic VM退出歷史舞臺
2004年發佈 JDK1.5 即 JDK5 、J2SE 5 、Java 5
--泛型
--註解
--裝箱
--枚舉
--可變長的參數
--Foreach循環
JDK1.6 JDK6
--腳本語言支持
--JDBC 4.0
--Java編譯器 API
2011年 JDK7發佈
--延誤項目推出到JDK8
--G1
--動態語言增強
--64位系統中的壓縮指針
--NIO 2.0
2014年 JDK8發佈
--Lambda表達式
--語法增強 Java類型註解
2016年JDK9
--模塊化
JVM的歷史 – 大事記
使用最爲廣泛的JVM爲HotSpot
HotSpot 爲Longview Technologies開發 被SUN收購
2006年 Java開源 並建立OpenJDK
--HotSpot 成爲Sun JDK和OpenJDK中所帶的虛擬機
2008 年 Oracle收購BEA
--得到JRockit VM
2010年Oracle 收購 Sun
--得到Hotspot
Oracle宣佈在JDK8時整合JRockit和Hotspot,優勢互補
--在Hotspot基礎上,移植JRockit優秀特性
3、各式JVM
KVM
-- SUN發佈
-- IOS Android前,廣泛用於手機系統
CDC/CLDC HotSpot
-- 手機、電子書、PDA等設備上建立統一的Java編程接口
-- J2ME的重要組成部分
JRockit
-- BEA
IBM J9 VM
-- IBM內部
Apache Harmony
-- 兼容於JDK 1.5和JDK 1.6的Java程序運行平臺
-- 與Oracle關係惡劣 退出JCP ,Java社區的分裂
-- OpenJDK出現後,受到挑戰 2011年 退役
-- 沒有大規模商用經歷
-- 對Android的發展有積極作用
4、Java規範
Java語言規範
-- 語法
-- 變量
-- 類型
-- 文法
JVM規範
-- Class文件類型
-- 運行時數據
-- 幀棧
-- 虛擬機的啓動
-- 虛擬機的指令集
語法定義
-- IfThenStatement:
if ( Expression ) Statement // if(true){do sth;}
-- ArgumentList:
Argument
ArgumentList , Argument // add(a,b,c,d);
詞法結構
-- \u + 4個16進制數字 表示UTF-16
-- 行終結符: CR, or LF, or CR LF.
-- 空白符
· 空格 tab \t 換頁 \f 行終結符
-- 註釋
-- 標識符
-- 關鍵字
Identifier: IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral
IdentifierChars: JavaLetter IdentifierChars JavaLetterOrDigit
JavaLetter: any Unicode character that is a Java letter (see below)
JavaLetterOrDigit: any Unicode character that is a Java letter-or-digit (see below)
//
public static void 打印(){
System.out.println("中文方法哦");
}
public static void main(String[] args) {
打印();
}
詞法結構
-- Int
· 0 2 0372 0xDada_Cafe 1996 0x00_FF__00_FF
-- Long
· 0l 0777L 0x100000000L 2_147_483_648L 0xC0B0L
-- Float
· 1e1f 2.f .3f 0f 3.14f 6.022137e+23f
-- Double
· 1e1 2. .3 0.0 3.14 1e-9d 1e137
-- 操作
· += -= *= /= &= |= ^= %= <<= >>= >>>=
哪些是合法的數字呢?
-- private int a=0xDada_Cafe;
-- private float b=0x1.fffffeP+127f;
-- private float c=1996;
-- private float d=1996.3;
-- private int f=9999e2;
-- private double g=33e2;
-- private float h=0x1.fffep-12f;
-- private float i=1.fffep-12f;
-- private long p=0b1_1_1_0_1;
-- private long q=0b1_1_1_0_2;
類型和變量
-- 元類型
· byte short int long float char
-- 變量初始值
· boolean false
· char \u0000
-- 泛型
Java內存模型
類加載鏈接的過程
public static final abstract的定義
異常
數組的使用
…….
Java語言規範定義了什麼是Java語言
Java語言和JVM相對獨立
-- Groovy
-- Clojure
-- Scala
JVM主要定義二進制class文件和JVM指令集等
Class 文件格式
數字的內部表示和存儲
-- Byte -128 to 127 (-27 to 27 - 1)
returnAddress 數據類型定義
-- 指向操作碼的指針。不對應Java數據類型,不能在運行時修改。Finally實現需要
定義PC
堆
棧
方法區
整數的表達
-- 原碼:第一位爲符號位(0爲正數,1爲負數)
-- 反碼:符號位不動,原碼取反
-- 負數補碼:符號位不動,反碼加1
-- 正數補碼:和原碼相同
-- 打印整數的二進制表示
int a=-6;
for(int i=0;i<32;i++){
int t=(a & 0x80000000>>>i)>>>(31-i);
System.out.print(t);
}
爲什麼要用補碼?
-- 計算0的表示:
Float的表示與定義
-- 支持 IEEE 754
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
e全0 尾數附加位爲0 否則尾數附加位爲1
s*m*2^(e-127)
一些特殊的方法
-- <clinit>
-- <init>
VM指令集
-- 類型轉化
· l2i
-- 出棧入棧操作
· aload astore
-- 運算
· iadd isub
-- 流程控制
· ifeq ifne
-- 函數調用
· invokevirtual invokeinterface invokespecial invokestatic
JVM需要對Java Library 提供以下支持:
-- 反射 java.lang.reflect
-- ClassLoader
-- 初始化class和interface
-- 安全相關 java.security
-- 多線程
-- 弱引用
JVM的編譯
-- 源碼到JVM指令的對應格式
-- Javap
-- JVM反彙編的格式
· <index> <opcode> [ <operand1> [ <operand2>... ]] [<comment>]
void spin() {
int i;
for (i = 0; i < 100; i++) { ;
// Loop body is empty
}
}
0 iconst_0 // Push int constant 0
1 istore_1 // Store into local variable 1 (i=0)
2 goto 8 // First time through don't increment
5 iinc 1 1 // Increment local variable 1 by 1 (i++)
8 iload_1 // Push local variable 1 (i)
9 bipush 100 // Push int constant 100
11 if_icmplt 5 // Compare and loop if less than (i < 100)
14 return // Return void when done
JVM簡介
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
JVM---內存管理(類加載子系統)
GhostRiderQin
2020-06-21 13:37:28
垃圾收集器與內存分配策略(讀後感三:回收內存)
小三七
2020-06-19 15:41:23
JAVA內存管理--java運行數據區
微笑い一刀
2020-06-16 12:43:24
深入瞭解Java虛擬機(內存管理)
流年烟雨绽放在寂寞的晴天
2020-05-12 17:47:23
Garbage First - Card Table
iteye_5555
2020-02-25 11:07:56
智漁課堂官方免費教程七:Java基礎之類和對象
智渔课堂教育
2020-02-24 07:59:17
shallow heap例說
berber78
2020-02-23 18:26:51
Java GC、新生代、老年代
berber78
2020-02-23 18:26:51
java虛擬機內存結構
fhf2424045058
2018-09-06 06:48:10
深入理解JVM--我的學習筆記
wangjianren0000
2018-09-05 21:46:06
Java虛擬機運行時數據區
berber78
2018-09-03 06:53:47
swap、page、mmap和Ashmem
berber78
2018-09-03 06:53:47
Android 性能優化二 內存優化
HousonCao
2018-09-02 07:38:54