理解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类的加载机制