什么是java类加载?

类加载是指将.class类中的二进制数据存放到内存中,会在内存中的推中建立一个java.lang.String的引用对象来存放方法区的数据结构,而类中的数据会放到方法区中

类加载器不需要等到某个类要用的时候在加载他,jvm允许预先加载,如果在加载的过程中有错误,类加载会抛出异常。但是如果在使用的过程当中没有用到错误的类,则程序是不受影响的

类的生命周期

加载——》验证——》准备——》解析——》初始化——》使用——》结束   其中 验证,准备,解析阶段属于 连接阶段

说明:

加载:查找并加载二进制数据。

1,通过类名去找到定义的二进制数据

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

3,在java内存堆中生成一个java.lang.String 引用对象来方便作为对方法区的访问路口

连接过程 三个阶段

验证:确保被加载类的正确性

  1.文件格式正确,验证文件字节流是否符合class文件格式规范

  2.元数据验证:对字节码描述的信息语义进行分析,确保符合java语言规范

  3.字节码验证:通过对字节控制流的分析,确保程序语义合法性

  4.符号引用验证:确保解析动作的正确性

准备:为类的静态变量分配内存,并初始化值

解析:把类中的符号引用转成直接引用

初始化:为类的静态变量赋值,jvm负责对类初始化,主要对类变量的初始化

    1,声明变量指定初始值

    2,使用静态代码块为类变量赋值

jvm初始化步骤:

    1,如果这个类没有被加载,那么程序先加载连接

    2,如果类的直接父类没有被加载,则先初始化父类

    3,如果类中有初始化语句,则依次执行初始化语句

结束:

  1,system.exit()语句

  2,程序正常结束

  3,程序异常或错误

  4,jvm虚拟机停止

JVM加载机制

  1,全盘加载:当一个类的加载器加载某个类的时候,该类的所有东西都归这个类加载器加载,除非显示了要被另外一个加载器加载

  2,父类加载:加载某个类的时候,由他的父类加载,如果父类找不到或者加载失败,则才会自己加载

  3,缓存加载:所有加载过的class会放在缓存中,当需要加载某个class的时候会到缓存中去找这个class。如果找不到,则会重新去读取该class的二进制数据,然后重新加载放到缓存中。这就是为什么当修改了class文件后要重启jvm的原因

类加载有三种方式

  1,jvm命令加载

  2,Class.forName()方法加载

  3,ClassLoader.loadClass()加载

区别:forName()不紧会将类加载到jvm中,而且会执行其构造方法,而loadClass()只会将类加载到jvm中,但是不会执行其方法

双亲委派模式

  双亲委派模式会把类拖给父类加载,父类又给父类的父类加载,就像递归一样,一层一层往上丢。如果父类加载不到它,它才会自己加载

classLoader源码分析

public Class<?> loadClass(String name)throws ClassNotFoundException {
    return loadClass(name, false);
}

protected synchronized Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException {
  // 首先判断该类型是否已经被加载
  Class c = findLoadedClass(name);
  if (c == null) {
    //如果没有被加载,就委托给父类加载或者委派给启动类加载器加载
  try {
    if (parent != null) {
      //如果存在父类加载器,就委派给父类加载器加载
      c = parent.loadClass(name, false);
    } else {
      //如果不存在父类加载器,就检查是否是由启动类加载器加载的类,通过调用本地方法native Class findBootstrapClass(String name)
      c = findBootstrapClass0(name);
    }
  } catch (ClassNotFoundException e) {
    // 如果父类加载器和启动类加载器都不能完成加载任务,才调用自身的加载功能
    c = findClass(name);
  }
}
  if (resolve) {
    resolveClass(c);
  }
  return c;
}

 

原文来自:http://www.cnblogs.com/ityouknow/p/5603287.html  此博客将的非常清楚,大家如果有兴趣可以去仔细阅读下

java内存加载机制的更多相关文章

  1. java class加载机制及对象生成机制

    java class加载机制及对象生成机制 当使用到某个类,但该类还未初始化,未加载到内存中时会经历类加载.链接.初始化三个步骤完成类的初始化.需要注意的是类的初始化和链接的顺序有可能是互换的. Cl ...

  2. Java ClassLoader加载机制理解 实际例子

    针对 Java ClassLoader加载机制理解, 做了个如何自定制简单的ClassLoader,并成功加载指定的类. 不废话,直接上代码. package com.chq.study.cl; im ...

  3. Java ClassLoader加载机制理解

    今天看到了一篇介绍Java ClassLoader加载机器的文章, 才发觉一直来自己的肤浅, 好好地给补了一课, 不得不存档! 原文地址: http://www.blogjava.net/lhulcn ...

  4. java动态加载机制

    假设有一个class,ClassLoader首先把它load到内存里的code segment(内存里存放代码段的),站在ClassLoader的角度,内存里的一个一个的class就是一个一个的对象, ...

  5. Java ClassLoader加载机制

    一.体系结构(自上向下) 1.Bootstrap ClassLoader(BootStrapClassLoader) --- 启动类加载器或者叫引导类加载器,加载jdk核心的APIs,这些APIs一般 ...

  6. 很考验人的java内存加载面试题

    源代码如下,求结果 public class MemoryAnalyse { public static int k = 0; public static MemoryAnalyse t1 = new ...

  7. 看起来很懵的java内存加载面试题

    源代码如下,求结果 public class MemoryAnalyse { public static int k = 0; public static MemoryAnalyse t1 = new ...

  8. jvm系列(一):java类的加载机制

    java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...

  9. Java高级之虚拟机加载机制

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 1.0版本:2016-05-21 SubClass!! 执行结果说明一个问题:子类调用父类变量的时候 ...

随机推荐

  1. 车道线识别/Opencv/传统方法

    车道检测(Advanced Lane Finding Project) 实现步骤: 使用提供的一组棋盘格图片计算相机校正矩阵(camera calibration matrix)和失真系数(disto ...

  2. 如何注册Uber司机(全国版最新最详细注册流程)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://didi-uber.com/archiv ...

  3. Luogu3804 【模板】后缀自动机

    题面 题解 一个串的出现次数等于$endpos$的大小,也是$parent$树上节点的$size$大小, 构建出后缀自动机,按拓补序,模拟即可. 代码 #include<cstdio> # ...

  4. 【BZOJ1951】[SDOI2010]古代猪文

    [BZOJ1951][SDOI2010]古代猪文 题面 bzoj 洛谷 题解 题目实际上是要求 $ G^{\sum d|n\;C_n^d}\;mod \; 999911659 $ 而这个奇怪的模数实际 ...

  5. SRM 563 500pts SpellCards

    SpellCards 题意: 有n张符卡排成一个队列,每张符卡有两个属性,等级li和伤害di. 两种操作: 1.把队首的符卡移动到队尾:2.使用队首的符卡,对敌人造成di点伤害,并丢弃队首的li张符卡 ...

  6. Yii2.0 高级模版编写使用自定义组件(component)

    翻译自:http://www.yiiframework.com/wiki/760/yii-2-0-write-use-a-custom-component-in-yii2-0-advanced-tem ...

  7. linux挂在samba服务器到本地(用于备份文件到nas或者windows的文件服务器)

    1.安装工具 首先在linux上安装samba访问工具 sudo apt-get install smbclient sudo apt-get install cifs-utils 2.查看服务器目录 ...

  8. Android 自动化测试及性能数据采集的 Python 脚本

    文主要介绍一个基于 uiautomator2 封装的一个 Python 库 android-catcher ,该库的功能主要有对 Android 设备进行 UI 自动化测试 和 采集手机性能数据 ,适 ...

  9. 英特尔® 实感™ 前置摄像头 SR300 和 F200 的比较

    原文地址 简介 SR300 是支持 Microsoft Windows 10 操作系统的第二代英特尔® 实感™ 前置摄像头. 与 F200 摄像头型号相似,SR300 使用编码光深技术,在更小范围内创 ...

  10. PHP核心技术——魔术方法

    魔术方法: 魔术方法是以两个下画线开头.具有特殊作用的一些方法,可以看做PHP的"语法糖". set和get方法: class Account{ private $user=1; ...