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快速入门相关推荐
- 解析Linux内核源码中数据同步问题丨C++后端开发丨Linux服务器开发丨Linux内核开发丨驱动开发丨嵌入式开发丨内核操作系统
剖析Linux内核源码数据同步 1.pdflush机制原理 2.超级块同步/inode同步 3.拥塞及强制回写技术 视频讲解如下,点击观看: 解析Linux内核源码中数据同步问题丨C++后端开发丨Li ...
- linux内核开发基础(linux内核源码、树莓派源码编译、SD卡挂载)
首先下载树莓派linux内核源码: 下载网址:https://github.com/raspberrypi/linux 在树莓派使用指令:uname -r查看当前树莓派的版本号,然后选择对应的linu ...
- ARM树莓派高级开发——linux内核源码、树莓派源码编译、SD卡挂载
文章目录 linux内核开发基础(linux内核源码.树莓派源码编译.SD卡挂载) 树莓派等芯片带操作系统的启动过程 linux内核源码树 Linux内核源代码目录树结构: 树莓派Linux源码配置 ...
- xilinx linux内核,Xilinx-Zynq Linux内核源码编译过程
本文内容依据http://www.wiki.xilinx.com网址编写,编译所用操作系统为ubuntu 14 1.交叉编译环境的安装配置 2.uboot的编译 1)下载uboot源代码 下载uboo ...
- 需要多久才能看完linux内核源码?
代码中自由颜如玉! 代码中自有黄金屋! 那么Linux内核代码到底有多少行? 我们需要多久能读完呢? 一.内核行数 Linux内核分为CPU调度.内存管理.网络和存储四大子系统,针对硬件的驱动成百上千 ...
- 听说你要把Linux内核源码读完?
正所谓 代码中自有颜如玉! 代码中自有黄金屋! 那么Linux内核代码到底有多少行? 我们又需要多久能读完呢? 一.内核行数 Linux内核分为CPU调度.内存管理.网络和存储四大子系统,针对硬件的驱 ...
- 【Linux 内核】编译 Linux 内核 ② ( 解压内核源码 | 查询当前 Linux 内核版本号 | 进入并查看 linux 内核源码目录 )
文章目录 一.解压内核源码 二.查询当前 Linux 内核版本号 三.进入并查看 linux 内核源码目录 一.解压内核源码 将 下载的 Linux 内核源码 linux-5.6.14.tar.gz ...
- ubuntu下wget下载Linux内核源码、make生成.config文件
根据资料,如果要调试Linux内核源码,需要自己编译内核源码:原因是,一般下载的内核并不是为调试而编译的,要在编译时开启 "Compile the kernel with debug inf ...
- linux的进程/线程/协程系列3:查看linux内核源码——vim+ctags/find+grep
linux的进程/线程/协程系列3:查看linux内核源码--vim+ctags/find+grep 前言 摘要: 1. 下载linux内核源码 2. 打标签方法:vim+ctags 2.1 安装vi ...
最新文章
- html当作附件发送,MIME以HTML文件作为附件发送电子邮件?
- xml发展历史和用途
- MapReduce实现共同朋友问题
- [Android Studio 权威教程]Windows下安装Android Studio
- Java怎么样?学完后前途怎么样?
- 201571030322/201571030319《小学生四则运算软件需求说明结对项目报告》
- SAP Spartacus 如何调试待翻译文本的 place holder 和翻译之后的值
- 盗COOKIE之方法总结
- android开发之后端云bmob的使用
- 关联分析算法(二)——FP-growth算法与python用法
- java jtextfield 事件_java – 处理JTextField中的编辑事件
- 【图像处理】图像灰度级减少, 图像缩放(Reducing the Number of Gray Levels, Zooming and Shrinking)
- 把执行结果转成json对象报错_于一次JSON格式错误 之 手把手带你走一波FastJSON将对象转成JSON字符串流程...
- Java读取URL到字符串
- Linux安装jdk、删除Open jdk
- gmp新附录 计算机系统,GMP新附录:计算机系统.doc
- cherry MX-BOARD 3.0 拆解
- H3C防火墙基础配置1-登录配置、安全域配置
- 高校大学生可以免费领半年阿里云服务器
- 计算机电源出现问题,电源故障引起的电脑问题
热门文章
- HDU - 3126 Nova(最大流+二分+简单几何)
- CodeForces - 1168B Good Triple(思维+暴力)
- navicat创建数据库后显示图标灰色,右键后无法新建数据库
- api 微信内置浏览器js_多端开发框架uni-app入坑指南,一套代码适用微信、头条等小程序...
- Tomcat虚拟目录的配置
- 单位根反演[loj6485]LJJ 学二项式定理
- Kafka端到端审计
- [六]RabbitMQ-客户端源码之AMQCommand
- 学会这几招让 Go 程序自己监控自己
- 数据结构--图(Graph)详解(四)