java内存加载机制
什么是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 class加载机制及对象生成机制
java class加载机制及对象生成机制 当使用到某个类,但该类还未初始化,未加载到内存中时会经历类加载.链接.初始化三个步骤完成类的初始化.需要注意的是类的初始化和链接的顺序有可能是互换的. Cl ...
- Java ClassLoader加载机制理解 实际例子
针对 Java ClassLoader加载机制理解, 做了个如何自定制简单的ClassLoader,并成功加载指定的类. 不废话,直接上代码. package com.chq.study.cl; im ...
- Java ClassLoader加载机制理解
今天看到了一篇介绍Java ClassLoader加载机器的文章, 才发觉一直来自己的肤浅, 好好地给补了一课, 不得不存档! 原文地址: http://www.blogjava.net/lhulcn ...
- java动态加载机制
假设有一个class,ClassLoader首先把它load到内存里的code segment(内存里存放代码段的),站在ClassLoader的角度,内存里的一个一个的class就是一个一个的对象, ...
- Java ClassLoader加载机制
一.体系结构(自上向下) 1.Bootstrap ClassLoader(BootStrapClassLoader) --- 启动类加载器或者叫引导类加载器,加载jdk核心的APIs,这些APIs一般 ...
- 很考验人的java内存加载面试题
源代码如下,求结果 public class MemoryAnalyse { public static int k = 0; public static MemoryAnalyse t1 = new ...
- 看起来很懵的java内存加载面试题
源代码如下,求结果 public class MemoryAnalyse { public static int k = 0; public static MemoryAnalyse t1 = new ...
- jvm系列(一):java类的加载机制
java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...
- Java高级之虚拟机加载机制
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 1.0版本:2016-05-21 SubClass!! 执行结果说明一个问题:子类调用父类变量的时候 ...
随机推荐
- 20155301 2016-2017-2 《Java程序设计》第10周学习总结
20155301 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 计算机网络: 1.在计算机网络中,现在命名IP地址的规定是IPv4协议,该协议规定每个IP ...
- 20155320 《Java程序设计》实验三 敏捷开发与XP实践
20155320 <Java程序设计>实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 (一)研究一下Code菜单 具体内容: 在IDEA中使用工具(Code-> ...
- # 2017-2018-1 20155337《信息安全系统设计基础》第5周学习总结+mybash
2017-2018-1 20155337<信息安全系统设计基础>第5周学习总结 教材学习内容总结 不论我们是在用C语言还是用JAVA或是其他的语言编程时,我们会被屏蔽了程序的机器级的实现. ...
- java开发工具使用
一.MyEclipse软件的使用 1)ctrl+n新建文件 2)ctrl+d删除一行 3)alt+/提示补齐 (main/syso/syse/for遍历最近的数组) 4)ctrl+shift+f格式化 ...
- asp.net core webapi项目配置全局路由
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在开发项目的过程中,我新创建了一个controller,发现vs会给我们直接在controller头添加前缀,比如[Ro ...
- Python爬虫与反爬虫(7)
[Python基础知识]Python爬虫与反爬虫(7) 很久没有补爬虫了,相信在白蚁二周年庆的活动大厅比赛中遇到了关于反爬虫的问题吧 这节我会做个基本分享. 从功能上来讲,爬虫一般分为数据采集,处理, ...
- 180730-Spring之RequestBody的使用姿势小结
Spring之RequestBody的使用姿势小结 SpringMVC中处理请求参数有好几种不同的方式,如我们常见的下面几种 根据 HttpServletRequest 对象获取 根据 @PathVa ...
- centos7 python2.7.5 升级python3.6.4
(转)Linux Centos7 升级python2至python3 - 依然范儿特西的文章 - 知乎 https://zhuanlan.zhihu.com/p/33660059 1 查看python ...
- hadoop 基础入门
启动: 格式化节点:bin/hdfs namenode -format 全部启动:sbin/start-dfs:datanode.namenode sbi ...
- 【Python 开发】Python目录
目录: [Python开发]第一篇:计算机基础 [Python 开发]第二篇 :Python安装 [Python 开发]第三篇:python 实用小工具