HotSpot源码(一):Docker与虚拟机的区别,class字节码解析,linux内核源码下载地址,Yacc与Lex快速入门

    技术2025-06-20  3

    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.class Last modified 202074; size 416 bytes MD5 checksum 5fa7eacdfad813324a594e7e18c8731f Compiled from "Hello.java" class Hello minor version: 0 major version: 55 flags: (0x0020) ACC_SUPER this_class: #5 // Hello super_class: #6 // java/lang/Object interfaces: 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: ()V flags: (0x0000) Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: (0x0009) ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=1, args_size=1 0: 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;)V 8: return LineNumberTable: line 3: 0 line 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;)V String 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对一些关键词进行匹配,看是否符合一定的语法逻辑,如果符合就进行相应动作。

    这个例子是分析配置文件内容的,当然可分析其他文件内容,或者制作编译器等。

    Processed: 0.011, SQL: 9