
Java虚拟机
文章平均质量分 82
Java虚拟机
鹿与狼
这个作者很懒,什么都没留下…
展开
-
JVM系列(十九):类的加载器
类的加载器详解类加载器时JVM执行类加载机制的前提 ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载 ClassLoader通过各种方式将二进制数据流读入JVM内部,转为为一个java.lang.Class对象实例 ClassLoader在整个装载阶段中,只能影响到类的加载,链接和初始化由JVM负责。 代码是否能运行,由执行引擎决定1、概述1.1、相关面试题1.2、类的加载分类(不是加载器分类)显式加载vs隐式加载 (加载的原创 2021-01-30 15:40:00 · 404 阅读 · 0 评论 -
JVM系列(十八):类的加载过程
1、概述Java中数据类型分为基本数据类型和引用数据类型基本数据类型由JVM预先定义好 引用数据类型需要根据类(包含类、接口、枚举等)来进行加载从Class文件到内存中的类需要经过三大阶段: 加载-链接-初始化 分成五个小阶段:加载-验证-准备-解析-初始化 如果直到类被卸载,分为七个小阶段:加载-验证-准备-解析-初始化-使用-卸载使用过程2、过程一:加载阶段2.1、加载完成的操作加载的理解加载就是将Java类的字节码文件加载到机器内存中,并在内存中构建出Jav.原创 2021-01-30 15:15:31 · 245 阅读 · 0 评论 -
JVM系列(十七):字节码指令集
1、概述属于基本的执行指令 由操作码(1个字节)和操作数组成1.1、执行模型执行模型如下伪代码1.2、字节码和数据类型大多数指令都包含了操作所对应的数据类型信息,比如iload从局部变量表中加载int数据到操作数栈 各个数据类型简写有的指令看不出操作数类型,如arraylength指令,但是它只能操作数组类型对象 有的指令与操作数无关,如goto byte、char、short、boolean等类型,并没有指令去支持,编译在运行时,以四个字节为一个单位,所以会将以上数据类型原创 2021-01-30 14:58:31 · 907 阅读 · 0 评论 -
JVM系列(十六):Class文件结构
1、概述1.1、字节码文件跨平台性1.1.1、Java语言:跨平台的语言(一次编译到处运行)无须多次编译 由于Python、PHP等强大的解释器(天生就与平台无关),这个优势不再那么吸引人 跨平台已经几乎是是语言的必备选项1.1.2、Java虚拟机:跨语言的平台Java虚拟机和Java语言没有绑定,仅和“Class”文件有关联 任何语言,只要编译为正确的class文件,就可以在Java虚拟机上执行 所有JVM都要遵守Java虚拟机规范1.1.3、Java源码需要编译为符合JV原创 2021-01-30 14:21:50 · 352 阅读 · 1 评论 -
JVM系列(十五):垃圾回收器
1、GC分类与性能指标1.1、GC分类1.1.1按线程分类串行垃圾回收器:同一时间段内仅允许一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直到垃圾收集工作结束。默认应用于Client模式,在并发能力强的CPU上。 并行垃圾回收器:运用多个CPU同时执行垃圾回收,提升应用吞吐量,同样是STW制。1.1.2、按工作模式分类并发式垃圾回收器:与应用线程交替工作,减少应用程序STW 独占式垃圾回收器:一旦运行就启动STW,直到垃圾回收完毕1.1.3、按碎片处理方式分压缩式垃圾回原创 2021-01-29 17:51:43 · 303 阅读 · 0 评论 -
JVM系列(十四):垃圾回收相关概念
1、System.gc()1.1、System.gc()的理解默认情况下,调用System.gc()和Runtime.getRuntime.gc()会显式触发Full GC,同时对老年代和新生代进行回收(其实调用System.gc(),底层也是调用Runtime.getRuntime.gc()实现GC)System.gc()附带免责声明,即无法保证进行垃圾回收,只是通知垃圾回收器,具体做不做还得看回收器 一般来说不手动触发,直接用自动化GC。在特殊情况下,比如正在编写性能基准,可以在运行时调原创 2021-01-29 14:11:51 · 118 阅读 · 1 评论 -
JVM系列(十三):垃圾回收相关算法
1、标记阶段1.1、垃圾标记阶段堆中存放着对象实例,垃圾回收之前,首先要区分内存中哪些存活、哪些死亡,标记为死亡的才垃圾回收,释放内存。 如何标记死亡对象?当一个对象不再被任何存活的对象引用时,宣布死亡 有两种方式:引用计数算法和可达性分析算法1.2、引用计数算法1.2.1、介绍引用计数算法为每个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况 被引用,则计数器+1;引用失效,则-1 优点:实现简单、垃圾对象便于识别、判定效率高、回收没有延迟性(随时可以回收) 缺点:原创 2021-01-28 22:31:43 · 114 阅读 · 0 评论 -
JVM系列(十二):垃圾回收概述
1、垃圾1.1、关于垃圾收集的三个经典问题哪些内存要回收 什么时候回收 怎么回收1.2、垃圾指运行程序中没有任何指针指向的对象 如果不回收,那么会一直保留到应用程序结束1.3、为什么要GC如果不进行垃圾回收,那么内存会被消耗完 在进行GC的时候,JVM可以进行碎片整理,将所占用的堆内存移到堆的一端 没有GC,程序不能正常进行,有了GC又有STW,所以要不断对GC进行优化2、早期垃圾回收早期c/c++,垃圾要手动回收,使用new申请,delete手动释放 开发人员不便,如原创 2021-01-27 17:28:09 · 123 阅读 · 1 评论 -
JVM系列(十一):String Table
1、String1.1、基本特性String s = “hello”; String s = new String(“hello”) String类声明为final,不可继承 实现了Serializable接口,支持序列化;支持Comparable接口,可以比较大小 JDK8及以前内部定义final char[] value存储字符串,JDK9及以后使用byte[]。根据编码方式不一样,存储时加上编码标记,UTF-8的使用两个byte存储,为了保持一致,StringBuffer和StringB原创 2021-01-27 17:10:10 · 190 阅读 · 0 评论 -
JVM系列(十):执行引擎
1、执行引擎概述1.1、介绍执行引擎是Java虚拟机核心的组成部分之一 虚拟机相对于“物理机”,物理机的执行引擎建立在处理器、缓存、指令集和操作系统层面上;虚拟机的执行引擎由软件自行实现,因此能执行不被硬件直接支持的指令集 执行引擎的任务就是将字节码指令解释、编译为对应平台的机器指令1.2、执行引擎工作过程执行引擎在执行过程中执行的指令是什么完全依赖于PC寄存器 执行引擎执行完一条指令操作,PC寄存器马上更新下一条要执行的指令 方法在执行过程中,执行引擎可能会通过栈帧局部变量表原创 2021-01-25 15:34:27 · 379 阅读 · 0 评论 -
JVM系列(九):直接内存
1、概述不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域 直接内存时在Java堆外,直接向操作系统申请的内存区域 来源于NIO(New IO / Non-Blocking IO),通过堆中的DirecyByteBuffer实例操作Native内存(本地内存) 速度较快,快于Java堆,读写性能较高读写频繁可以考虑 Java允许Java程序使用直接内存,用于数据缓冲区也会导致OutOfMemoryError,大小不会受到-Xmx(堆)控制,但是系统内存有限,超过OS内存原创 2021-01-25 11:14:46 · 201 阅读 · 0 评论 -
JVM系列(八):对象的实例化内存布局和访问定位
1、对象的实例化1.1、创建对象的方式:(6种)New,最常见的方式变形1:单例模式,使用Xxx类的一个静态方法调用构造器 变形2:工厂模式,XxxBuilder/XxxFactory的静态方法Class的newInstance(),反射方式,只能调用无参构造器,且权限是public,jdk1.9以后不建议使用了 Constructor的newInstance(Xxx),反射方式,能调用有参、无参构造器,不限权限 使用clone(),不调用构造器,当前类需要实现Cloneable接口,原创 2021-01-25 10:37:26 · 189 阅读 · 0 评论 -
JVM系列(七):方法区(元空间)
1、栈、堆、方法区交互关系1.1、线程共享线程共享:堆、元空间 线程私有:栈(虚拟机栈、本地方法栈)、程序计数器1.2、各区域存储 类字节码存储在方法区(也就是存类啦),实例化对象存储在Java堆,对象引用存储在栈中。 2、理解方法区尽管方法区在逻辑上属于堆,但是方法区可以看做一块独立于Java堆的内存空间。 方法区与Java堆一样,属于线程共享区域 方法区在JVM启动时创建,和堆一样可以物理内存不连续 方法区大小和堆一样,可以固定或拓展 方法区大小决定保存..原创 2021-01-24 21:48:20 · 1884 阅读 · 0 评论 -
JVM系列(六):堆
1、概述一个JVM实例对应一个进程,一个实例中仅有一个方法区和一个堆,实例中的线程各有Java栈、程序计数器、本地方法栈,线程共享方法区和堆。1.1、相关概念一个JVM实例只存在一个堆内存,堆是Java内存管理的核心; Java堆在JVM启动时创建,大小确定,是最大一块内存(大小可以调节); 堆内存在物理上可以不连续,但是逻辑上连续; 所有线程共享Java堆,也可为每个线程划分私有缓冲区(Thread Local Allocation Buffer,TLAB); Java虚拟机规范描述原创 2021-01-23 22:18:23 · 218 阅读 · 0 评论 -
JVM系列(五):本地方法接口和本地方法栈
1、本地方法接口1.1、本地方法一个Native Method就是Java调用非Java代码的接口,使用native关键字修饰和abstract抽象方法不同,抽象方法是没有方法体,本地方法是有方法体,只不过不是Java语言实现。1.2、为什么使用本地方法与Java以外的环境进行交互,这是主要原因; 与OS交流,实现与底层系统的交互,有些方法直接用C语言; Sun的解释器由C语言实现,使得它能像普通的C语言一样与外部交互; 现在很少使用本地方法了,因为Java足够强大、完善了原创 2021-01-23 14:22:11 · 283 阅读 · 0 评论 -
JVM系列(四):虚拟机栈
1、概述及其定义1.1、概述Java的指令根据栈来设计,因为不同平台CPU架构不一样,所以不能设计为基于寄存器。 基于栈的优点:跨平台、指令集小、编译器容易实现; 基于栈的缺点:性能下降、实现同样功能需要更多指令(指令集小、功能单一) 栈:运行时的单位,程序如何执行、如何处理数据(方法); 堆:存储时的单位,解决数据的存储问题,数据放在哪里(对象)1.2、Java虚拟机栈早期称Java栈; 每个线程创建时都创建一个栈,内部保存的单位是栈帧,对应一次次方法调用; 生命周期与线程一原创 2021-01-23 11:45:16 · 179 阅读 · 0 评论 -
JVM系列(三):程序计数器(PC寄存器)
1、运行时数据区红色部分(方法区、堆),每个进程一份; 灰色部分(程序计数器、本地方法栈、虚拟机栈),每个线程一份,线程间共享堆、堆外内存2、程序计数器作用:通过改变这个计数器的值来选取下一条需要执行的字节码指令,可以把它看做当前线程正在执行的字节码的行号指示器。也就是说,程序计数器里面记录的是当前线程正在执行的那一条字节码执行的地址。如果当前线程正在执行的是一个本地方法,那么此时程序计数器为空. 空间小,速度最快的存储区域 线程私有(每个线程都有),生命周期与线程一致 任何时刻某一线原创 2021-01-23 09:56:37 · 393 阅读 · 2 评论 -
JVM系列(二):类加载子系统
1、类的加载过程与类加载器分为三个阶段,分别是加载、链接、初始化。1.1、加载Loading加载阶段,需要完成以下三件事通过类全名获取二进制字节流(class文件) 将字节流中的静态存储结构转化为方法区中的运行时数据结构 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区中该类的数据访问的入口加载.class文件的方式:本地系统、网络(web)、Zip压缩包(Jar,war格式)、运行时生成(动态代理技术)、其他文件生成(JSP)、专有数据库提取(少见)、加原创 2021-01-23 09:28:41 · 205 阅读 · 1 评论 -
JVM系列(一):JVM概述
1、JVM整体结构图2、JVM生命周期虚拟机启动:通过引导类加载器创建初始类来完成,初始类由虚拟机指定 虚拟机运行:实际上执行的是JAVA虚拟机进程 虚拟机退出:程序正常结束;程序异常终止;OS出现错误;线程调用System类的exit方法、Runtime的halt方法;3、JIT即时编译器和解释器不同,解释器是解释一行执行一行,JIT是将常用的代码解释(解释时要暂停运行)后存入缓存,JIT代码多了启动慢,且缓存不足。所以解释器响应时间快,JIT没有那么快响应,但是响应后执行快。4、原创 2021-01-22 16:02:48 · 263 阅读 · 0 评论