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快速入门相关推荐

  1. 解析Linux内核源码中数据同步问题丨C++后端开发丨Linux服务器开发丨Linux内核开发丨驱动开发丨嵌入式开发丨内核操作系统

    剖析Linux内核源码数据同步 1.pdflush机制原理 2.超级块同步/inode同步 3.拥塞及强制回写技术 视频讲解如下,点击观看: 解析Linux内核源码中数据同步问题丨C++后端开发丨Li ...

  2. linux内核开发基础(linux内核源码、树莓派源码编译、SD卡挂载)

    首先下载树莓派linux内核源码: 下载网址:https://github.com/raspberrypi/linux 在树莓派使用指令:uname -r查看当前树莓派的版本号,然后选择对应的linu ...

  3. ARM树莓派高级开发——linux内核源码、树莓派源码编译、SD卡挂载

    文章目录 linux内核开发基础(linux内核源码.树莓派源码编译.SD卡挂载) 树莓派等芯片带操作系统的启动过程 linux内核源码树 Linux内核源代码目录树结构: 树莓派Linux源码配置 ...

  4. xilinx linux内核,Xilinx-Zynq Linux内核源码编译过程

    本文内容依据http://www.wiki.xilinx.com网址编写,编译所用操作系统为ubuntu 14 1.交叉编译环境的安装配置 2.uboot的编译 1)下载uboot源代码 下载uboo ...

  5. 需要多久才能看完linux内核源码?

    代码中自由颜如玉! 代码中自有黄金屋! 那么Linux内核代码到底有多少行? 我们需要多久能读完呢? 一.内核行数 Linux内核分为CPU调度.内存管理.网络和存储四大子系统,针对硬件的驱动成百上千 ...

  6. 听说你要把Linux内核源码读完?

    正所谓 代码中自有颜如玉! 代码中自有黄金屋! 那么Linux内核代码到底有多少行? 我们又需要多久能读完呢? 一.内核行数 Linux内核分为CPU调度.内存管理.网络和存储四大子系统,针对硬件的驱 ...

  7. 【Linux 内核】编译 Linux 内核 ② ( 解压内核源码 | 查询当前 Linux 内核版本号 | 进入并查看 linux 内核源码目录 )

    文章目录 一.解压内核源码 二.查询当前 Linux 内核版本号 三.进入并查看 linux 内核源码目录 一.解压内核源码 将 下载的 Linux 内核源码 linux-5.6.14.tar.gz ...

  8. ubuntu下wget下载Linux内核源码、make生成.config文件

    根据资料,如果要调试Linux内核源码,需要自己编译内核源码:原因是,一般下载的内核并不是为调试而编译的,要在编译时开启 "Compile the kernel with debug inf ...

  9. linux的进程/线程/协程系列3:查看linux内核源码——vim+ctags/find+grep

    linux的进程/线程/协程系列3:查看linux内核源码--vim+ctags/find+grep 前言 摘要: 1. 下载linux内核源码 2. 打标签方法:vim+ctags 2.1 安装vi ...

最新文章

  1. html当作附件发送,MIME以HTML文件作为附件发送电子邮件?
  2. xml发展历史和用途
  3. MapReduce实现共同朋友问题
  4. [Android Studio 权威教程]Windows下安装Android Studio
  5. Java怎么样?学完后前途怎么样?
  6. 201571030322/201571030319《小学生四则运算软件需求说明结对项目报告》
  7. SAP Spartacus 如何调试待翻译文本的 place holder 和翻译之后的值
  8. 盗COOKIE之方法总结
  9. android开发之后端云bmob的使用
  10. 关联分析算法(二)——FP-growth算法与python用法
  11. java jtextfield 事件_java – 处理JTextField中的编辑事件
  12. 【图像处理】图像灰度级减少, 图像缩放(Reducing the Number of Gray Levels, Zooming and Shrinking)
  13. 把执行结果转成json对象报错_于一次JSON格式错误 之 手把手带你走一波FastJSON将对象转成JSON字符串流程...
  14. Java读取URL到字符串
  15. Linux安装jdk、删除Open jdk
  16. gmp新附录 计算机系统,GMP新附录:计算机系统.doc
  17. cherry MX-BOARD 3.0 拆解
  18. H3C防火墙基础配置1-登录配置、安全域配置
  19. 高校大学生可以免费领半年阿里云服务器
  20. 计算机电源出现问题,电源故障引起的电脑问题

热门文章

  1. HDU - 3126 Nova(最大流+二分+简单几何)
  2. CodeForces - 1168B Good Triple(思维+暴力)
  3. navicat创建数据库后显示图标灰色,右键后无法新建数据库
  4. api 微信内置浏览器js_多端开发框架uni-app入坑指南,一套代码适用微信、头条等小程序...
  5. Tomcat虚拟目录的配置
  6. 单位根反演[loj6485]LJJ 学二项式定理
  7. Kafka端到端审计
  8. [六]RabbitMQ-客户端源码之AMQCommand
  9. 学会这几招让 Go 程序自己监控自己
  10. 数据结构--图(Graph)详解(四)