
JVM
分享JVM学习过程中的一些笔记。
simpleGq
聚沙成塔,集腋成裘。
展开
-
16.控制转移指令(条件跳转指令、比较条件跳转指令、多条件分支跳转指令、无条件跳转指令)
目录1.控制转移指令1.1 条件跳转指令1.2 比较条件跳转指令1.3 多条件分支跳转指令1.4 无条件跳转指令1.控制转移指令控制转移指令分为如下图所示的5种,其中比较指令在算术指令中描述过。1.1 条件跳转指令条件跳转指令一般和比较指令结合使用。在条件跳转指令执行前,一般先用比较指令进行栈顶元素的准备,然后进行条件跳转。条件跳转指令:弹出栈顶元素,测试它是否满足某一条件,如果满足,则跳转到指定位置。如下图表中所示,是条件跳转指令包括的指令。注意:a) byte、short、ch原创 2021-01-05 20:40:57 · 2576 阅读 · 0 评论 -
15.操作数栈管理指令
目录1.操作数栈管理指令1.操作数栈管理指令用于直接操作操作数栈中的元素。包括pop、dup、swap、nop四种。详细说明:例子:如下图所示,foo函数调用了bar函数,在bar函数返回的时候,返回值会被放入foo函数的栈帧的操作数栈中(需要注意的是:被调用函数的返回值会被放入调用函数的栈帧的操作数栈中),由于函数的返回值0是long类型,所以占用操作数栈的两个solt。foo函数中并没有使用bar的返回值,所以使用的是pop2指令,直接弹出foo操作数栈的两个solt,也就是0。更原创 2021-01-04 18:38:08 · 194 阅读 · 0 评论 -
14.方法调用与返回指令
目录1.方法调用指令2.方法返回指令1.方法调用指令invokespecial例子:用于调用父类方法、类构造器方法、私有方法。invokestatic例子:用于调用静态方法。invokeinterface例子:用于调用接口方法。invokevirtual例子:用于调用对象的实例方法。补充说明:2.方法返回指令分类见下图中的表格。例子:更多JVM文章请访问我的JVM专栏:https://blog.csdn.net/u011069294/category_10113093原创 2020-12-28 21:05:16 · 199 阅读 · 0 评论 -
13.对象的创建与访问指令(创建指令、字段访问指令、数组操作指令、类型检查指令)
目录1.对象创建与访问指令1.1 创建指令1.2 字段访问指令1.3 数组操作指令1.对象创建与访问指令1.1 创建指令创建指令分为两类:一类是创建类实例的指令:new;另一类是创建数组的指令:newarray、anewarray、multianewarray。new指令接收一个操作数,为指向常量池的索引,表示要创建的类型,执行完成后,将对象的引用压入栈。new指令例子:创建数组指令例子:需要注意的是:最后一种情况,创建的二维数组的长度不指定,其实在内存中只是创建了一维数组,使用的指令原创 2020-12-26 21:46:51 · 345 阅读 · 0 评论 -
12.类型转换指令
目录1.类型转换指令1.1 宽化类型转换(自动类型转换)1.2 窄化类型转换(强制类型转换)1.类型转换指令作用:用于将两种不同的数据类型进行相互转换。其实也就是用于基本数据类型(出去bool类型)之间的相互转换。类型转换指令分为宽化类型转换和窄化类型转换。1.1 宽化类型转换(自动类型转换)从小范围类型转换到大范围类型的安全转换称为宽化类型转换。例如从int转换成long。指令包括:如图中所示,图中每一条红色的线,就对应着一条指令。例如从int到long,就对应着i2l这条指令,其余类原创 2020-12-26 17:22:10 · 432 阅读 · 0 评论 -
11.算术指令
目录1.算术指令1.算术指令作用:对两个操作数栈上的值进行某种特定运算(加减乘除等),并且把结果重新压入操作数栈。分类:大体上可以分为对整数数据进行运算的指令和对浮点数进行运算的指令。对于byte、short、char和boolean,使用int类型的指令进行处理。运算时溢出:除法运算和取模运算,出现除数为0的情况,抛出ArithmeticException异常。运算模式:向最接近数舍入模式(四舍五入);向零舍入模式(取整)Nan值, Not a Number所有的算术指令如下所示:原创 2020-12-24 16:08:12 · 222 阅读 · 0 评论 -
10.加载与存储指令(load、const、push、lcd、store系列)
目录1.加载与存储指令概述2.操作数栈和局部变量表复习2.1 操作数栈2.2 局部变量表1.加载与存储指令概述作用:加载与存储指令用于将数据从栈帧的局部变量和操作数栈之间来回传递。将一个局部变量加载到操作数栈:xload、xload_<n>,其中<n>为0-3。将一个常量加载到操作数栈:bipush、sipush、ldc、iconst_<n>等,其中<n>为0-3。将一个数值从操作数栈存储到局部变量表:xstore、xstore_<n>原创 2020-12-23 19:51:14 · 1764 阅读 · 1 评论 -
9.字节码指令集概述
目录1.字节码指令集概述1.1 执行模型1.2 字节码与数据类型1.3 指令分类1.字节码指令集概述Java虚拟机指令由一个字节长度的操作码和零至多个的操作数组成。由于限制了Java虚拟机操作码的长度是一个字节(0~255),所以操作码总数不能超过256条。1.1 执行模型Java虚拟机的解释器可以使用下面的伪代码当做最基本的执行模型来理解:1.2 字节码与数据类型大部分字节码指令的操作码中都有特殊的字符来表明自己为哪种数据类型服务。也有一部分指令的操作码没有明确的指明操作数类原创 2020-12-21 19:44:35 · 123 阅读 · 0 评论 -
8.使用Javap命令解析Class文件
目录1.`javac -g` 命令说明2.`javap`用法1.javac -g 命令说明加上-g 操作之后,会生成局部变量表、指令和代码行偏移量映射表等附加信息,不加就不会生成。eclipse和IDEA,默认情况下,在生成Class文件的时候,与javap -g作用等价,也会生成局部变量表等信息。2.javap用法javap命令格式:javap <options> <classes> 。javap -v: 输出附加信息。信息最全,但不包括私有信息,加上-p可以原创 2020-12-18 17:30:57 · 587 阅读 · 1 评论 -
7.Class文件中的字段表集合、方法表集合、属性表集合
目录1.字段(`fields`)表集合2.方法表集合3.属性表集合1.字段(fields)表集合用于描述类或者接口中声明的变量。需要注意的是,字段(field)只包括类变量和实例变量,不包括方法内部、代码块内部声明的变量。字段叫什么名字、被定义为什么数据类型,需要引用常量池中的常量来描述。被引用的常量池表对应的项,描述了字段的标识符、访问修饰符、是类变量还是实例变量、是否是常量。注意:a). 字段表集合中不会列出从父类或者实现的接口中继承来的字段。b). Java中不可能存在两个同名的字段。原创 2020-12-18 15:44:51 · 282 阅读 · 0 评论 -
6.Class文件中的访问标识以及类索引、父类索引、接口索引集合
目录1.访问标识(`access_flag`)2.类索引、父类索引、接口索引集合2.1 类索引2.2 父类索引、接口索引集合1.访问标识(access_flag)在常量池之后,紧跟着的两个字节就是访问标识,用于识别一些关于接口和类的信息。例如,这个Class是类还是接口,是不是public类型,是不是abstract类型,如果是类的话,是否被声明为final。具体的信息可以参考下图中的表格。标志名称通常以ACC_开头每一种标记都是通过设置访问标记的32位中特定位来实现的。多个访问标识,通过取或操作原创 2020-12-14 18:57:33 · 119 阅读 · 0 评论 -
5.Class文件中的常量池
目录1.常量池概述1.1 `constant_pool_count` 常量池计数器1.2 `constant_pool` 常量池表1.2.1 字面量和符号引用1.2.21.常量池概述常量池是Class文件中内容最为丰富的区域。常量池对应Class文件中字段和方法的解析有着重要的作用。在版本号之后,紧跟着的就是常量池的数量以及若干个常量池表项。由于常量池中的常量不是固定的,所以在设置了一个u2类型的无符号数,来代表常量池容量计数值(constant_pool_count)。字节码文件中的常量池分原创 2020-12-10 16:35:35 · 456 阅读 · 0 评论 -
4.Class文件的标识 - 魔数(magic number)、Class文件的版本号
目录1.`Class`文件的标识 - 魔数(`magic number`)2.`Class`文件的版本号1.Class文件的标识 - 魔数(magic number)Class文件开头的四个字节的无符号整数称为魔数(Magic Number)。魔数是Class文件的标识。值是固定的,为0xCAFEBABE如果一个Class文件的头四个字节不是0xCAFEBABE,虚拟机在进行文件校验的时候回报错。使用魔数而不是扩展名来识别Class文件,主要是基于安全方面的考虑,因为文件扩展名可以随意更改。原创 2020-12-02 19:25:43 · 824 阅读 · 0 评论 -
3. Class文件的本质和内部数据类型(无符号数和表)、Class文件的结构概述
目录1.`Class`文件的本质和`Class`文件的格式2. Class文件的结构1.Class文件的本质和Class文件的格式任何一个Class文件都对应着一个类或者接口的定义信息,Class文件不一定以磁盘文件的形式存在,它的本质是一组以8位自己为基础单位的二进制流,可以使用网络方式进行传播。字节码文件的格式有着严格的规定,每个字节的顺序、代表的含义都不允许改变。Class文件采用类似于C语言结构体的方式进行存储,这种结构中只有两种数据类型:无符号数和表。a)无符号数属于基本数据类型,以u原创 2020-12-02 14:17:24 · 692 阅读 · 0 评论 -
2. 解读Class文件的三种方式
目录1.解读Class文件的三种方式1.解读Class文件的三种方式字节码文件是什么?源代码在经过前端编译器编译之后就会生成一个字节码文件,字节码文件是一种二进制文件,它的内容是JVM的指令,而不像C/C++编译之后直接生成机器码。什么是字节码指令(byte code)?字节码指令由操作码 + 操作数组成。操作数是可选的,有的字节码指令不存在操作数。操作数可以有多个。三种解读Class文件的方式1)使用binary Viewer或者Notepad++(需要安装HEX-Editor插件)-原创 2020-12-02 14:16:31 · 344 阅读 · 0 评论 -
1.字节码文件的跨平台性、前端编译器
1.字节码文件的跨平台性Java语言是跨平台的语言,当java源代码编译成字节码后,如果想在不同的平台上运行,则无需再次编译。Java虚拟机是跨语言的虚拟机。Java虚拟机不和Java语言进行绑定,无论用何种语言进行开发,只要能够将源文件编译成正确的Class文件,那么这种语言就能够在Java虚拟机上面执行。例如,Kotlin语言编写的程序,经过编译器编译成Class文件之后,就能够在Java虚拟机上面运行。3.想要让Java程序正确的运行在JVM中,Java源码就必须被编译为符合JVM规范的字节原创 2020-11-25 20:59:24 · 233 阅读 · 0 评论 -
我是分隔符
我是分隔符原创 2020-11-25 18:37:46 · 101 阅读 · 0 评论 -
71.常用的显示GC日志的参数、GC日志分析、日志分析工具的使用
目录1.常用的显示GC日志的参数2.图解垃圾`GC`日志(重要)3.日子分析例子1.常用的显示GC日志的参数解释:日志中,GC和Full GC表示的是GC的类型。GC只在新生代进行,Full GC包括新生代和老年代、方法区。Allocation Failure:GC发生的原因,一般新生代的GC发生的原因都是Eden区空间不够,不足以用来创建新的对象。80832k -> 19298k: 堆回收之前和回收之后剩余的空间的大小。(227840k):堆空间的大小。解释:PSYoungGen原创 2020-09-04 00:19:35 · 377 阅读 · 0 评论 -
70.垃圾回收器总结、怎么选择垃圾收集器
目录1.七款垃圾收集器的总结2.垃圾收集器的组合关系3.怎么选择垃圾收集器?1.七款垃圾收集器的总结新生代的垃圾回收器都是使用的复制算法(S0区和S1区),老年代的垃圾收集器使用的算法是标记-压缩和标记清除算法,只有CMS使用的是标记-清除算法,其他的老年代收集器都是使用的标记-压缩算法。G1既回收新生代又回收老年代,所以使用的是复制算法和标记-压缩算法。2.垃圾收集器的组合关系参考:https://blog.csdn.net/u011069294/article/details/10820434原创 2020-09-02 22:20:56 · 277 阅读 · 0 评论 -
69.G1垃圾回收的详细过程 -了解
目录1.G1回收过程一(`Young GC`)2.G1回收过程二(`并发标记过程`)3.G1回收过程三(`混合回收`)4.G1回收过程四(Full GC`) - 非必须1.G1回收过程一(Young GC)如下图所示,画红色对勾的区域表示的是,在进行YGC的时候,Eden区中存活的对象以及from区(Survivor区)中存活的对象,被移动到了to区。红色框框出的区域表示的是,Survivor区中的对象达到了阈值,直接晋升到老年代。YGC详细介绍:(了解)2.G1回收过程二(并发标记过程)原创 2020-09-02 22:00:11 · 1459 阅读 · 1 评论 -
68.记忆集(remembered set)和写屏障(write barrier)
目录1.记忆集(`remembered set`)1.记忆集(remembered set)问题:G1将堆区划分成多个region,一个region不可能是独立的,它其中存储的对象可能被其他任意region(这些region可能Old区或者Eden区)中的对象所引用。这样一来,在进行YGC的时候,判断Eden区中的一个对象是否存活时,需要去扫描所有的region(包括Old区,Eden区等),导致了在回收年轻代的时候,还需要扫描老年代,同时扫描表示所有Eden区和Old区的region,相当于做了一个全原创 2020-09-02 21:15:09 · 1349 阅读 · 2 评论 -
67. G1垃圾收集器中的region、G1垃圾收集器的主要回收环节概述
目录1. `Region`的介绍2.`G1`垃圾收集器的主要回收环节1. Region的介绍G1收集器,默认将Java堆划分成约2048个大小相同的独立的Region块,每一个Region块大小根据堆空间的时间大小来决定,范围控制在1MB到32MB之内。所有的Region大小相同,且在JVM生命周期内不会改变(除非JVM停止之后,重新设置Region的大小,否则region的大小不会改变)。Region使新生代和老年代的物理空间可以是不连续的。如下图,堆区被划分成了各个Region,各个Regi原创 2020-09-02 19:38:54 · 720 阅读 · 5 评论 -
66.G1垃圾收集器、优势与缺点、参数设置、使用场景
目录1.`G1`概述2.1.G1概述为什么有了前面几个强大的垃圾收集器,还需要Garbage First(G1) GC?随着应用程序所应对的业务越来越庞大、复杂,前面几款垃圾收集器已经不能满足实际的需要,所以出现了G1。G1是在延迟可控的情况下,获得尽可能高的吞吐量,所以才担当起“全功能收集器”的重任与期望。(全功能收集器的意思是它既负责新生代的垃圾回收又负责老年代的垃圾回收)G1收集器将堆内存划分为很多不想关的区域(Region)(物理上可以是不连续的空间),使用不同的Region来表示Ed原创 2020-09-01 20:43:19 · 1687 阅读 · 0 评论 -
65.Serial与Serial Old收集器、ParNew收集器、Paralell Scavenge与Parallel Old收集器、CMS收集器
目录1.`Serial`与`Serial Old`垃圾回收器 - 串行回收2.`ParNew`垃圾收集器 - 并行回收3.`Paralell Scavenge(吞吐量优先)`与`Parallel Old`垃圾收集器4.`CMS`垃圾收集器1.Serial与Serial Old垃圾回收器 - 串行回收Serial收集器采用复制算法、串行回收和STW机制的方式回收内存。Serial Old收集器同样采用串行回收和STW机制,只不过回收算法使用的是标记-压缩算法。在HotSpot虚拟机的Client模式原创 2020-08-25 21:44:04 · 512 阅读 · 1 评论 -
64.7款经典的垃圾收集器以及它们之间的组合关系、如何查看默认的垃圾回收器
目录1.七款经典的垃圾收集器2.垃圾收集器之间组合关系1.七款经典的垃圾收集器经典的垃圾回收器又如下7种:如下图所示,是经典的垃圾回收器和垃圾分代之间的关系。Serial GC、Parallel Scavenger GC以及ParNew GC只能收集年轻代。Serial Old GC、Parallel Old GC以及CMS GC只能收集老年代。G1 GC既能收集年轻代又能收集老年代。2.垃圾收集器之间组合关系一款年轻代的垃圾收集器总是对应着一款老年代的垃圾收集器。下面的图更新到了JD原创 2020-08-24 18:39:27 · 447 阅读 · 0 评论 -
63.垃圾回收器的分类、GC性能指标、吞吐量与暂停时间对比
目录1.垃圾回收器的分类2.`GC`性能指标3.吞吐量和暂停时间对比1.垃圾回收器的分类按垃圾回收器的线程数分:分为串行和并行垃圾回收器。串行垃圾回收器只有一个垃圾回收线程,并行垃圾回收器有多个垃圾回收线程。需要注意的是:串行以及并行垃圾回收器在回收垃圾的时候,都会Stop the World。按工作模式分,分为并发式和独占式垃圾回收器。并发式指的是垃圾回收器线程和应用程序线程交替工作,尽可能的减少应用程序的停顿时间。独占式指的是停止用户线程,知道垃圾回收完成。按碎片处理方式分:分为压缩式和原创 2020-08-19 21:32:07 · 844 阅读 · 0 评论 -
62.Java中几种不同的引用-强软弱虚
目录1.`Java`中几种不同的引用-强软弱虚概述1.1 强引用1.2 软引用1.3 弱引用1.4 虚引用1.Java中几种不同的引用-强软弱虚概述java中的引用分为4种,强引用、软引用、弱引用、虚引用,引用强度依次逐渐减弱,都继承自Reference类四种引用概述强引用:最传统的引用的定义,在开发中99%都是使用的强引用。即类似“Object obj = new Object()”这种引用关系。无论任何情况下,只要强引用的关系存在,垃圾收集器就永远不会回收掉被引用的对象。软引用:在系统将要原创 2020-08-17 21:30:53 · 173 阅读 · 0 评论 -
60.System.gc()的理解、内存溢出与内存泄漏、Stop the World
目录1.`System.gc()`的理解2.内存溢出3.内存泄漏4.`Stop the World`1.System.gc()的理解显示调用System.gc()会建议垃圾回收器进行Full GC注意只是建议,并不一定会真的进行Full GC2.内存溢出内存溢出要么是程序有问题导致的,要么就是分配的内存不够导致的。内存溢出出现的两个原因:a) 堆内存设置不够b) 代码中创建了大量大对象,并且长时间不能被垃圾收集器回收(存在引用)在抛出OOM之前,一般都会进行一次垃圾回收,尽可能原创 2020-08-13 20:33:29 · 415 阅读 · 0 评论 -
61.垃圾回收的并行与并发、安全点与安全区域
目录1.并行与并发2.垃圾回收的并行与并发3.安全点与安全区域1.并行与并发并行并发对比2.垃圾回收的并行与并发垃圾回收并行:指的是多条垃圾收集线程并行工作,但此时用户线程处于等待状态。垃圾回收并发:用户线程和垃圾回收线程同时执行,但不一定是并行的,可能会交替执行,垃圾回收线程在执行是不会停顿用户程序的执行。3.安全点与安全区域安全点程序执行时并非所有的地方都能够停下来开始GC,只有特定位置才能够停下来,这个位置称为安全点。选择安全点的时候,应该选择一些执行时间较长原创 2020-08-13 21:07:51 · 151 阅读 · 0 评论 -
59.分代收集算法、增量收集算法、分区收集算法简介
目录1.分代收集算法2.增量收集算法3.分区收集算法1.分代收集算法前面讲到的标记-清除算法、复制算法、标记-压缩算法,都有优缺点,没有一种算法是最好的。JAVA将堆分为新生代和老年代,这样可以根据各个年代的特点的不同使用不同的算法。在新生代中使用复制算法,在老年代中使用标记-清除算法或者标记-压缩算法,或者两者的结合。CMS2.增量收集算法3.分区收集算法更多JVM文章请访问我的JVM专栏:https://blog.csdn.net/u011069294/category_10原创 2020-08-11 20:09:32 · 394 阅读 · 0 评论 -
58.垃圾清除阶段-标记-清除算法、复制算法、标记-压缩算法
目录1.标记-清除算法2.复制算法3.标记-压缩算法4.3种算法的对比当成功区分出内存中的存活对象和死亡对象后,GC接下来的任务就是垃圾回收,释放掉无用对象所占用的内存空间,以便有足够的可用空间为新对象分配内存。目前JVM中有3种常见的垃圾收集算法:标记-清除算法、复制算法、标记-压缩算法。1.标记-清除算法当堆中的有效内存空间被耗尽的时候,就会停止整个程序(Stop the World),然后进行两项工作,第一项是标记,第二项是清除。标记:Collector从引用根节点开始变量,标记所有被引原创 2020-08-06 22:02:51 · 391 阅读 · 0 评论 -
57.使用MAT和JProfiler查看GC Roots
目录1.使用`MAT`查看`GC Roots`2.使用`JProfiler`查看`GC Roots`1.使用MAT查看GC RootsMAT简介下载:https://www.eclipse.org/mat/downloads.php生成dump文件的两种方式a)使用jmap命令b)使用JVisualVM生成dump2.使用JProfiler查看GC Roots更多JVM文章请访问我的JVM专栏:https://blog.csdn.net/u011069294/category_1原创 2020-08-05 17:18:20 · 1820 阅读 · 0 评论 -
56.对象的finalization机制、finalize方法理解
目录1.对象的`finalization`机制1.对象的finalization机制Java提供了finalization机制来允许开发人员提供对象销毁之前自定义处理逻辑。垃圾回收一个对象之前,总会先调用这个对象的finalize()方法finalize()方法是Object类中定义的,允许在任何子类中被重写,用于对象被回收时进行资源释放,例如,关闭数据库连接等等。不要主动的调用finalize()方法,应该交给垃圾回收机制来调用。原因:a)finalize()可能导致对象复活b)fin原创 2020-08-05 14:08:16 · 297 阅读 · 1 评论 -
55.垃圾标记阶段-引用计数算法、可达性分析算法
目录1.引用计数算法2.可达性分析算法垃圾标记阶段算法包括引用计数算法和可达性分析算法。在进行垃圾回收之前,需要判断哪些对象是存活对象,哪些是死亡对象,只有被标记为死亡的对象才能够被回收。当一个对象已经不再被任何的存活对象继续引用的时候,就可以宣判为已经死亡。判断对象是否存活一般有两种方式:引用计数算法和可达性分析算法。1.引用计数算法引用计数算法,会对每个对象都保存一个整型的引用计数器属性,用于记录对象被引用的情况。对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;原创 2020-08-04 21:38:47 · 260 阅读 · 0 评论 -
54.垃圾回收概述
目录1.什么是垃圾?为什么需要GC?2.了解早期的垃圾回收机制3.`Java`内存回收机制GC很重要,大厂面试都会问。下面是面试的一些题目。1.什么是垃圾?为什么需要GC?1.没有任何指针指向的对象就是垃圾。2.垃圾需要及时被清理,如果一直不对其进行清理,这些垃圾对象所占用的空间和会一直保留到应用程序结束,被保留的空间无法被其他对象使用,甚至导致内存溢出。3.为什么需要进行垃圾回收?a) 如果不进行垃圾回收,内存迟早要被消耗完。b) 垃圾回收除了释放没有用的对象,还可以清除内存里的记录碎原创 2020-08-03 19:08:57 · 215 阅读 · 0 评论 -
53.String的intern()方法、new String()到底创建了几个对象、intern()面试难题
目录1.`intern`方法解释2.`new String()`到底创建了几个对象3.`intern()`面试难题4.`intern()`总结5.`intern()`练习题6.`intern()`空间效率1.intern方法解释1.任意的字符串调用String.intern()方法,都会先去字符串常量池中寻找有没有相同的字符串,如果找到,则直接返回字符串常量池中的引用。如果没有找到,JDK6和JDK7及以后的处理存在区别:a)JDK6会直接复制一个String对象的副本放到常量池b)JDK7及以后原创 2020-07-30 18:51:28 · 473 阅读 · 0 评论 -
52.String内存结构位置和String拼接操作(面试)
目录1.2.1.2.更多JVM文章请访问我的JVM专栏:https://blog.csdn.net/u011069294/category_10113093.html原创 2020-07-28 18:54:24 · 464 阅读 · 1 评论 -
51.String的基本特性
目录1.`String`的基本特性1.String的基本特性1.String是使用一对""引起来的字符串。可以通过new或者字面量的方式创建String2.String声明为final的,不可被继承。3.String实现了Serializable接口。表示字符串是支持序列化的。实现了Comparable接口,表示String可以比较大小。4.JDK8及以前,内部使用final char[] value存储字符串数据,JDK9时改为byte[]将char数组换成byte数组的原因:大多数的Str原创 2020-07-28 17:15:04 · 275 阅读 · 0 评论 -
50.设置HotSpot采用解释器还是JIT编译器(-Xint、-Xcomp、Xmixed以及-Server、-Client)
目录1.设置HotSpot1.设置HotSpot1.设置采用解释器还是JIT编译器-Xint: 完全采用解释器模式执行程序。-Xcomp: 完全采用即时编译器模式执行程序。如果即时编译出现问题,解释器会介入执行。-Xmixed: 采用解释器和JIT编译器并存的方式共同执行程序。默认模式。2.设置JIT编译器的模式HotSpot中内嵌有两个JIT编译器,分别为Client Compiler和Server Compiler。-client:指定Java虚拟机运行在Client模式下。(对字节码原创 2020-07-27 17:17:39 · 953 阅读 · 0 评论 -
49.执行引擎中的解释器和JIT编译器(热点代码探测)
目录1.解释器2.JIT编译器3.热点代码探测技术JVM的执行引擎采用了解释器和JIT编译器的方式来执行代码。1.解释器2.JIT编译器1.HotSpot采用解释器与即时编译器并存的架构。2.为什么有了JIT编译器还需要解释器?当JVM虚拟机启动时,解释器可以首先发挥作用,而不必等待即时编译器全部编译完成之后再执行,这样就可以省去许多不必要的编译时间。随着时间的推移,编译器发挥作用,把越来越多的代码编译成本地代码,获得更高的执行效率。(解释器提高了应用程序的响应时间,JIT编译器提高了应用原创 2020-07-27 16:10:16 · 274 阅读 · 0 评论