Java的JVM虚拟机

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/someby/article/details/82935673


    1.JVM就是Java的OS,Java是通过JVM来访问硬件的(其实JVM首先访问底层OS,例如linux的功能,透过底层OS来访问硬件);
    2.JVM概览

  
    3.Class Loader将class加载到Runtime Data Areas,Execution Engine会完成Byte Code的解释或者编译,最终转换为机器码执行;
    4.Java在默认情况下是对字节码边解释边执行,所以会比较慢,因此后来的JVM推出来HotSpot功能,用的热点代码直接变异把虚拟机认为的经常使用的热点代码直接编译成本地的OS的二进制,这样以后再次使用的时候就直接使用本地的二进制代码去运行,不用再次解释就能执行;
    5.Class Loader(类加载器):其实由BootStrap Class Loader、Extension Class Loader,System class Loader,User-Define class Loader等四种类记载器;

加载类详情:深入理解Java类加载器(ClassLoader)

    BootStrap Class Loader(启动类加载器):
        启动类加载器主要加载的是JVM自身需要的类,这个类加载使用C++语言实现的,是虚拟机自身的一部分,它负责将 <JAVA_HOME>/lib路径下的核心类库或-Xbootclasspath参数指定的路径下的jar包加载到内存中,注意必由于虚拟机是按照文件名识别加载jar包的,如rt.jar,如果文件名不被虚拟机识别,即使把jar包丢到lib目录下也是没有作用的(出于安全考虑,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类)。

    Extension Class Loader(扩展类加载器):    
        扩展类加载器是指Sun公司(已被Oracle收购)实现的sun.misc.Launcher$ExtClassLoader类,由Java语言实现的,是Launcher的静态内部类,它负责加载<JAVA_HOME>/lib/ext目录下或者由系统变量-Djava.ext.dir指定位路径中的类库,开发者可以直接使用标准扩展类加载器。
    System Class Loader(系统类加载器):
        也称应用程序加载器是指 Sun公司实现的sun.misc.Launcher$AppClassLoader。它负责加载系统类路径java -classpath或-D java.class.path 指定路径下的类库,也就是我们经常用到的classpath路径,开发者可以直接使用系统类加载器,一般情况下该类加载是程序中默认的类加载器,通过ClassLoader#getSystemClassLoader()方法可以获取到该类加载器。 


    6.类的查找是自底向上,而类的加载是自顶向上;类加载器是系统优先;
    7.下层的类加载器可以看见上层的类加载器,当时上层的类加载器无法看到下层的类加载器的类;
    8.类加载器可以加载类,但是不可以卸载类,
    9.loading->Linking->Initializing ,其中linking中包含Verifying:检查类是否符合Java文件规范和JVM规范;
    Preparing:分配所需要的内存以及属性、方法所需要的数据结构;
    Resovlving:常量池中符号引用改为直接引用;
    Inatializing:主要是初始化类的局部变量并为类的静态变量且执行静态代码块;
    10.类加载的方法:
    Class.forName:使用当前类的加载器加载类
    Thread.currentThread.getContextClassLoader():
    11.在整个程序运行的时候数据区域有两块:一个是线程本地的数据区,另外一个是全局共享的数据区域(Heap、Method Area、Runtime Constant Pool )


    12.GC(详细参考:Java GC介绍

猜你喜欢

转载自blog.csdn.net/someby/article/details/82935673