【中级02】Java Class字节码文件底层逻辑详解

本文介绍了Java的Class文件结构,包括其无符号数和表的数据类型,以及如何通过Sublime查看16进制形式。同时,文章探讨了String与StringBuffer的效率问题,指出在大量字符串拼接操作下,StringBuffer由于避免了重复对象创建,其效率优于String。通过`javap -verbose`命令展示了两者字节码的差异,进一步证明了这一点。
摘要由CSDN通过智能技术生成

Java的class文件是什么

        Class文件是jvm认识的一种字节码文件,里面的地址都是逻辑的地址。最后需要运行在操作系统中,操作系统只能识别真实的物理地址。此时需要动态链接(这个过程就是将逻辑地址变成物理地址),就是在运行时动态地绑定对象、对象地址。

此外,它还是一组以8位字节为基础单位的二进制流(容错性低,错一个字节则整个class文件不可用;节省空间\可以不用定义传输的格式,比如json,xml,而直接用二进制流传输数据),各个数据项目严格按照顺序紧凑地排列在Class文件中,中间没有添加任何的分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必需数据。

Class字节码文件只有两种数据类型:无符号数(u)和表(info)。

Class文件的规范可以在oracle的 jvm规格说明书 的第4节(4. The class File Format)中查看:

u4:4字节无符号数,u2类似

将一个.class文件用sublim打开,查看16进制形式,这个16进制形式按上面的ClassFile Structure对应解析例如:

package main.test;
public class classtest {
    public static void main(String[] args) {
        int a = 11;
        int b = 22;
        int c = a+b;
        System.out.println(c);
    }
}

生成class字节码后用sublim打开

cafe babe 0000 0034 0024 0a00 0500 1709
0018 0019 0a00 1a00 1b07 001c 0700 1d01
0006 3c69 6e69 743e 0100 0328 2956 0100
0443 6f64 6501 000f 4c69 6e65 4e75 6d62
6572 5461 626c 6501 0012 4c6f 6361 6c56
6172 6961 626c 6554 6162 6c65 0100 0474
6869 7301 0015 4c6d 6169 6e2f 7465 7374
2f63 6c61 7373 7465 7374 3b01 0004 6d61
696e 0100 1628 5b4c 6a61 7661 2f6c 616e
672f 5374 7269 6e67 3b29 5601 0004 6172
6773 0100 135b 4c6a 6176 612f 6c61 6e67
2f53 7472 696e 673b 0100 0161 0100 0149
0100 0162 0100 0163 0100 0a53 6f75 7263
6546 696c 6501 000e 636c 6173 7374 6573
742e 6a61 7661 0c00 0600 0707 001e 0c00
1f00 2007 0021 0c00 2200 2301 0013 6d61
696e 2f74 6573 742f 636c 6173 7374 6573
7401 0010 6a61 7661 2f6c 616e 672f 4f62
6a65 6374 0100 106a 6176 612f 6c61 6e67
2f53 7973 7465 6d01 0003 6f75 7401 0015
4c6a 6176 612f 696f 2f50 7269 6e74 5374
7265 616d 3b01 0013 6a61 7661 2f69 6f2f
5072 696e 7453 7472 6561 6d01 0007 7072
696e 746c 6e01 0004 2849 2956 0021 0004
0005 0000 0000 0002 0001 0006 0007 0001
0008 0000 002f 0001 0001 0000 0005 2ab7
0001 b100 0000 0200 0900 0000 0600 0100
0000 0200 0a00 0000 0c00 0100 0000 0500
0b00 0c00 0000 0900 0d00 0e00 0100 0800
0000 6a00 0200 0400 0000 1210 0b3c 1016
3d1b 1c60 3eb2 0002 1db6 0003 b100 0000
0200 0900 0000 1600 0500 0000 0400 0300
0500 0600 0600 0a00 0700 1100 0800 0a00
0000 2a00 0400 0000 1200 0f00 1000 0000
0300 0f00 1100 1200 0100 0600 0c00 1300
1200 0200 0a00 0800 1400 1200 0300 0100
1500 0000 0200 16

则,

cafe babe  (u4   magic;)

0000(u2             minor_version;)

0034(u2             major_version;)

0024(u2             constant_pool_count;)

......

其余类似。

栗子:

string和stringbuffer的效率孰高孰低?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值