• Java虚拟机


    Java虚拟机

    反编译字节码文件

    javap -v Demo.class

    类加载的过程

    阶段1:加载(Loading)
    1. 通过类的权限名获取定义此类的二进制字节流

    2. 将这个字节流所代表的静态存储数据转化为方法区的运行时数据结构

    3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

    阶段2:链接(Linking)
    1. 验证:目的在确保Class文件的字节流中包含信息符合当前虚拟机要求,确保被加载类的正确性,不会危害虚拟机自身安全
    2. 准备:为类变量分配内存并且设置该类变量的默认初始值,即零值;这里不包含final修饰的static,因为final在编译的时候就会分配了;这里不会实例变量分配初始化,变量会分配在方法区中,而实例对象是会随着对象一起分配到Java堆中
    3. 解析:将常量池内的符号引用转化为直接引用的过程
    阶段3:初始化(Initialization)
    • 初始化阶段就是执行类构造器方法()的过程。
    • 此方法不需定义,是javac编译器==自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来。(非static修饰的变量不属于类,而是属于对象? 所以类变量静态变量)
    • 构造器方法中指令按语句在源文件中出现的顺序执行。
    • () 不同于类的构造器。
    • 若该类具有父类,JVM会保证()执行前,父类的()已经执行完毕
    • 虚拟机必须保证一个类的()方法在多线程下被同步加锁
    扩展:为什么要用内部静态类实现单例模式是线程安全的?
    //基于类初始化的线程安全的单例
    class SingleTon{
    	
    	private SingleTon(){} 
    	
        // 1. 静态内部类不引用时不加载,避免内存浪费。
        // 2. 如果同时被多个线程引用,JVM会保证只有一个线程执行方法,进行类变量的赋值和静态代码块的运行
    	private static class InnerClass{
    		private static  SingleTon instance= new SingleTon();	
    	}
    	public static SingleTon getInstance(){//如果没有到这里,那么不会加载上面的内部类
    		return InnerClass.instance; //这里将导致InstanceHolder类被初始化
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    静态内部类的优点是:

    ​ 外部类加载时并不需要立即加载内部类,内部类不被加载则不去初始化INSTANCE,故而不占内存。具体来说当SingleTon第一次被加载时,并不需要去加载InnerClass,只有当getInstance()方法第一次被调用时,使用INSTANCE的时候,才会导致虚拟机加载InnerClass类。这种方法不仅能确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。

    怎么实现的?

    方法:这不是由程序员写的程序,而是根据代码由javac编译器生成的。它是由类里面所有的类变量的赋值动作和静态代码块组成的。JVM内部会保证一个类的方法在多线程环境下被正确的加锁同步,也就是说如果多个线程同时去进行“类的初始化”,那么只有一个线程会去执行类的方法,其他的线程都要阻塞等待,直到这个线程执行完方法。然后执行完方法后,其他线程唤醒,但是不会再进入()方法。也就是说同一个加载器下,一个类型只会初始化一次。

  • 相关阅读:
    Bootstrap快捷开发【前端Bootstrap框架】
    本地生活服务平台有哪些?哪个靠谱?
    链表面试题(图文详解)
    graphite statsd接口数据格式说明
    python的集合应用
    一种改进多旋翼无人机动态仿真的模块化仿真环境研究(Matlab代码实现)
    [附源码]计算机毕业设计实验室管理系统Springboot程序
    服务器可以充当负载均衡器
    项目01—基于nignx+keepalived双vip的负载均衡高可用Web集群
    K-means聚类算法一文详解+Python代码实例
  • 原文地址:https://blog.csdn.net/zhulianwei1999/article/details/126614498