初始化:类初始化的时候就是触发到了new、getstatic、putstatic或invokestatic这4条指令的时候,也就是通常在开发过程中new对象的时候,读取或设置一个的静态字段,以及调用静态方法,被final修饰与已被编译器把结果放入常量池的静态字段除外 。
初始化一个类的时候其父类还没初始化,也会触发其父类初始化 。
但JVM最先初始化的是,main()方法这个类 。
如:现在卫生局要检查卫生了,卫生局通过信息文档的省、市、区、详细地址这个信息知道了接下来要检查卫生的店在哪里,检查的结果是要写在对应的检查结果文档上的,所以要将这个信息文档上的信息(地址、营业执照等)转化为检查结果文档的格式,并生成一个这个要检查的店的专门一个检查结果的基本文档,接下来要先在系统上记录什么时候去检查,验证这些信息有没有输入错误,接下来要根据这家店的情况,准备下检查的固定事项(final),以及一些可能临时的事项(类变量),检查人员要准备出发了,要先把检查结果文档下载下来,打印成文件出来便于做记录,接下来检查人员到了店面进行检查,检查完了之后将记录下来的内容结果上传到对应的系统上 。
解释器
为什么要有?
我们都知道JVM是为了实现跨平台,写一次到处跑的实现理念,但不同的机器可能因为生产厂家或操作系统等原因有着不一样的标准,那么其机器底层执行的指令等可能各有区别 。
是什么?
将要执行的字节码转换为机器码,而这个解释是一句一句的解释,这个也说明了Java是解释性语言 。
即时编译器(JIT)
为什么要有?
刚刚我们说到了解释器,其实JIT和解释器做的事情是一样的,但如果每次都要进行一句句的解释,那么效率太低 。
是什么?
JIT和解释器做的事情是一样的,都是为了将要执行字节码转换为机器码,而不一样的是,JIT类似在编程的过程中将经常使用的数据放到缓存中,所以JIT会把经常使用的字节码,如:循环等高频率使用方法,它是以方法为单位一次性将整个方法的字节码编译为机器码 。
而对于一个方法是否是经常使用,会通过探测热点的方式 。
既然是探测热点的方式,这里提一个最基本的思路,用一个计数器,但达到相应的阈值的时候就判定是热点代码,但是维护比较麻烦,接下来我们会提到内存哪一块是线程独有,哪一块是线程共享,这里就会存在问题,技术有优点也有缺点 。
执行引擎
为什么要有?
当编译器转换为机器码了之后总要有东西去告知底层操作系统或某个操作者,接下来要做什么 。
是什么?
执行引擎主要还是告知底层操作要做的事情,只是一个概念上的词,上面说到的编译器也可以理解为是有一个编译执行引擎,所以这个只是概念上的东西 。
本地接口
为什么要有?
这其中是有历史原因吧,因为Java在问世的时候,C语言的程序是主流的,那么多程序是使用C语言,那么Java必然不可避免的要与C语言的程序进行交互,且Java是无法对操作系统底层进行访问和操作的,但是可以通过本地接口调用其他语言的实现实现对底层进行访问的操作 。
是什么?
就是为了融合不同的变成语言的程序为Java语言的程序所用,所以在在内存中开辟了一块专门的处理标记是native的代码,。
目前这种方法的使用越来越少了,除非是直接和硬件交互的,因为现在基本通过Socket等通信方式实现程序直接的交互 。
文章插图
文章插图
?
垃圾回收系统
为什么要有?
程序的运行的过程中,有一些是只运行一次或数次之后就不再运行了,而随着运行的时间增长,在系统中堆积的越来越多,最终超过系统的极限程序就停止了运行了 。
站在用户的使用角度来看,用一下就不能用,或进行一些数据运行的时候就忽然不能用了,作者相信这个是没有用户是可以容忍的 。
推荐阅读
- javascript中的事件
- 哇塞!GitHub 上这些 Java repo 太强了吧,看完都变大佬
- 一名高级的Javaer,应该了解的 MYSQL 高级知识点
- 我也没想到,Java开发 API接口可以不用写 Controller了
- Java中的封装、继承和多态,你真的都懂了吗
- 什么是 Java 的无服务器化?
- Javascript实现两变量值的互换
- java按顺序执行线程
- linux系统上查看载体为实体机还是虚拟机
- 线程安全问题无大小:Java中的线程安全之操作共享数据分类