一、虚拟机参数:
1、 -XX:+TraceClassLoding 用于追踪类的加载信息并打印出来 同理还有一个unLoading
保存、运行可以看到如下的信息
[Loaded java.lang.Object from C:\Program Files\Java\jdk1.8.0_191\jre\lib\rt.jar] 第二行就是我们常见的Object父类
会发先父类和子类都加载了,只是子类没有初始化,还是学习5的代码运行结果。
2、-XX: (所有的都是这个开头的) +<option> 开启option 选项
-<option> 关闭option 选项
<option>=value 将option选项的值设置为value
第一个例子完,开始第二个例子
二、注记符,常量的初始化
1、常量的初始化:
在编译阶段这个常量存入调用这个常量的那个方法所在的类的常量池当中,本质上,调用类并没有直接引用到定义常量的类,因此并不会出发定义常量类的初始化。
注意:这里指的是将常量存放到Mytest2的常量池中,之后与MyParent2就没有关系了,甚至,我们可以将MyParent2的class文件删除
package com.shengsiyuan.jvm.classloder;
//在编译阶段这个常量存入调用这个常量的那个方法所在的类的常量池当中
//本质上,调用类并没有直接引用到定义常量的类,因此并不会出发定义常量类的初始化
//注意:这里指的是将常量存放到Mytest2的常量池中,之后与MyParent2就没有关系了,
//甚至,我们可以将MyParent2的class文件删除
//注记符:
//ldc 表示将int,float 或是String类型的常量值从常量池推送至栈顶
//bipush 表示将单字节(-128~ 127)的常量推送至栈顶
//sipush 表示将一个短整型(-32768~ 32767)的常量推送至栈顶
//iconst_1 表示将int型 1 的常量推送至栈顶(1-5) iconst_2\iconst_5
public class Mytest2 {
public static void main(String[] args) {
//System.out.println(MyParent2.str);
System.out.println(MyParent2.m); //iconst_1
}
}
class MyParent2{
//public static String str="Hello world";
//final 本身是一个常量,在编译阶段这个常量存入调用这个常量的那个方法所在的类的常量池当中,因此放入到的是test2的常量池当中
public static final String str="Hello world";
public static final short s=7;
public static final int i=128;
public static final int m=1;
static {
System.out.println("MyParent2 static block");
}
}
2、注记符
在编译的目录下,反编译文件,会得到如下的结果,ldc就是一种注记符
注记符: ldc 表示将int,float 或是String类型的常量值从常量池推送至栈顶 bipush 表示将单字节(-128~ 127)的常量推送至栈顶 sipush 表示将一个短整型(-32768~ 32767)的常量推送至栈顶 iconst_1 表示将int型 1 的常量推送至栈顶(1-5) iconst_2\iconst_5
jvm_lecture\build\classes\java\main> javap -c com.shengsiyuan.jvm.classloder.MyTest2
这是这堂课学习的注记符