Java常量的基本类型在字节码中的规范定义

时间:2021-07-27 17:07:00

以下内容来自《Java特种兵》

类型字符 对应类型 说明
B byte 代表字节,但不是Byte的意思
Z boolean 代表布尔值,同样不是Boolean值
S short
C char
I int
J long
F float
D double
V void 没有返回值
LClassName; Reference 引用类,例如String被标识为:Ljava/lang.String;
[ Array Reference 数组的引用,例如double[][]被标识为:[[D;String[]被标识为:[Ljava.lang.String;

以上是在字节码中的规范定义。

之前用jmap命令查看java应用中的对象内容的时候,输出的一堆东西看不懂,但是对照着上面的规范之后就很清晰明了了,

1.用jps -l java应用

[app@localhost ~]$ jps -l
17439 sun.tools.jps.Jps
31456 com.test.bootstrap.Main
[app@localhost ~]$ 

2.输入命令jmap -histo:live 31456|more

[app@localhost ~]$ jmap -histo:live 31456|more

 num     #instances #bytes class name
----------------------------------------------
   1:        206707       14594424  [C
   2:         69903        9904328  <constMethodKlass>
   3:         69903        8959328  <methodKlass>
   4:          6543        7538872  <constantPoolKlass>
   5:        206312        4951488  java.lang.String
   6:          6543        4829504  <instanceKlassKlass>
   7:          5680        4465248  <constantPoolCacheKlass>
   8:         17715        2113904  [B
   9:         54203        1734496  java.lang.ref.WeakReference
  10:          2882        1486608  <methodDataKlass>
  11:         39774        1272768  java.util.concurrent.ConcurrentHashMap$HashEntry
  12:         30530        1221200  java.util.LinkedHashMap$Entry
  13:         22637         905480  java.lang.ref.SoftReference
  14:         14081         788536  java.beans.MethodDescriptor
  15:         21827         754632  [Ljava.lang.Object;
  16:          7799         684168  [Ljava.util.HashMap$Entry;
  17:          6978         682856  java.lang.Class
  18:         12115         678440  java.util.LinkedHashMap
  19:         28127         675048  java.beans.MethodRef
  20:          8424         673920  java.lang.reflect.Method
  21:          8810         577704  [S
  22:          7702         561816  [I
  23:         10000         530096  [[I

像以上内容的[C[[I 等等就能知道具体的含义了,char数组引用和int[][]引用。