个人主页: 叶落闲庭
我的专栏:
c语言
数据结构
javaEE
操作系统
Redis
石可破也,而不可夺坚;丹可磨也,而不可夺赤。
方法区中的InstanceKlass对象是用C++编写的,Java代码一般不能直接操作用C++语言编写的对象,所以Java就在堆区上创建了一个Java.lang.Class用Java语言包装之后的对象,可以让Java在代码中获取到,Java.lang.Class对象里包含的字段要少于方法区中InstanceKlass对象包含的字段,这样做的原因是对于开发者来说,并不需要访问InstanceKlass对象中的所有字段信息,例如Java底层实现多态时调用方法区中的虚方法表,这个虚方法表是不需要开发者调用的,这样Java虚拟机就能很好地控制开发者访问数据的范围.。
java -cp sa-jdi.jar sun.jvm.hotspot.HSDB
主要包含如下四部分,具体详见《Java虚拟机规范》:
- 1.文件格式验证,比如文件是否以OxCAFEBABE开头,主次版本号是否满足当前)ava虚拟机版本要求。
- 2.元信息验证,例如类必须有父类(super不能为空)。
- 3.验证程序执行指令的语义,比如方法内的指令执行中跳转到不正确的位置。
- 4.符号引用验证,例如是否访问了其他类中privatel的方法等。
Hotspot JDK8中虚拟机源码对版本号检测的代码如下:
return (major >= JAVA_MIN_SUPPORTED_VERSION) &&
(major <= max_version) &&
((major != max_version) ||
(minor <= JAVA_MAX_SUPPORTED_MINOR_VERSION));
数据类型 | 初始值 |
---|---|
int | 0 |
long | 0L |
short | 0 |
char | ‘\u0000’ |
byte | 0 |
bolean | false |
double | 0.0 |
引用数据类型 | null |
public class Demo4 {
public static int value = 1;
static {
value = 2;
}
public static void main(String[] args) {
}
}
iconst_1
putstatic #2 <com/jvmdemo/Demo4.value : I>
iconst_2
putstatic #2 <com/jvmdemo/Demo4.value : I>
return
iconst_1:将常量1放入操作数栈中
putstatic :从操作数栈中获取值设置到静态变量中(即设置value值为1)
iconst_2:将常量2放入操作数栈中
putstatic :从操作数栈中获取值设置到静态变量中(即设置value值为2)
-XX:TraceClassLoading
参数可以打印出加载并初始化的类public class Demo4 {
public static void main(String[] args) {
int i = Demo5.i;
System.out.println(i);
}
}
class Demo5 {
static {
System.out.println("初始化了");
}
public static int i = 0;
}
public class Demo4 {
public static void main(String[] args) {
int i = Demo5.i;
System.out.println(i);
}
}
class Demo5 {
static {
System.out.println("初始化了");
}
public static final int i = 0;
}