理解Java虚拟机(1)之一个.java文件编译成.class文件发生了什么

最近在看《深入理解Java虚拟机》弄明白了很多java的底层知识,决定分几部分总结下,从.java文件编译,到类加载机制,内存分配

垃圾回收机制,线程并发,锁机制。

JVM虚拟机只能识别.class文件这种字节码文件,然后将字节码翻译成可执行的0,1;这个说明了JVM具有语言无关性,不仅仅是平台无关性,这也是scala,Grovvy,JRUby….能在JVM上运行的原因,各种语言通过不同的编译器将其编译成.class文件

从上面图可以看出来JVM支持很多语言,只要有语言的编译器编译成.class文件,顺带说下scala是函数式语言,在高并发领域很流行的,有人说java不灵活,其实完全可以JVM语言混编,底层并发用scala,业务层用java。下面下个java类看看具体编译成class文件。

public class TestClass{

private int id;

public String name;

public void sayHello(){

System.out.print("hello class ");

}

}

编译javac -TestClass.java,编译后class文件TestClass.class如下

cafe babe 0000 0033 0020 0a00 0600 1209

0013 0014 0800 150a 0016 0017 0700 1807

0019 0100 0269 6401 0001 4901 0004 6e61

6d65 0100 124c 6a61 7661 2f6c 616e 672f

5374 7269 6e67 3b01 0006 3c69 6e69 743e

0100 0328 2956 0100 0443 6f64 6501 000f

4c69 6e65 4e75 6d62 6572 5461 626c 6501

0008 7361 7948 656c 6c6f 0100 0a53 6f75

7263 6546 696c 6501 000e 5465 7374 436c

6173 732e 6a61 7661 0c00 0b00 0c07 001a

0c00 1b00 1c01 000c 6865 6c6c 6f20 636c

6173 7320 0700 1d0c 001e 001f 0100 1b63

6f6d 2f68 632f 7365 7276 6963 6549 6d70

2f54 6573 7443 6c61 7373 0100 106a 6176

612f 6c61 6e67 2f4f 626a 6563 7401 0010

6a61 7661 2f6c 616e 672f 5379 7374 656d

0100 036f 7574 0100 154c 6a61 7661 2f69

6f2f 5072 696e 7453 7472 6561 6d3b 0100

136a 6176 612f 696f 2f50 7269 6e74 5374

7265 616d 0100 0570 7269 6e74 0100 1528

4c6a 6176 612f 6c61 6e67 2f53 7472 696e

673b 2956 0021 0005 0006 0000 0002 0002

0007 0008 0000 0001 0009 000a 0000 0002

0001 000b 000c 0001 000d 0000 001d 0001

0001 0000 0005 2ab7 0001 b100 0000 0100

0e00 0000 0600 0100 0000 0600 0100 0f00

0c00 0100 0d00 0000 2500 0200 0100 0000

09b2 0002 1203 b600 04b1 0000 0001 000e

0000 000a 0002 0000 000c 0008 000d 0001

0010 0000 0002 0011

classs文件采用类似C语言结构体伪数据结构来存储数据,有2种数据类型无符号数和表,无符号数属于基本类型,以u1、u2、u4、u8分别代表1字节、2字节、4字节和8字节。无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码组成的字符串表是有多个无符号数或者其他表作为数据项构成的符合数据类型,所有表都习惯性地以info结尾。Class文件本质上就是一张表。

下面举几个字节码的含义

魔数 打头的”0xcafebabe”用来确定这个文件是否虚拟机能够接受的Class文件,固定值为0xCAFEBABE,它的作用是确定这个文件是否唯一能被虚拟机接受的Class文件,gif,jpg等文件头都存有魔数

版本,紧跟魔数后面的就是版本了,”0000 0033”,表示jdk1.7.0

下面是class文件版本号(参照《深入理解java虚拟机》)

就举这2个例子,对.class文件有个大概认识。

特么的,大夏天的感冒了,看书没动力,看书都没动力,接下来写java类的加载机制

java虚拟机编译文件,理解Java虚拟机(1)之一个.java文件编译成.class文件发生了什么...相关推荐

  1. python 打包 小文件_[Python][小知识][NO.5] 使用 Pyinstaller 打包成.exe文件

    1.安装 pyinstaller 插件 cmd命令:pip install PyInstaller PS . o.o 不知道 easy_install 的百度吧. 2.pyinstaller 简介 他 ...

  2. Python 实现office单个文件或整个文件夹(word,ppt,excel)转换成PDF文件,并获取PDF文件页数

    Python 实现office单个文件或整个文件夹(word,ppt,excel)转换成PDF文件,并获取PDF文件页数 文件夹中获取需要转换的文件数,将其全部转换或可单独转换单个文件,并获取转成PD ...

  3. Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法

    public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...

  4. Java基础(一) —— JDK安装、第一个Java程序、Java数据类型、修饰符、运算符、循环、条件

    Java基础(一) Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年 ...

  5. java gradle入门_Gradle入门:我们的第一个Java项目

    java gradle入门 这篇博客文章描述了如何使用Gradle编译和打包一个简单的Java项目. 我们的Java项目只有一个要求: 我们的构建脚本必须创建一个可执行的jar文件. 换句话说,我们必 ...

  6. 命令提示符使用java 类报错_lt;03gt;详解第一个Java程序

    详解第一个Java程序视频教程: Java轻松入门经典教程​ke.qq.com 1.编写源程序 新建一个文本文档,名称为HelloWorld,后缀为.java,右键编辑. 编写一个打印HelloWor ...

  7. java编程用户输入两个数字_编写一个Java应用程序,要求从键盘输入两个整数,计算这两个数据...,编写一个Java应用程序,要求从键盘输入一个数,判断该数是不...

    导航:网站首页 > 编写一个Java应用程序,要求从键盘输入两个整数,计算这两个数据...,编写一个Java应用程序,要求从键盘输入一个数,判断该数是不 编写一个Java应用程序,要求从键盘输入 ...

  8. Java 盖伦大战贾克斯~我的第一个java程序

    [b]进大学前就早闻Java君的大名,终于开始了我的Java之旅,话不多说,我的java君的<HelloWorld>,算是一个起点~[/b] 三个类,一个是Gailun类,一个jax类,( ...

  9. python怎么判断一个文件是否存在-python怎么判断一个目录下是否存在某个文件??谢啦!...

    12.2 C语言对文件操作的支持 12.2.1 文件的打开 FILE *fopen( "路径+文件名","读写模式"); FILE *fopen(const c ...

  10. python将csv文件拆分_在python中将一个csv拆分为多个文件

    我在python中有一个约5000行的csv文件,我想将其拆分为五个文件. 我为此写了一个代码,但是没有用 import codecs import csv NO_OF_LINES_PER_FILE ...

最新文章

  1. Matlab生成Xilinx Rom IP CORE的初始化内容coe文件
  2. hdu4291 暴力循环节+矩阵快速幂
  3. Fastboot的安装与使用
  4. PAT甲级1090 Highest Price in Supply Chain:[C++题解]树、结点到根结点的距离、记忆化搜索、树形dp
  5. 帝国cms调用相关文章若没有则调取最新文章
  6. Nagios监控Windows主机
  7. Windows scp传输文件给Linux
  8. linux 批量kill java进程
  9. Steeltoe之Config客户端篇
  10. 前端学习(1188):事件绑定
  11. 内购订单进行二次处理_更学教育:卖家在投诉异常订单的流程是怎么样的?
  12. java 看虚拟机内存_java 虚拟机内存介绍
  13. npm 包管理器的使用
  14. 3D目标检测论文汇总
  15. prn文件导入Matlab,PPP_code(Matlab) GPS精密单点定位中的周跳探测与修复的算法研究代码 GPS develop 238万源代码下载- www.pudn.com...
  16. 把win10系统迁移至ssd后,开机时电脑默认不会启动ssd里面系统的问题解决方法
  17. kali更新grub修复双系统windows10引导启动项
  18. 管理职工工资属于计算机什么应用领域,计算机练习题
  19. 市场排名第二的公有云,能否追上前面那个?
  20. 12306购票系统前端优化

热门文章

  1. (转)javascript匿名函数
  2. Cloud Native 介绍
  3. 【算法题】Multiples of 3 and 5
  4. 洛谷 P1529 回家 Bessie Come Home Label:Dijkstra最短路 乱搞
  5. (转)Tiny210v2( S5PV210 ) 平台下 FIMD 对应 的 framebuffer 驱动中,关于 video buffer 的理解...
  6. LINUX下SYN***战
  7. 计算机英文版个人简历发文,计算机个人简历英文_英文简历.doc
  8. 单据打印_Excel多功能进销存套表,自动库存单据,查询打印一键操作
  9. 决策树之前要不要处理缺失值_不要使用这样的决策树
  10. 数据中心细节_当细节很重要时数据不平衡