通过jclassLib观察栈帧 清疚 2021-09-18 07:12 261阅读 0赞 # 观察代码的栈帧 # package com.pl.jvm.stack; import java.util.Arrays; import java.util.List; /** * <p> * * @Description: TODO * </p> * @ClassName StackTest * @Author pl * @Date 2020/9/19 * @Version V1.0.0 */ public class StackTest { public static void main(String[] args) { List<String> strings = Arrays.asList("111", "22222"); getNum(strings); } public static int getNum(List<String> list){ int size = list.size(); return size; } } 方法描述 # main # ![18721752-94f2d7c55b55e380.png][] image.png # getNum # ![18721752-2d861c63f1cf2644.png][] image.png ## notice:参数类型组成 ## Ljava/util/List 这是由两部分组成: L代表引用类型 java/util/List 代表包名 java.util.list # Gneric info # Bytecode ![18721752-870e877f8758d9a0.png][] image.png Exception table ![18721752-3f88c75eca03f012.png][] image.png Misc ![18721752-131e4c02091b77e9.png][] image.png Code length 即Bytecode中字节码指令的长度 0-23 ![18721752-59010f0323a9ae96.png][] image.png # LineNumberTable # ![18721752-3e5ec8e7daf495a6.png][] image.png 对应java代码 notice: n1.StartPC和LineNumber对照表 StartPC和LineNumber 对应着看,一起描述main方法,StartPC描述字节码指令的行号,Linenumber对应代码中的行号,Nr代表索引。 这里可以看出 方法体实际是从19号开始,到21行结束, 结合ByteCode看 ![18721752-afc64b1c56da2520.png][] image.png n2.行号 代码中实际行号为LineNumber-1,而且return那行不在这个对照表中,\}这个括号也不算。 ![18721752-725e358fda9e3e58.png][] image.png args 0 对应 19,但是代码中是18,即LineNumber-1 # 局部变量表 # ![18721752-7d5c49bb1c9869f7.png][] image.png ## notice: ## ### n1:startPC和length ### startPC是字节码起始位置,length描述的是变量在字节码中的作用范围。 ![18721752-4903cb3beb1443de.png][] image.png args从0开始,作用范围为整个字节码长度。 strings从18开始,作用范围6。 startPC+Length=字节码的长度。 ### n2:如果返回值是其中的一个局部变量,那么返回值就不在局部变量表中,不多占用空间 ### ![18721752-f07a723920f81083.png][] image.png 局部变量表中有两个,list和size [18721752-94f2d7c55b55e380.png]: /images/20210918/80adebf9e9364e30bf3bfee93f62ec02.png [18721752-2d861c63f1cf2644.png]: /images/20210918/8555d669d54b43beba11344210bfcf01.png [18721752-870e877f8758d9a0.png]: /images/20210918/5444fc0712c4483686068d07bb136cec.png [18721752-3f88c75eca03f012.png]: /images/20210918/cc2821e4cdbc4b839fda6183fc4b4b71.png [18721752-131e4c02091b77e9.png]: /images/20210918/9988165447974ef6b82196c56c47c5b9.png [18721752-59010f0323a9ae96.png]: /images/20210918/93e11febb258497587479c5ee42c0657.png [18721752-3e5ec8e7daf495a6.png]: /images/20210918/4e063a9fb0564bb1a10437e4e1a986f0.png [18721752-afc64b1c56da2520.png]: /images/20210918/9491c5f2d6ff4f22b89d4f851d295a15.png [18721752-725e358fda9e3e58.png]: /images/20210918/63d11a02b9d1403eb6dc3a2a00833249.png [18721752-7d5c49bb1c9869f7.png]: /images/20210918/b3cdd676eb8e4ace8920ba15ac55ef07.png [18721752-4903cb3beb1443de.png]: /images/20210918/2ebff0279010450dae875e22fb6952bb.png [18721752-f07a723920f81083.png]: /images/20210918/ea62dc54dc394d90b8948c14617c579d.png
还没有评论,来说两句吧...