什么是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程序内存加载_java内存加载机制相关推荐

  1. java热加载_java热加载

    应用服务器一般都支持热部署(Hot Deployment),更新代码时把新编译的确类 替换旧的就行,后面的程序就执行新类中的代码.这也是由各种应用服务器的独 有的类加载器层次实现的.那如何在我们的程序 ...

  2. java在程序运行过程中_Java内存管理-程序运行过程(一)

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 勿在浮沙筑高台,出来混迟早要还的. 相信在做Java开发的伙伴一定知道 JVM(Java Virtual Machine( ...

  3. java中什么叫懒加载_java懒加载的原理

    聊一下以下名词.概念或用法:lazy.lazy="extra".inverse.fetch.fetch="join".fetch=" subselec ...

  4. java内存区域与内存溢出异常_Java内存区域与内存溢出异常

    Java的内存管理是一个老生常谈的问题,虽然Java号称可以自动管理自己的内存,使程序员从内存管理的围墙解放出来,但是一连串的内存泄漏和溢出方面的问题,使得我们不得不去深入了解Java的内存管理机制. ...

  5. java 获取内存使用情况_Java内存使用情况查看工具

    Java通过jvm自己管理内存,同时Java提供了一些命令行工具,用于查看内存使用情况. 这里主要介绍一下jstat.jmap命令以及相关工具. 一.jstat查看 gc实时执行情况 jstat命令命 ...

  6. java 内存屏障类型_Java内存模型精讲

    1.JAVA 的并发模型 共享内存模型 在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信 该内存指的是主内存,实际上是物理内存的一小部分 2.JAVA ...

  7. java split空值也保留_Java内存大家都知道,但你知道要怎么管理Java内存吗?

    前言 深入研究Java内存管理,将增强你对堆如何工作.引用类型和垃圾回收的认识. 你可能会思考,如果你使用Java编程,关于内存如何工作你需要了解哪些哪些信息?Java可以进行自动内存管理,而且有一个 ...

  8. java heap space 什么意思_java内存溢出之Java heap space

    作为一个java程序员,大家都应该认识JVM.JVM作为java的核心,实在太重要了.而内存溢出又是程序员常遇到的错误之一,如果你对JVM的原理足够了解,那么解决这样的问题就不在是一件困难的事情. 关 ...

  9. java 内存详解_Java内存详解

    一.了解java的内存大致划分 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中. 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态成员 常量池:存放 ...

  10. java内存模型 原子性_Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)...

    JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...

最新文章

  1. 由于应用universal link校验不通过_垃圾吊称重校验砝码2000kg市场行情分析
  2. sql两个时间计算时间差_Java 8时间类,越用越香
  3. Oracle 变量绑定与变量窥视合集系列一
  4. 物理借助传感器用计算机测速度,用打点计时器测速度教案_物理_教学设计_人教版...
  5. 科技英语翻译计算机化考试,2017年英语四级翻译范文之考公热
  6. 算法:数组中的逆序对
  7. activemq消息丢失_基于Redis实现消息队列的典型方案
  8. 优秀的弹窗插件 jquery.lightbox_me.js
  9. 怎样在IIS下配置PHP
  10. Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇
  11. stm32f103rbt6基本介绍
  12. 兰州大学本科毕业论文答辩PPT模板
  13. RedHat下载安装JDK的方法(方法二)
  14. 计算机二级ms office2021教材,全国计算机等级考试二级MS Office高级应用教材(2021年版)...
  15. java七牛获取访问路径_七牛回调及回调鉴权
  16. 维瓦尔第协奏曲《四季》赏析 (Antonio Vavildi 《The Four Seasons》)
  17. 计算机中的速率、带宽、时延、利用率解读
  18. 新版汇编语言程序设计【课后习题答案】
  19. Android 5.1双卡打电话发短信的实际应用
  20. 2022年亚太数学建模竞赛-问题C:全球变暖与否?-思路详解

热门文章

  1. dubbo如何正确关闭Spring容器
  2. MySQL用sql复制表数据到新表的方法
  3. Android-清空栈内的activity
  4. ruby koans:tdd方式学习ruby
  5. VScode加文件头的方式
  6. 初识面向对象(钻石继承,super,多态,封装,method,property,classmethod,staticmethod)...
  7. Python写一个服务
  8. Item 22: 当使用Pimpl机制时,在实现文件中给出特殊成员函数的实现
  9. 2015-02-10
  10. Oracle客户端精简绿色版 不安装oracle客户端 转载