虚拟机类加载相关学习的解释

一天更新两篇博文算是我的上限了,这篇文章我会一点一点的谈及Java虚拟机的机制,以及Java内存泄露的问题,实际我不应该在这里谈及Java泄露的问题,主要原因是因为这个内容应该和Java内存的讲解一起去讲解,可是我看之前写的一篇博文已经简短的说过了Java内存的问题,这里讲的Java内存泄露问题就当成是之前Java内存方面的一个提高,接下来我们不多废话开始虚拟机类加载机制的理解记录。

首先了解Java虚拟机加载机制,最基本的是要知道了解一个大体的流程:


大体流程就和图片一样,图片略微粗糙了一点,可是表达还算清晰吧(估计也就我自己不嫌弃),首先加载也不用我太多说,就是把Class文件加载到虚拟机内存中,这实际就是个二进制流而已,但是之后的过程或许并不像我给出图片的那样按部就班的执行,加载,验证,准备,初始化,以及卸载这几个过程是相对不变的,这里我明确指出这五个步骤是相对位置不变,解析有的时候甚至在初始化之后进行的,这里面我们最主要了解也是对于代码员重要的部分就是初始化这个问题,虚拟机在初始化问题上明确提出,

1。当遇到new ,getstatic ,putstatic ,invokestatic,这四个字节码指令时,没初始化的都要初始化,(估计很多程序员也就见到过new,剩下三个平时少见),

2.还有就是我们我们常用的Java反射包,当它调用时,调用的类没初始化就要初始化,

3.一个类初始化发现父类还没初始化,首先初始化父类,这个不用太细节说明应该也没问题。

4.当虚拟启动时虚拟机先初始化main()函数所在的那个类。

实际还有第五种是Java1.7的动态语言支持下调用一些java.lang.invoke.methodHandle的类需要先实例化一下。

这里顺便说一下接下来的“小栗子”,这个例子不光展示了一个初始化过程,而且避免了一个误区就是static{}这个静态块里面的代码是要对应的类实例化后才会生效的。

public class Father{

static {

System.out.println("Father is coming ");

}

public static int f=6666;

}

public class Son extends Father{

static{

System.out.println("Son is coming");

}

}

public class Initialization{

public static void main(String[] args){

System.out.println(Son.f);

}

}

实际我想说这个程序最后会输出什么最好不要看,我给出的结果,这个过程实际能思考好多的问题,如果你真的读完我写的虚拟机相关的内容。

结果就是father is coming 

              2

这个例子使得进一步理解初始化过程变得更加的容易。

之后我再给个例子:

public class test{

static{

System.out.println("this is Initialization");

}

public static final value=9;

public static void main(String [] args){

System.out.println(test.value)

}

}

结果应该很明显,只有9,为什么呢,这里final类型的字段会在虚拟机记载中存入方法区中的常量池,并且直接赋值,而如果只是static的静态变量的话,会在加载阶段在方法区的常量池中给个初始值,初始化时才会真的把你想的值给字段。算是一个小的理解吧。

这里接着说验证阶段,实际这个阶段对于开发人员还真就是没什么接触的可能,听名字也知道就是由Java虚拟机去验证加载进来的二进制流到底有没有符合要求,检验一些Java语法是否符合等。(如果有对这个阶段有很独到见解可以私信我,我们一起探讨一下)

准备阶段主要给带static的字段进行分配内存,上面我提到了。

解析阶段会将一些符号引用转换为真正意义上的引用,指针之类的都是。

初始化阶段上面零零散散也提到了很多,

public class Father {
public static int a=1;
static{
a=0;
}
static class son extends Father{
public static int b=a;
}
public static void main(String[] args){
System.out.println(son.b);
}
}

这个例子也算一个吧,结果

是0;

紧接着谈谈类加载器这么个神奇的东西,会在接下来的篇幅去写,这些内容都是我看Java虚拟机书上的内容后自己加以理解写下来了,如果有问题,随时欢迎探讨,如果是项目上的那就更好了,我坚持生产与知识结合才算是真的学习,嘛,虽然我还只是个没毕业的计算机学生


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值