异常将上下文初始化事件发送到类的侦听器实例_深入浅出JVM性能调优——JVM内存( 七 )


3705: invokevirtual #22// Method sayHello:(Ljava/lang/String;)V
3718: return
372LineNumberTable:
373line 5: 0
374LocalVariableTable:
375StartLengthSlotNameSignature
376090thisLcom/lyyzoo/jvm/test01/User;
377MethodParameters:
378NameFlags
379strsynthetic
380
381【静态代码块】
382static {};
383descriptor: ()V
384flags: ACC_STATIC
385Code:
386stack=3, locals=0, args_size=0
3870: ldc#23// String Rambo
3882: putstatic#24// Field staticName:Ljava/lang/String;
3895: bipush20
3907: putstatic#25// Field staticAge:I
39110: getstatic#5// Field java/lang/System.out:Ljava/io/PrintStream;
39213: ldc#26// String user static init
39315: invokevirtual #13// Method java/io/PrintStream.println:(Ljava/lang/String;)V
39418: getstatic#5// Field java/lang/System.out:Ljava/io/PrintStream;
39521: new#6// class java/lang/StringBuilder
39624: dup
39725: invokespecial #7// Method java/lang/StringBuilder."":()V
39828: ldc#27// String staticName=
39930: invokevirtual #9// Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
40033: getstatic#24// Field staticName:Ljava/lang/String;
40136: invokevirtual #9// Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
40239: invokevirtual #12// Method java/lang/StringBuilder.toString:()Ljava/lang/String;
40342: invokevirtual #13// Method java/io/PrintStream.println:(Ljava/lang/String;)V
40445: getstatic#5// Field java/lang/System.out:Ljava/io/PrintStream;
40548: new#6// class java/lang/StringBuilder
40651: dup
40752: invokespecial #7// Method java/lang/StringBuilder."":()V
40855: ldc#28// String staticAge=
40957: invokevirtual #9// Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
41060: getstatic#25// Field staticAge:I
41163: invokevirtual #11// Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
41266: invokevirtual #12// Method java/lang/StringBuilder.toString:()Ljava/lang/String;
41369: invokevirtual #13// Method java/io/PrintStream.println:(Ljava/lang/String;)V
41472: return
415LineNumberTable:
416line 13: 0
417line 14: 5
418line 22: 10
419line 23: 18
420line 24: 45
421line 25: 72
422 }
423 Signature: #73// Lcom/lyyzoo/jvm/test01/Person;Ljava/io/Serializable;
424 SourceFile: "User.java"
我们也可以安装 [] 插件,就可以在IDEA中清晰地看到 Class 包含的信息:
1、魔数与Class文件信息
魔数唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件 。使用魔数而不是扩展名来进行识别主要是基于安全考虑,因为文件扩展名可以随意改动 。
是次版本号,Major是主版本号 。Java的版本号是从45开始的,JDK 1.1之后的每个JDK大版本发布主版本号向上加 1,所以 jdk1.8 的 Major是 52 。高版本的JDK能向下兼容以前版本的Class文件,但不能运行以后版本的Class文件 。
flags 用于识别类或者接口层次的访问信息,比如这个Class是类还是接口;是否定义为类型;是否定义为类型 等等 。
2、常量池
虚拟机把常量池组织为入口列表,常量池中的许多入口都指向其他的常量池入口(比如引用了其它类),而且 class 文件中的许多条目也会指向常量池中的入口 。列表中的第一项索引值为1,第二项索引值为2,以此类推 。虽然没有索引值为0的入口,但是会把这一入口也算进去,比如上面的pool count 为 119,而常量池实际的索引值最大为 118 。
常量池主要存放两大类常量:字面量和符号引用 。
常量池中每一项都是一个表,常量表主要有如下17种常量类型 。