【JVM】基础概念点

 

类加载过程

  1. load:把硬盘上的class文件,加载到内存中
  2. link
    1. 校验:验证class文件是否符合jvm规定(比如开头是不是cafe babe)
    2. 准备:把静态变量赋默认值
    3. resolution:内存中对象的符号引用转换为直接应用
  3. init:给静态变量赋初始值

类加载器

  • lib包中的基础类由classLoader加载
  • ext包中的类由extClassLoader加载
  • 应用中的类由applicationClassLoader加载
  • 还可以自定义类加载器

以上按顺序加载。是属于子加载器与类加载器的关系,注意在语法上不是继承关系。

classLoader把extClassLoader加载到内存中,extClassLoader把appClassLoader加载到内存中,app加载自定义

DCL的instance对象为什么要加volation?

double check lock(双重检查锁单例)在jvm中,顺序是

  1. 申请内存空间
  2. 创建初始值
  3. 将对象的引用指向内存空间。

如果没有volation,可能会发生指令重排,2和3会颠倒,此时,最终结果是没有区别的。但是,一个线程在进行1、3的时候,另外一个线程判断instance == null?则会拿到默认值!

双亲委派

目的是为了:安全

类是由从子到父的内存中加载,如果父没有,则从父到子去寻找加载

打破双亲委派机制

  1. 如何打破:重新loadClass()方法即可
  2. 何时打破:
    1. jdk1.2之前,自定义classLoader都必须重写loadClass()
    2. ThreadContextClassLoader可以实现基础类调用实现类代码,通过thread.setContextClassLoader()指定
    3. 热启动、热部署
      1. osgi、tomcat都有自己的模块制定classLoader(可以加载同一类的不同版本)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值