首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java虚拟机知识点简要梳理

上图是整个生命来梳理,包括类加载、验证、准备、解析、初始化、使用、卸载,将一一做简要介绍 一、加载 1.加载过程 a.通过类全限定名获取类二进制字节流,其中二进制字节流不一定是java语言编译...类加载四种,启动类加载器,是C/C++实现,无法在java代码调用,扩展类加载器、应用类加载器和自定义类加载器,双亲委派模型指的是当前类加载加载某个类时候,如果没有找到,首先调用父类加载器,...(2).每一层加载器都把类加载请求委派给父类加载器,直到所有的类加载请求都应该传递给顶层启动类加载器。...采用标记整理算法或标记清除算法,标记清除算法是把要回收对象进行标记,然后再把它清理掉,而标记压缩算法则是把所有存活对象向一端移动,然后清理掉边界以外空间。...七、卸载 虽然说有人把方法区称作为永久区,但实际上还是可能被回收掉,当某个类确定不再被使用时,可以方法区卸载 参考文档: 1.

57230

JVM面试题详解

如果对象在可达性分析没有与 GC Root 引用链,那么此时就 会被第一次标记并且进行一次筛选,筛选条件是是否必要执行 finalize() 方法。...,在这种情况下,即使在 contains 方法使用该对象的当前引用作为参数去 HashSet 集合检索对象,也将返回找不到对象结果,这也会导致无法HashSet 集合单独删除当前 对象,造成内存泄露...一次筛选,筛选条件是是否必要执行 finalize()方法。...java 内存模型java 内存模型(JMM)是线程间通信控制机制.JMM 定义了内存和线程之间抽象关系。...虚拟机把描述类数据 Class 文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用 java 类型。类加载器双亲委派模型机制?

40741
您找到你想要的搜索结果了吗?
是的
没有找到

JVM 看这一篇就够了

等等;还加载 classpath 路径所有类库 JDK8:启动类加载器:负责将/lib,或者 -Xbootclasspath 参数指定路径,且是虚拟机识别的类库加载到内存...,就不会报错 双亲委派模型 JVM ClassLoader 通常采用双亲委派模型,要求除了启动类加载器外,其余加载器都应该有自己父级加载器。...Class 对象生命周期就结束了,对应在方法区数据也会被卸载 JVM 自带加载器装载类,是不会卸载,由用户自定义加载加载类是可以卸载 内存分配 ?...看是否必要执行 finalize 方法 两个步骤走完后对象仍然没有人使用,那就属于垃圾 GC 类型 MinorGC / YoungGC:发生在新生代收集动作 MajorGC / OldGC:发生在老年代...在这里插入图片描述 所有变量(共享)都存储在内存,每个线程都有自己工作内存;工作内存中保存该线程使用到变量内存副本拷贝 线程对变量所有操作(读、写)都应该在工作内存完成 不同线程不能相互访问工作内存

47120

jvm gc 线程

方法) 引用对象 ​ 对象在进行可达性分析后发现没有与 GC Roots 相连接引用链,那他将会被第一次标记并且进行一次筛选,筛选条件是此对象是否必要执行 finalize() 方法。...没必要执行finalize()表示该对象没用了,可以标记准备回收 ​ 如果这个对象被判定为必要执行 finalize() 方法,那么这个对象竟会放置在一个叫做 F-Queue 队列,并在稍后由一个由虚拟机自动建立...文件格式验证 是否以魔数 0xCAFEBABE 开头 、次版本号是否在当前虚拟机处理范围之内 常量池常量是否不被支持常量类型(检查常量 tag 标志) 指向常量各种索引值是否指向不存在常量或不符合类型常量...CONSTANT_Utf8_info 型常量是否不符合 UTF8 编码数据 Class 文件各个部分集文件本身是否删除附加其他信息 元数据验证 这个类是否父类(除 java.lang.Object...双亲委派模型 Java 虚拟机角度讲,只存在两种类加载器:一种是启动类加载器(C++ 实现,是虚拟机一部分);另一种是其他所有加载器(Java 实现,独立于虚拟机外部且全继承自 java.lang.ClassLoader

86930

面试官:不懂JVM ,就要30K? 史上JVM最最最完整深入解析

3、 Java内存模型规定所有变量都存储在内存,每个线程还有自己工作内存。...(1) 线程工作内存中保存了被该线程使用到变量拷贝(内存拷贝过来),线程对变量所有操作都必须在工作内存执行,而不能直接访问内存变量。...当当前类加载器和所有父类加载器都无法加载该类时,抛出ClassNotFindException异常。 2、意义: 提高系统安全性。用户自定义加载器不可能加载应该由父加载加载可靠类。...(3)系统加载器(System)或者应用加载器(App): a、Java编写 b、父加载器是扩展类加载器 c、环境变量或者class.path中加载类 d、是用户自定义类加载默认父加载器 e、是ClassLoader...类卸载: 1、 JVM自带三种类加载器(根、扩展、系统)加载类始终不会卸载。因为JVM始终引用这些类加载器,这些类加载器使用引用他们所加载类,因此这些Class类对象始终是可到达

20520

JVM史上最最最完整深入解析

3、 Java内存模型规定所有变量都存储在内存,每个线程还有自己工作内存。...(1) 线程工作内存中保存了被该线程使用到变量拷贝(内存拷贝过来),线程对变量所有操作都必须在工作内存执行,而不能直接访问内存变量。...当当前类加载器和所有父类加载器都无法加载该类时,抛出ClassNotFindException异常。 2、意义: 提高系统安全性。用户自定义加载器不可能加载应该由父加载加载可靠类。...(3)系统加载器(System)或者应用加载器(App): a、Java编写 b、父加载器是扩展类加载器 c、环境变量或者class.path中加载类 d、是用户自定义类加载默认父加载器 e、是ClassLoader...类卸载: 1、 JVM自带三种类加载器(根、扩展、系统)加载类始终不会卸载。因为JVM始终引用这些类加载器,这些类加载器使用引用他们所加载类,因此这些Class类对象始终是可到达

32620

JVM常见面试题

根据Java堆是否规整两种内存分配方式:(Java堆是否规整由所采用垃圾收集器是否带有压缩整理功能决定)。...询数据,提升速度;当内存不足时,自动删除这部分缓存数据,真实来源查询这些数据。...这使得我们不用去关心到底是叫 Major GC 还是 Full GC,大家应该关注当前 GC 是否停止了所有应用程序线程,还是能够并发处理而不用停掉应用程序线程。 0x08....(2)扩展类加载器(ExtensionClassLoader) 这个加载器负责加载JAVA_HOME/lib/ext目录或者被java.ext.dirs系统变量所指定路径所有类库,开发者可以直接使用扩展类加载器...,每一个层次加载器都是如此,因此所有加载请求最终都应该传递到顶层启动类加载, 只有当父类加载器反馈自己无法完成这个请求(它搜索范围没有找到所需类)时,子加载器才会尝试自己去加载

57820

重读 JVM

GC Roots 相连接引用链,那他将会被第一次标记并且进行一次筛选,筛选条件是此对象是否必要执行 finalize() 方法。...内存 把一个变量内存传输到线程工作内存,以便 load 操作使用 load 工作内存 把 read 操作内存得到变量值放入工作内存 use 工作内存 把工作内存中一个变量值传递给执行引擎...文件格式验证 是否以魔数 0xCAFEBABE 开头 、次版本号是否在当前虚拟机处理范围之内 常量池常量是否不被支持常量类型(检查常量 tag 标志) 指向常量各种索引值是否指向不存在常量或不符合类型常量...CONSTANT_Utf8_info 型常量是否不符合 UTF8 编码数据 Class 文件各个部分集文件本身是否删除附加其他信息 …… 只有通过这个阶段验证后,字节流才会进入内存方法区进行存储...6.3.1 双亲委派模型 Java 虚拟机角度讲,只存在两种类加载器:一种是启动类加载器(C++ 实现,是虚拟机一部分);另一种是其他所有加载器(Java 实现,独立于虚拟机外部且全继承自 java.lang.ClassLoader

93850

【Java面试宝典】深入理解JAVA虚拟机

5.1 类加载时机   类被加载到虚拟机内存开始,到卸载为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段   加载、验证、准备、初始化和卸载这5个阶段顺序是确定,类加载过程必须按照这种顺序按部就班地开始...这一阶段可能包括:   1) 是否以魔数oxCAFEBABE开头; 2) 、次版本号是否在当前虚拟机处理范围之内; 3) 常量池常量是否不被支持常量类型(检查常量tag标志); 4) 指向常量各种索引值是否指向不存在常量或不符合类型常量...; 5) CONSTANT_Itf8_info 型常量是否不符合UTF8编码数据; 6) Class文件各个部分及文件本身是否删除或附加其他信息;   这个阶段验证时基于二进制字节流进行...5.3.2 双亲委派模型工作过程是   如果一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次加载器都是如此,因此所有加载请求最终都是应该传送到顶层启动类加载...Java内存模型规定了所有的变量都存储在内存,每条线程还有自己工作内存(可以与前面将处理器高速缓存类比),线程工作内存中保存了该线程使用到变量到内存副本拷贝,线程对变量所有操作(读取

59310

Java虚拟机(JVM)你只要看这一篇就够了!

GC Roots 相连接引用链,那他将会被第一次标记并且进行一次筛选,筛选条件是此对象是否必要执行 finalize() 方法。...read 内存 把一个变量内存传输到线程工作内存,以便 load 操作使用 load 工作内存 把 read 操作内存得到变量值放入工作内存 use 工作内存 把工作内存中一个变量值传递给执行引擎...文件格式验证 是否以魔数 0xCAFEBABE 开头 、次版本号是否在当前虚拟机处理范围之内 常量池常量是否不被支持常量类型(检查常量 tag 标志) 指向常量各种索引值是否指向不存在常量或不符合类型常量...CONSTANT_Utf8_info 型常量是否不符合 UTF8 编码数据 Class 文件各个部分集文件本身是否删除附加其他信息 …… 只有通过这个阶段验证后,字节流才会进入内存方法区进行存储...6.3.1 双亲委派模型 Java 虚拟机角度讲,只存在两种类加载器:一种是启动类加载器(C++ 实现,是虚拟机一部分);另一种是其他所有加载器(Java 实现,独立于虚拟机外部且全继承自

39310

精选Java虚拟机面试题(附刷题小程序)

请简单描述 内存泄漏是指不再被使用对象或者变量一直被占据在内存。理论上来说,Java是GC垃圾回收机制,也就是说,不再被使用对象,会被GC自动回收掉,自动内存清除。...,筛选条件是是否必要执行 finalize()方法。...类加载到虚拟机内存开始,到卸载出内存为止,整个生命周期包括:加载,验证,准备,解析,初始化,使用和卸载 加载 加载是类加载过程一个阶段,在加载阶段虚拟机需要完成三件事 通过一个类全限定名来获取定义此类辅而进之字节流...Java所有类,都需要由类加载器装载到JVM才能运行。类加载器本身也是一个类,而它工作就是把class文件硬盘读取到内存。...双亲委派模型:如果一个类加载器收到了类加载请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,每一层加载器都是如此,这样所有加载请求都会被传送到顶层启动类加载,只有当父加载无法完成加载请求

29710

Java程序员必备基础结构图

是否移动存活对象都存在优缺点,移动虽然内存回收复杂,但是程序吞吐量来看,更划算;不移动时内存分配更复杂,但是垃圾收集停顿时间会更短,所以看收集器取舍问题~ Parallel Scavenge收集器是基于标记...一个类加载到虚拟机内存开始,到卸载出内存为止,这个生命周期经历了七个阶段:加载、验证、准备、解析、初始化、使用、卸载加载阶段: 通过一个类全限定名来获取定义此类二进制字节流。...初始化 到了初始化阶段,才真正开始执行类定义Java字节码。 15.类加载器双亲委派模型图 ?...Java内存模型规定了所有的变量都存储在内存 每条线程还有自己工作内存 线程工作内存中保存了该线程是用到变量内存副本拷贝 线程对变量所有操作都必须在工作内存中进行,而不能直接读写内存...u1、u2、u4、u8 分别代表1个字节、2个字节、4个字节和8个字节无符号数 表是由多个无符号数或者其他表作为数据项构成复合数据类型 每个Class文件头四个字节被称为魔数(记得以前校招面试,面试官问过什么叫魔数

52021

渐进式Web应用清单(翻译转载)

首次加载流畅,即使是在3G下 测试 在Nexus 5(或者类似的机器)上使用Lighthouse验证在模拟3G网络下,首次访问时可交互时间是否小于10S。 修复 许多提升性能方法。...测试 在很慢模拟网络下打开app。每次你在app触碰一个链接或者按钮,页面应该立即响应,可以使用以下方案: 立即过渡到下一屏,同时在等待网络内容时展示一个占位加载。...用户体验 页面加载时内容不闪 测试 在PWA里面加载不同页面,确保页面加载时内容或界面不会“跳动” 修复 确保所有内容,特别是图片和广告,在CSS或者元素属性里固定尺寸。...在图片加载前,你可以展示一个灰色方块或者模糊/小版本(如果可能的话)来作为占位符。 详情页回退到之前列表页面时,列表页保持滚动距离 测试 在应用找一个列表区域。向下滚动。触碰项目进入详情页。...应用安装提示不要被过度使用 测试 检查加载完成时PWA没有使用应用安装广告 修复 应该只有一个顶部或者底部应用安装横幅 在PWA被添加到用户屏后,任何顶部/底部横幅都应该被移除 拦截添加到屏提示

1.6K20

JVM性能优化专题

加载器通常采用双亲委派模型,首先请求父类加载加载,如果父类加载器无法加载则自己加载。3. 链接阶段,将类二进制数据合并到JVM运行状态之中过程。包含验证、准备和解析三个步骤。...但是如果一个类所有实例都被回收,对应Class对象可能被卸载。这个加载过程可以保证Class文件被正确加载到JVM,并且在加载过程必要校验和转换,为后续使用阶段做好准备工作。...整个加载过程遵循双亲委派模型,先让父类加载器试图加载,父类加载器无法加载时子加载器才会尝试加载。每个加载Class在JVM中都有一个对应Class对象,存储了类结构信息,方法,变量等数据。...通常使用引用计数或者可达性分析等算法来判断对象是否可访问。如果一个对象可以GC Roots节点可达,那么它就是可访问。4. 常见GC算法标记清除、标记压缩、分代收集等。...(或者GC对象判定方法)在Java,对象是否存活主要通过可达性分析来判断。可达性分析基本思想是:如果一个对象可以被GC Roots直接或间接引用到,则该对象是存活

35220

深入理解java虚拟机

前言 JVM内存模型,JAVA内存模型,JAVA对象模型,这些名字相似的模型分别是什么? 常用垃圾收集方法哪些?垃圾收集器哪些?各自有什么特点? JVM如何监控?调优?...类加载机制 1.1 概述 类加载到内存开始,到卸载出内存为止,整个生命周期包括 加载 验证 准备 解析 初始化 使用 卸载 ?...这里变量指会被共享实例字段,类字段。不包括不被共享局部变量 规定:所有变量都存储在主存,每个线程都有自己工作内存,工作内存保存了内存变量副本。...2.2 主存与工作内存交互协议 协议包括原子操作: 一个变量如何主存拷贝到工作内存,如何工作内存同步回主存,java内存模型定义了8操作来完成,每种操作都是原子性: lock:作用与内存变量...更大范围原子性可通过synchronized和lock来保证 可见性:java内存模型通过在变量修改后将新值同步回内存,读取变量前内存刷新新值这种通过内存传递方式实现可见性。

57751

2021-Java后端工程师面试指南-(JVM)

使用:就是我们正常使用了 卸载卸载类即该类Class对象被GC。卸载类需要满足3个要求: 该类所有的实例对象都已被GC,也就是说堆不存在该类实例对象。...系统 ClassLoder 在协同工作时候会默认使用 双亲委派模型 。即在类加载时候,系统会首先判断当前类是否加载过。已经被加载类会直接返回,否则才会尝试加载。...加载时候,首先会把该请求委派该父类加载 loadClass() 处理,因此所有的请求最终都应该传送到顶层启动类加载器 BootstrapClassLoader 。...(或者GC对象判定方法) 虚拟机栈栈帧引用变量 本地方法栈引用变量 方法区类静态属性引用对象 方法区中常量引用对象 你知道Java垃圾收集方法哪些吗 标记-清除算法:该算法分为“标记...空间整合:与 CMS 标记--清理”算法不同,G1 整体来看是基于“标记整理”算法实现收集器;局部上来看是基于“复制”算法实现

26330

一线互联网大厂面试必问JVM应该怎么学(面试题含答案)

(或者GC对象判定方法) 判断一个对象是否存活两种方法: 引用计数法 所谓引用计数法就是给每一个对象设置一个引用计数器,每当一个地方引用这个对象时,就将计数器加一,引用失效时,计数器就减一。...在java可以作为GC Roots对象以下几种: 虚拟机栈引用对象 方法区类静态属性引用对象 方法区常量池引用对象 本地方法栈JNI引用对象 虽然这些算法可以判定一个对象是否能被回收,但是当满足上述条件时...,筛选条件是是否必要执行finalize()方法。...当对象没有覆盖finalize()方法或者已被虚拟机调用过,那么就认为是没必要。...如果该对象必要执行finalize()方法,那么这个对象将会放在一个称为F-Queue对队列,虚拟机会触发一个Finalize()线程去执行,此线程是低优先级,并且虚拟机不会承诺一直等待它运行完

41850

这些不可不知JVM知识,都用思维导图整理好了

虚引用也称为“幽灵引用”或者“幻影引用”,它是最弱一种引用关系。一个对象是否虚引用 存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。...,统一回收掉所有标记对象,也可以反过来,标记存活对象,统一回 收所有未被标记对象。...5.1、类加载过程 一个类型加载到虚拟机内存开始,到卸载出内存为止,它整个生命周期将会经历加载 (Loading)、验证(Verification)、准备(Preparation)、解析(Resolution...它负责加载\lib\ext目录或者被java.ext.dirs系统变量所指定路径中所有的类库。...双亲委派模型: 如果一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次加载器都是如此,因此所有加载请求最终都应该传送到最顶层启动类加载

54130
领券