HotSpot源码(一):Docker与虚拟机的区别,class字节码解析,linux内核源码下载地址,Yacc与Lex快速入门
Docker是虛擬機嗎?
Docker是用來隔離的,使用的是隔離的namespace,使用OS提供的接口進行應用程序之間的資源隔離,不是虛擬機。再加上它自己特殊的文件系統,一層一層疊加。他只不過是一個容器,不是虛擬化系統。
虛擬機可以為所欲為(可以裝win,裝unix內核的os,裝linux內核的os),而docker只能跑在linux的內核上,共享的是同一個內核。
HotSpot需要實現哪些功能?
內存管理 線程管理 類加載器 即時編譯 垃圾回收 設計規范 監控 接口
編譯和翻譯的區別
語言之間的轉換,是翻譯
編譯是編譯成下一級語言,比如C語言編譯成機器語言,要求語言必須從高級到低級。
寫一個java程序
class Hello{public static void main(String[] args){System.out.println("Hello,world!");} }javac Hello.java 編譯,十六進制查看
CAFEBABE20202037201D0A2006200F09 201020110820120A2013201407201507 20160120063C696E69743E0120032829 56012004436F646501200F4C696E654E 756D6265725461626C650120046D6169 6E012016285B4C6A6176612F6C616E67 2F537472696E673B295601200A536F75 72636546696C6501200A48656C6C6F2E 6A6176610C200720080720170C201820 1901200C48656C6C6F2C776F726C6421 07201A0C201B201C01200548656C6C6F 0120106A6176612F6C616E672F4F626A 6563740120106A6176612F6C616E672F 53797374656D0120036F75740120154C 6A6176612F696F2F5072696E74537472 65616D3B0120136A6176612F696F2F50 72696E7453747265616D012007707269 6E746C6E012015284C6A6176612F6C61 6E672F537472696E673B295620202005 20062020202020022020200720082001 20092020201D20012001202020052AB7 2001B120202001200A20202006200120 2020012009200B200C20012009202020 252002200120202009B220021203B620 04B120202001200A2020200A20022020 2003200820042001200D20202002200E使用javap -v Hello查看編譯生成的字節碼
Classfile /C:/Users/Bug/Desktop/Hello.classLast modified 2020年7月4日; size 416 bytesMD5 checksum 5fa7eacdfad813324a594e7e18c8731fCompiled from "Hello.java" class Hellominor version: 0major version: 55flags: (0x0020) ACC_SUPERthis_class: #5 // Hellosuper_class: #6 // java/lang/Objectinterfaces: 0, fields: 0, methods: 2, attributes: 1 Constant pool:#1 = Methodref #6.#15 // java/lang/Object."<init>":()V#2 = Fieldref #16.#17 // java/lang/System.out:Ljava/io/PrintStream;#3 = String #18 // Hello,world!#4 = Methodref #19.#20 // java/io/PrintStream.println:(Ljava/lang/String;)V#5 = Class #21 // Hello#6 = Class #22 // java/lang/Object#7 = Utf8 <init>#8 = Utf8 ()V#9 = Utf8 Code#10 = Utf8 LineNumberTable#11 = Utf8 main#12 = Utf8 ([Ljava/lang/String;)V#13 = Utf8 SourceFile#14 = Utf8 Hello.java#15 = NameAndType #7:#8 // "<init>":()V#16 = Class #23 // java/lang/System#17 = NameAndType #24:#25 // out:Ljava/io/PrintStream;#18 = Utf8 Hello,world!#19 = Class #26 // java/io/PrintStream#20 = NameAndType #27:#28 // println:(Ljava/lang/String;)V#21 = Utf8 Hello#22 = Utf8 java/lang/Object#23 = Utf8 java/lang/System#24 = Utf8 out#25 = Utf8 Ljava/io/PrintStream;#26 = Utf8 java/io/PrintStream#27 = Utf8 println#28 = Utf8 (Ljava/lang/String;)V {Hello();descriptor: ()Vflags: (0x0000)Code:stack=1, locals=1, args_size=10: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 1: 0public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: (0x0009) ACC_PUBLIC, ACC_STATICCode:stack=2, locals=1, args_size=10: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;3: ldc #3 // String Hello,world!5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V8: returnLineNumberTable:line 3: 0line 4: 8 } SourceFile: "Hello.java"如果把上面的字節碼用 java 理解的話,相當于:
import java.io.PrintStream; import java.util.Stack;public class ClassCode {public static void main(String[] args) {Stack<Object> stack = new Stack<>();stack.push(System.out); // 0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;stack.push("Hello,World!"); // 3: ldc #3 // String Hello,world!// 5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)VString str = (String) stack.pop();PrintStream printStream = (PrintStream) stack.pop();printStream.println(str);} } // 輸出:Hello,World!javac命令是什么語言寫的?
javac是一個exe文件
javac是java寫的
這是一個雞生蛋蛋生雞的問題:如果你要編譯一個java虛擬機,你需要一個java虛擬機
補充:linux內核源碼下載地址
官網鏈接:https://www.kernel.org/
HTTP https://www.kernel.org/pub/
GIT https://git.kernel.org/
可以根據需要,下載對應內核版本。
官網下載經常速度太慢,無法下載,提供國內鏡像:
http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/
補充:Yacc與Lex快速入門
lex和yacc是什么?
lex 代表 lexical analyzar(詞法分析器)
yacc 代表 yet another compiler compiler(編譯器代碼生成器)。
我們舉個簡單的例子來理解lex和yacc:
在linux下,有很多系統配置文件,一些linux下的軟件也有配置文件,那么程序是如何讀取配置文件中的信息的呢?
先用到lex詞法分析器,讀取配置文件中的關鍵詞(后面說到的token標記其實可看做關鍵詞);
然后把關鍵詞遞交給yacc,yacc對一些關鍵詞進行匹配,看是否符合一定的語法邏輯,如果符合就進行相應動作。
這個例子是分析配置文件內容的,當然可分析其他文件內容,或者制作編譯器等。
總結
以上是生活随笔為你收集整理的HotSpot源码(一):Docker与虚拟机的区别,class字节码解析,linux内核源码下载地址,Yacc与Lex快速入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高并发负载均衡(三):LVS的DR模型试
- 下一篇: 高并发负载均衡(四):基于keepali