一.类加载器 ClassLoader 能根据需要将 class 文件加载到 JVM 中,它使用双亲委托模型,在加载类的时候会判断如果类未被自己加载过,就优先让父加载器加载.另外在使用 instanceof 关键字.equals()方法.isAssignableFrom()方法.isInstance()方法时,就要判断是不是由同一个类加载器加载. 1 类加载器的种类 1.1 启动类加载器(Bootstrap ClassLoader) 负责加载JDK中的核心类库,即 %JRE_HOME%/lib 目…
垃圾收集器与内存分配策略 前言:本文基于<深入java虚拟机>再加上个人的理解以及其他相关资料,对内容进行整理浓缩总结.本文中的图来自网络,感谢图的作者.如果有不正确的地方,欢迎指出. 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 回顾 上文介绍了jvm的内存区域以及介绍了内存的溢出情况. jvm区域分为5个,线程独有:虚拟机栈,本地方法栈,程序计数器.线程共享:方法区,堆 两种溢出:栈溢出(StackOverflowError),OutOfMemo…
Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap) 扩展类加载器(Extension) 系统类加载器(System) 2.用户自定义的类加载器: java.lang.ClassLoader的子类,用户可以定制类的加载方式. JVM自带的加载器 Java虚拟机自带了以下几种加载器. 1.根(Bootstrap)类加载器: 该加载器没有父加载器. 它…
JVM的艺术-对象创建与内存分配机制深度剖析 引言 本章将介绍jvm的对象创建与内存分配.彻底带你了解jvm的创建过程以及内存分配的原理和区域,以及包含的内容. 对象的创建 类加载的过程 固定的类加载执行顺序: 加载 验证 准备 初始化 卸载 的执行顺序是一定的 为什么解析过程没有在这个执行顺序中?(接下来分析) 什么时候触发类加载不一定,但是类的初始化如下四种情况就要求一定初始化. 但是初始化之前 就一定会执行 加载 验证 准备 三个阶段. 触发类加载的过程(由初始化过程引起的类加载) 1):…
对于二维数组和二维指针的内存的分配 这里首选说一下一维指针和一维数组的内存分配情况. 一维: 数组:形如int  a[5];这里定义了一个一维数组a,并且数组的元素个数是5,这里的a是这五个元素的整体表示,也就是通过a我们能找到这五个元素.注意:a是代表数组第一个元素的首地址.&a是代表数组的地址,虽然它们的值相同. 指针: int *p = NULL:这里p是一个指针,它指向的是计算 机内一块存储int类型的内存.P = a;就是让p等于刚才申请的数组的第一个元素的地址.所以通过p我们也能找到…
一.基本结构 类加载器:在 JVM 启动时或在类运行时需要将类的字节码信息加载到 JVM 内存区域中. 执行引擎:负责执行字节码信息中包含的字节码指令,相当于实际机器上的 CPU. 内存区域:也被称为运行时数据区.将内存划分为多个区域,模拟实际机器上的储存.记录和调度功能模块.因为执行引擎在执行一段程序时需要储存一些东西(如操作码需要的操作数,操作码的执行结果需要保存),而且类的字节码和对象等信息都需要在执行引擎执行前就准备好. 本地方法接口:主要是调用C或C++实现的本地方法及返回结果. 如图…
上一篇我们介绍了JVM的基本运行流程以及内存结构,对JVM有了初步的认识,这篇文章我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再把需求明确一点,一个java线程对一个变量的更新怎么通知到另外一个线程呢?我们知道java当中的实例对象.数组元素都放在java堆中,java堆是线程共享的.(我们这里把java堆称为主内存),而每一个线程都是自己私有…
类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字节流,完成这个动作的代码块就是类加载器.这一动作是放在Java虚拟机外部去实现的,以便让应用程序自己决定如何获取所需的类. 虚拟机规范并没有指明二进制字节流要从一个Class文件获取,或者说根本没有指明从哪里获取.怎样获取.这种开放使得Java在很多领域得到充分运用,例如: 从ZIP包中读取,这很常…
类加载过程概览 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括以下7个阶段: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始化(Initialization) 使用(Using) 卸载(Unloading) 其中前五个阶段即为类加载的全过程.在后面会进行详细的介绍.而验证.准备.解析3个部分统称为连接(Linking).这7个阶段的发生顺序如下图: 在上图中,加载.验证.准备.初始化和卸载这5个阶…
GC三问: 哪些内存需要回收? 什么时候回收? 如何回收? 程序计数器.虚拟机栈.本地方法栈随线程而生,随线程而灭,栈帧的内存分配在类结构确定下来就已知,在方法结束或者线程结束时就会回收.所以垃圾回收关注的是动态的堆内存. ps. 方法区也能被回收,主要回收废弃常量和无用类,但性价比高,不过多描述. 1.哪些内存需要回收 这个问题的关键就是确定哪些内存是存活着,哪些内存死去(不再会被用到的) 引用计数算法 有引用时就+1,引用失效就-1,计数器为0则可回收 无法回收相互引用的情况 引用分为强引用…