我所知道系列:JVM
文章平均质量分 91
记录JVM的学习与笔记
余飘飘
讲粤语,讲文明,好好学习,好好生活
展开
-
我所知道JVM虚拟机之类的加载器五(沙箱与自定义加载器)
前言本篇文章介绍一些什么是沙箱机制和自定义加载器有什么好处和怎么操作沙箱安全机制沙箱安全机制主要有以下特征保证程序安全保护Java原生的JDK代码Java安全模型的核心就是Java沙箱(sandbox)什么是沙箱?沙箱是一个限制程序运行的环境沙箱机制就是将]ava代码限定在虚拟机(JVN)特定的运行范围中,并且严格限制代码对本地系统资源访问通过这样的措施来保证对代码的有限隔离,防止对本地系统造成破坏。沙箱主要限制系统资源访问,那系统资源包括什么?CPU、内存、文件系统、网络不同级别原创 2021-05-28 11:10:20 · 194 阅读 · 4 评论 -
我所知道JVM虚拟机之类的加载器四(双亲委派)
前言本篇文章我们讲解双亲委派模型,以及面试中问到的是否准守,怎么破坏呢?定义和本质类加载器用来把类加载到Java虚拟机中。从JDK1.2版本开始,类的加载过程采用双亲委派机制,这种机制能更好地保证Java平台的安全如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就成功返回。只有父类加载器无法完成此加载任务时,才自己去加载。由此可见我们的顺序是引导类加载器先加载,若加载不到,由扩展类加载器加载原创 2021-05-28 09:54:44 · 171 阅读 · 5 评论 -
我所知道JVM虚拟机之类的加载器三(ClassLoader)
前言前几篇文章讲解类的加载器分类,本篇文章我们就要测试不同的类加载器、以及分析源码测试不同的类加载器每个Class对象都会包含一个定义它的ClassLoader的一个引用获取ClassLoader有以下几种途径方法,如下:获取当前类的ClassLoader:clazz.getClassLoader()获取当前线程上下文的ClassLoader:Thread.currentThread().getContextClassLoader()获取系统的ClassLoader:ClassLoader.g原创 2021-05-26 16:01:49 · 133 阅读 · 2 评论 -
我所知道JVM虚拟机之类的加载器二(类的加载器分类)
前言本篇文章复习加载器,回顾回顾类的加载器分类JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoade)自定义类加载器(User-Defined classLoader)从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。无论类加载器的类型如何划分,在程序中我们最常见的类加载器结构主要是如下情况:除了顶层的启动类加载原创 2021-05-22 14:24:39 · 111 阅读 · 2 评论 -
我所知道JVM虚拟机之类的加载器一(概述)
前言前几篇文章讲解的类的生命周期,主要讲解加载、链接、初始化、卸载阶段对于加载阶段主要做的事情是:用类加载器将类二进制流的数据(5种方式)读到方法区,形成类模板数据(Java类模型),同时创建Java.lang.Class类的实例我们这里示例Order类,请看如下图所示那么在加载阶段使用到了类的加载器,其后的链接、初始化、卸载阶段是没有关系的接下来我们就对类加载器进行一个简单的概述类加载器的概述我们说类加载器是JVM执行类加载机制的前提,并且说所有的Class都是使用ClassLoader进原创 2021-05-21 11:22:07 · 101 阅读 · 0 评论 -
我所知道JVM虚拟机之类的生命周期四(unloading 卸载阶段)
前言前边几篇文章讲解了类的生命周期之加载,链接,初始化阶段,接下来我们要说说的是卸载阶段那么想要讲解卸载阶段,那么就要搞懂类、类加载器、类的实例之间的引用关系比如说此时有一个示例Sample类此时我们当Sample类被加载、链接和初始化后,它的生命周期就开始了。当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,Sample类在方法区内的数据也会被卸载,从而结束Sample类的生命周期注意:一个类何时结束生命周期,取决于代表它的Class对象何时结束生命原创 2021-05-20 10:40:41 · 242 阅读 · 0 评论 -
我所知道JVM虚拟机之类的生命周期三(lnitialization 初始化阶段)
前言从本篇开始我们进入到初始化阶段,这是类加载器的最后一个阶段,如果前面步骤都没有问题, 那么类就可以顺利的装在到系统到中。具体描述初始化阶段,简言之,为类的静态变量赋予正确的初始值,到了初始化阶段,才真正开始执行类中定义的Java程序代码初始化阶段的重要工作是执行类的初始化方法:<clinit>()方法该方法仅能由Java编译器生成并由JVM调用,程序开发者无法自定义一个同名的方法更无法直接在Java程序中调用该方法,虽然该方法也是由字节码指令所组成它是由类静态成员的赋值语句原创 2021-05-19 10:44:42 · 150 阅读 · 0 评论 -
我所知道JVM虚拟机之类的生命周期二(Linking链接阶段)
前言前篇文章讲解了过程一加载阶段,接下来我们仅接着讲解第二阶段是怎么样的?环节一:验证阶段(Verification)当类加载到系统后,就开始链接操作,验证是链接操作的第一步它的目的是保证加载的字节码是合法、合理并符合规范的验证的步骤比较复杂,实际要验证的项目也很繁多,大体上Java虚拟机需要做以下检查,如图所示整体说明:验证的内容则涵盖了类数据信息的格式验证、语义检查、字节码验证、符号引用验证等其中格式检查会和加载阶段一起执行验证通过之后,类加载器才会成功将类的二进制数据信息加载到原创 2021-05-10 17:36:24 · 260 阅读 · 0 评论 -
我所知道JVM虚拟机之类的生命周期一(LoadKing加载阶段)
前言前篇文章内容我们讲解了有关于虚拟机的布局结构、垃圾回收器、以及字节码分析等等那么从本篇开始我们就要仔细讲讲类加载器,对于程序来说不一定是一个类,有可能还是接口,枚举类或者注解等等。这些都属于Java中的结构,我们都需要加载进来,加载过程称为类加载器接下来我们就针对于类加载过程,以及更加详细的过程是怎么样的?类的生命周期概述在Java中数据类型分为:基本数据类型和引用数据类型基本数据类型:虚揶机预先定义引用数据类型:则需要进行类的加载类的加载包括指:类、接口、注解、枚举类等等都可以称为原创 2021-05-04 16:51:43 · 207 阅读 · 1 评论 -
我所知道JVM虚拟机之字节码指令集与解析九(同步控制指令)
同步控制指令java虚拟机支持两种同步结构:方法级的同步方法内部一段指令序列的同步这两种同步都是使用monitor指令来支持的方法级的同步方法级的同步:是隐式的,即无须通过字节码指令来控制,它实现在方法调用和返回操作之中虚拟机可以从方法常量池的方法表结构中的 ACC_SYNCHRONIZED 访问标志得知一个方法是否声明为同步方法当调用万法时调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否设置若设置了访问标志执行线程将先持有同步锁,然后执行方法。最后在方法完成(无论是原创 2021-05-02 16:27:53 · 159 阅读 · 0 评论 -
我所知道JVM虚拟机之字节码指令集与解析五(方法调用指令与方法返回指令)
一、方法调用指令说明简要介绍方法调用指令:invokevirtual、invokeinterface、invokespecial、invokestatic、invokedynamic简要方法调用介绍invokevirtual指令用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),支持多态。这也是Java语言中最常见的方法分派方式。invokeinterface指令用于调用接口方法,它会在运行时搜索由特定对象所实现的这个接口方法,并找出适合的方法进行调用。invokespeci原创 2021-05-01 12:15:01 · 157 阅读 · 1 评论 -
我所知道JVM虚拟机之字节码指令集与解析三(类型转换指令)
前言本篇文章继续学习字节码指令集中的类型转换指令,看看具体指令是怎么操作数据类型转换?一、类型转换指令的概述类型转换指令可以将两种不同的数值类型进行相互转换这些转换操作一般用于实现用户代码中的显式类型转换操作,或者用来处理字节码指令集中数据类型相关指令无法与数据类型一一对应的问题。主要有以下两种类型转换:宽化类型转换与窄化类型转换二、类型转换指令的宽化类型转换Java虚拟机直接支持以下数值的宽化类型转换(widening numeric conversion,小范围类型向大范围类型的安全转原创 2021-05-01 12:07:35 · 155 阅读 · 0 评论 -
我所知道JVM虚拟机之字节码指令集与解析二(算数指令)
文章目录前言一、算数指令概述作用分类byte、short、char和booleanl类型说明运算时的溢出运算模式向最接近数舍入模式:向零舍入模式:NaN值使用二、算数指令的所有运算指令指令介绍三、算数指令的比较指令比较指令的说明举例比较参考文献前言前篇文章讲解了局部变量压栈指令、常量入栈指令以及出栈装入局部变量表指令,那么本篇文章接着讲解算数指令,让我们开始吧一、算数指令概述作用================================算术指令用于对两个操作数栈上的值进行某种特定运算,并原创 2021-05-01 12:00:01 · 180 阅读 · 3 评论 -
我所知道JVM虚拟机之字节码指令集与解析一(局部变量压栈、常量变量压栈、出栈局部变量表指令)
文章目录前言一、指令概述执行模型字节码与数据类型指令的分类二、加载与存储指令概述作用常见指令三、加载与存储指令的再谈操作数栈与局部变量表操作数栈(Operand Stacks)局部变量表(Local Variables)四、加载与存储指令的局部变量入栈指令五、、加载与存储指令的常量入栈指令const系列push系列指令ldc系列六、加载与存储指令的出栈指令参考资料前言前面我们讲解了Class文件的结构、以及采用不同的方式来解读Class文件第一种是采用字节码一行一行的解读、第二种是采用javap的原创 2021-05-01 11:57:26 · 258 阅读 · 0 评论 -
我所知道JVM虚拟机之Class文件结构三(JAVAP指令)
往期文章JVM——(1)为什么学习虚拟机JVM——(2)聊聊JVM虚拟机JVM——(3)类加载子系统JVM——(4)运行时数据区的概述与程序计数器(PC寄存器)JVM——(5)运行时数据区的虚拟机栈JVM——(6)运行时数据区的本地方法栈JVM——(7)运行时数据区的堆空间JVM——(8)运行时数据区的方法区JVM——(9)对象的实例化与访问定位JVM——(10)执行引擎JVM——(11)String Table(字符串常量池)JVM——(12)垃圾回收概述JVM——(13)垃圾回原创 2021-05-01 11:38:51 · 124 阅读 · 0 评论 -
我所知道JVM虚拟机之字节码指令集与解析八(异常处理指令)
一、异常处理的抛出异常指令概述:athrow指令在ava程序中显示抛出异常的操作(throw语句)都是由athrow指令来实现除了使用throw语句显示抛出异常情况之外,JVN规范还规定了许多运行时异常会在其他Java虚拟机指令检测到异常状况时自动抛出。例如在之前介绍的整数运算时,当除数为零时虚拟机会在 idiv或ldiv指令中抛出ArithmeticException异常注意如下:正常情况下,操作数栈的压入弹出都是一条条指令完成的。唯一的例外情况是在抛异常时,Java虚拟机会清除操作数栈上的原创 2021-05-01 11:01:46 · 123 阅读 · 1 评论 -
我所知道JVM虚拟机之字节码指令集与解析四(对象创建与访问指令)
一、对象创建与访问指令的概述Java是面向对象的程序设计语言,虚拟机平台从字节码层面就对面向对象做了深层次的支持。有一系列指令专门用于对象操作,可进一步细分为创建指令、字段访问批令、数组操作指令、类型检查指令二、创建指令虽然类实例和数组都是对象,但ava虚拟机对类实例和数组的创建与操作使用了不同的字节码指令:创建类实例的指令:创建类实例的指令: new它接收一个操作数为指向Q量池的索引,表示要创建...原创 2021-04-23 00:00:00 · 128 阅读 · 1 评论 -
我所知道JVM虚拟机之字节码指令集与解析六(操作数栈管理指令)
一、操作数栈管理指令的概述如同操作普通数据结构中的堆栈那样,JVM提供的操作数栈管理指令可以直接用于操作操作数栈常见指令包括如下内容:将一个或两个元素从栈顶弹出,并且直接废弃,采用:pop、pop2指令将复制栈顶的一个或两个数值,并将复制值或双份的复制值重新压入栈顶,采用dup、dup2、dup_x1、dup2_x1、dup_x2、dup2_x2指令将栈最顶端的两个Slot数值位置交换,采用:sw...原创 2021-04-27 00:00:00 · 308 阅读 · 1 评论 -
我所知道JVM虚拟机之Class文件结构二(解读字节码)
解读字节码之旅接下来我们采用一个示例代码,编译成字节码文件进行解读解读public class Demo{private int num = 1;public int add(){num = num + 2;return num;}}我们将当前Demo类编译成字节码文件,并且使用notepad++和对应的插件打开翻译翻译,如下图image.png接下来我们把这些信息复制粘贴到一个text文档中,并在空格上进行,切割转为csv的格式image.pngimage.png由于一些csv原创 2021-04-29 22:35:19 · 199 阅读 · 0 评论 -
我所知道JVM虚拟机之Class文件结构一(描述介绍)
前言前面众多文章有关讲解的都是些JVM的内存与垃圾回收器相关信息,那么对于本篇开始我们将把目光转移到Class文件与加载器身上去,去看看字节码文件里到底有些什么信息?是怎么加载到我们内存里?一、Class文件的概述字节码文件的跨平台性================================Java 语言:跨平台性(write one run anywhere)当Java源代码成功编译成字节...原创 2021-04-13 00:00:00 · 188 阅读 · 0 评论 -
我所知道JVM虚拟机之执行引擎
前言从本篇开始我们就要进入执行引擎的学习一、执行引擎概述我们说执行引擎是Java虚拟机核心的组成部分之一其实“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式JVM的主...原创 2021-03-15 00:00:00 · 141 阅读 · 0 评论 -
我所知道JVM虚拟机之垃圾回收相关算法
前言上篇我们讲的是垃圾回收的概述,那么从本篇开始我们说的是垃圾回收的相关算法这些算法我们并不会手动的实现,但我们需要知道原理是什么,背景是什么,应用场景有什么我们没有必要底层去实现,并且本身算法也是很复杂要考虑的细节有很多我们一提到垃圾回收的算法GC,那么其实翻译成两个词:垃圾回收器、垃圾回收那么我们提到GC就是要垃圾回收,那我们需要知道哪些是垃圾结构(对象),将它清理那么怎么找到这些垃圾呢?找到...原创 2021-03-22 00:00:00 · 115 阅读 · 0 评论 -
我所知道JVM虚拟机之运行时数据区的虚拟机栈
前言上篇文章介绍了运行时数据区的概述、以及PC寄存器,这篇文章介绍的是虚拟机栈一、虚拟机栈的概述虚拟机栈出现的背景================================我们知道Java虚拟机是基于栈的一种设计架构,优点是跨平台指令集小编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令因为跨平台性所以不能设计为基于寄存器的(设计成基于寄存器的,耦合度高,性能会有所提升,因为可以对...原创 2021-03-08 00:00:00 · 120 阅读 · 0 评论 -
我所知道JVM虚拟机之对象的实例化与访问定位
前言本篇补充的对象的实例化的创建方式、创建步骤等等详细说明暂且可以看看一些大厂面试前的引入面试题 美团:对象在JVM中是怎么存储的?对象头信息里面有哪些东西?蚂蚁金服:二面:java对象头里有什么一、对象的实例化接下来我们就从对象的创建方式开始说起,常见的创建方式、步骤到底有哪些并且是个什么东西我们对创建对象的方式这几种进行描述讲解一下:new:最常见的方式单例类中调用getInstance的静态...原创 2021-03-14 00:00:00 · 105 阅读 · 0 评论 -
我所知道JVM虚拟机之Spring Table(字符串常量池)
前言我们在实际开发当中使用String非常的广泛,那么对使用String类其实有很多角度可以去学习理解那么本篇文章,我们从使用String的层次到开始了解分析String的实现、性能等等一、String的基本特性对于String我们称为字符串,使用一对 “” 引号起来表示那么平常我们的使用有不同的定义方式如下:String s1 = "xiaomingtongxue" ; 称呼为字面量的定义方式...原创 2021-03-17 00:00:00 · 320 阅读 · 0 评论 -
我所知道JVM虚拟机之垃圾回收相关概念的概述
前言从本篇开始我们正式讲解垃圾回收的相关知识了,让我们开始吧一、System.Gc的理解在默认情况下通过System.gc()者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(不能确保立即生效)简单的意思说提醒JVM进行垃圾回收...原创 2021-03-26 00:00:00 · 121 阅读 · 0 评论 -
我所知道JVM虚拟机之运行时数据区的堆空间
前言从本篇开始我们就要进入运行时数据区的堆空间学习一、堆的核心描述《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上。(The heap is the run-time data area from which memory for all class instances and arrays is allocated)从实际使用角度看:“几乎”所有的对象...原创 2021-03-10 00:00:00 · 113 阅读 · 0 评论 -
我所知道JVM虚拟机之运行时数据区的概述与程序计数器(PC寄存器)
前言本篇开始学习运行时数据区,上篇文章对类加载子系统做了讲解,后续重点展开观看字节码指令去了解现在我们知道类加载器里面有什么,做了什么事情就可以其实当我们类加载器把类存放到内存当中方法区实际上已经开始使用运行时数据区了,接下来就需要对讲讲运行时数据区进行讲解了一、运行时数据区概述前面我们说过我们的类会经过类加载器进行的加载 –> 验证 –> 准备 –> 解析 –> 初始化,...原创 2021-03-06 00:00:00 · 143 阅读 · 0 评论 -
我所知道JVM虚拟机之聊聊为什么学习JVM虚拟机
前言作为Java工程师的你曾被JVM伤害过吗?你是否也遇到过这些问题?运行着的线上系统突然卡死,系统无法访问,甚至直接OOM!想解决线上JVM GC问题,但却无从下手。新项目上线,对各种JVM参数设置一脸茫然,直接默认吧然后就JJ了。每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优VM参数,如何解决GC、OOM等问题,一脸懵逼大部分Java开发人员,...原创 2021-03-02 00:00:00 · 160 阅读 · 0 评论 -
我所知道JVM虚拟机之垃圾回收概述
前言从本篇开始,我们正式开始接触JVM的垃圾回收相关知识,本篇文章先进行概述与介绍一、回顾JVM的几个部分我们希望通过学习JVM达到的目的是让系统在业务越来越复杂的情况下使性能更加的优化效率高所以我们一般要将上层代码进行优化、底层在系统层面优化那么当我们进行JVM虚拟机优化的时候,就需要对性能进行监控在性能监控前提的是懂整个数据在Java虚拟机的分配与策略:内存的分配与回收那么要想明白内存的分配与...原创 2021-03-18 00:00:00 · 80 阅读 · 0 评论 -
我所知道JVM虚拟机之聊聊JVM虚拟机
一、介绍JVM跨语言的平台随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序ava虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。也就是说Java虚拟机拥有语言无关性,并不会单纯地与Java语言“终身绑定”,只要其他编程语言的编译结果满足并包含Java虚拟机的内部指令集、符号表以...原创 2021-03-03 00:00:00 · 258 阅读 · 0 评论 -
我所知道JVM虚拟机之聊聊Java语言
前言前篇聊了一会JVM,本篇文章再从几个方面来聊聊Java一、TIOBE排行榜TIOBE 排行榜:https://www.tiobe.com/tiobe-i...这是目前语言热度的排名版,而Java这门语言还是名列前茅的而世界上没有最好的编程语言,只有最适用于具体应用场景的编程语言二、Java生态圈Java是目前应用最为广泛的软件开发平台之一。随着Java以及Java社区的不断壮大Java 也早已...原创 2021-03-03 00:00:00 · 138 阅读 · 0 评论 -
我所知道JVM虚拟机之运行时数据区的本地方法栈
前言上篇文章介绍了运行时数据区的PC寄存器、虚拟机栈,这篇讲的本地方法栈一、本地方法在讲解运行时数据区里的本地方法栈时,先穿插一个内容讲解本地方法库(红色框框)什么是本地方法?================================简单地讲:一个Native Method就 是一个Java调用非Java代码的接口。该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其...原创 2021-03-08 00:00:00 · 87 阅读 · 0 评论