深入理解JVM(学习过程) (19)

所有的静态变量和静态代码块赋值都是在clinit中执行的。

字节码对this关键字和异常的处理 /** -=this关键字的总结=- 对于Java类中的每一个实例方法(非static方法),其在编译后所生成的字节码当中,方法参数的数量总会比源代码方法中的参数量多一个(this),它位于方法的第一个参数位置处,这样我们就可以在Java的实例方法中使用this来访问当前对象的属性以及其他方法。 这个操作是在编译期间完成的。由Javac编译器在编译的时候将对this的访问转化成对一个普通实例方法参数的访问;接下来的运行期间,由JVM在调用实例方法时,自动向实例方法传入该this参数。所以在实例方法的局部变量中,至少会有一个指向当前对象的局部变量。 */ /** -=Java字节码对于异常的处理方式:=- 1. 统一采用异常表的方式来对异常进行出来的。 2. 在jdk1.4.2之前的版本中,并不是使用异常表的方式来对异常进行处理的,而是采用特定的指令方式进行处理的。 3. 当异常处理存在finally语句块时,现代化的JVM才去的处理方式是将finally语句块的字节码拼接到每一个catch块后边,换句话说,程序中存在多少个catch块,就会在每一个catch块后面重复多少个finally语句块的字节码。 */ public class MyTest3 { public void test(){ try{ FileInputStream fileInputStream = new FileInputStream("t.txt"); ServerSocket serverSocket = new ServerSocket(9999); serverSocket.accept(); }catch(FileNotFoundException exc){ }catch(IOException ex){ }catch(Exception e){ }finally { System.out.println("exception"); } } }

test()中的Code中三个参数的说明:

stack=3 ;"最大栈深度" (对于方法栈,压栈弹出。)

locals =4 ; "成员变量的个数" (局部变量有: this,is ,serverSocket , ex (同时只能有一个异常的参数))

agrs_size=1 "参数的个数“(第一个默认的都是this)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfdfy.html