
jvm
文章平均质量分 59
小志的博客
随笔笔记,仅供参考
展开
-
深入理解Java虚拟机——动态类型语言支持
目录一、静态类型语言的概述二、动态类型语言的概述一、静态类型语言的概述静态类型的语言在非运行阶段,变量的类型是可以确定的,也就是说变量是有类型的。二、动态类型语言的概述动态类型语言在非运行阶段,变量的类型是无法确定的,也就是变量是没有类型的,但是值是有类型的,也就是运行期间可以确定变量的值的类型。...原创 2022-03-27 21:56:03 · 624 阅读 · 0 评论 -
深入理解Java虚拟机——方法调用(动态分派调用)
一、动态分派调用1.1、方法动态分派调用演示示例代码在这里插入代码片输出结果总结原创 2022-03-27 21:48:43 · 633 阅读 · 0 评论 -
深入理解Java虚拟机——方法调用(静态分派调用)
目录一、静态分派1.1、方法静态分派演示1.2、静态类型和实例类型1.2.1、静态类型1.2.2、实例类型1.2.2、静态类型和实例类型的区别1.3、静态分派的概述一、静态分派1.1、方法静态分派演示示例代码/** * @description: 静态分派调用示例 * @author: xz */public class Test3 { static class Parent{ } static class Child1 extends Parent{原创 2022-03-27 19:33:33 · 349 阅读 · 0 评论 -
深入理解Java虚拟机——方法调用(解析调用)
目录一、方法调用的概述二、解析调用2.1、解析调用的概述2.2、适合类加载阶段进行解析的方法2.3、java虚拟机提供的5条方法调用字节码指令2.4、非虚方法和虚方法的概述2.5、方法静态调用解析的代码示例一、方法调用的概述方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法)。方法调用分为解析调用、静态分派调用和动态分派调用。二、解析调用2.1、解析调用的概述方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不可改变的原创 2022-03-26 22:17:22 · 465 阅读 · 0 评论 -
深入理解Java虚拟机——运行时栈帧结构(方法返回地址和附加信息)
目录一、方法返回地址的概述二、附加信息的概述一、方法返回地址的概述方法调用时通过一个指向方法的指针指向方法的地址,方法返回时将回归到调用处,那个地方是返回地址。二、附加信息的概述虚拟机规范允许具体的虚拟机实现增加一些规范里没有描述的信息到栈帧之中,这部分信息完全取决于具体的虚拟机实现。在实际开发中,一般会把动态连接、方法返回地址与其他附加信息全部归为一类,称为栈帧信息。...原创 2022-03-26 21:42:03 · 1500 阅读 · 0 评论 -
深入理解Java虚拟机——运行时栈帧结构(动态连接)
一、动态连接的概述每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接(Dynamic Linking)。Class文件的常量池中存有大量的符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用作为参数。这些符号引用一部分在类加载阶段或者第一次使用的时候就转化为直接引用,这种转化称为静态解析。这些符号引用另一部分将在每一次运行期间转化为直接引用,这部分称为动态连接(Dynamic Linking)。...原创 2022-03-26 21:29:10 · 846 阅读 · 0 评论 -
深入理解Java虚拟机——运行时栈帧结构(操作数栈)
目录一、操作数栈的概述二、操作数栈的概念模型一、操作数栈的概述操作数栈(Operand Stack)也常称为操作栈,它是一个后入先出(Last In First Out,LIFO)栈。同局部变量表一样,操作数栈的最大深度也在编译的时候写入到Code属性的max_stacks数据项中。当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是出栈/入栈操作。Java虚拟机的解释执行引擎称为“基于栈的执行引擎”,其中原创 2022-03-26 21:22:31 · 1551 阅读 · 0 评论 -
深入理解Java虚拟机——运行时栈帧结构(局部变量表)
目录一、局部变量表的概述二、reference类型的概述三、renturnAddress类型的概述四、局部变量表中Slot槽复用对垃圾回收的影响4.1、局部变量表中Slot槽复用对垃圾回收的影响(一)4.2、局部变量表中Slot槽复用对垃圾回收的影响(二)4.3、局部变量表中Slot槽复用对垃圾回收的影响(三)4.4、总结一、局部变量表的概述局部变量表(Local Variable Table)是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在jav程序编译为Class文件时,就在方原创 2022-03-24 23:16:35 · 1267 阅读 · 0 评论 -
深入理解Java虚拟机——运行时栈帧结构
目录一、栈帧的概述二、栈帧的概念结构一、栈帧的概述栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机里面从入栈到出栈的过程。二、栈帧的概念结构一个线程中的方法调用链可能会很长,很多方法都同时处于执行状态。对于执行引擎来说,在活动线程中,只有位原创 2022-03-24 22:27:21 · 1850 阅读 · 0 评论 -
深入理解Java虚拟机——类加载器
目录一、类加载器的概述二、类与加载器的概述三、类加载器的分类四、自定义类加载器并判断两个类是否相等的示例4.1 自定义类加载器的步骤4.2 自定义类加载器并判断两个类是否相等的代码示例五、双薪委派模型5.1、双薪委派模型的概述5.2、双薪委派模型的工作过程5.3、双薪委派模型的源码实现部分一、类加载器的概述通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类,实现这个动作的代码块称为“类加载器”。二、类与加载器的概述比原创 2022-03-22 23:15:38 · 845 阅读 · 1 评论 -
深入理解Java虚拟机——类加载过程
目录一、类加载过程的概述二、类加载的加载源一、类加载过程的概述“加载”是“类加载”(Class Loading)过程的一个阶段,在加载阶段,虚拟机需要完成以下3件事情:(1)、通过一各类的全限定名来获取定义此类的二进制字节流;(2)、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。(3)、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。二、类加载的加载源从ZIP包中读取。从网络中获取。 最典型的应用就是Applet。原创 2022-03-20 21:27:32 · 1255 阅读 · 0 评论 -
深入理解Java虚拟机——类加载的时机
目录一、类加载的时机概述二、加载阶段三、初始化阶段3.1、初始化阶段的概述3.2、以下5种情况必须立即对类进行“初始化”3.3、以下3种情况不被“初始化”四、主动引用和被动引用五、主动引用的示例5.1、父类还没有进行过初始化,则需要先触发其父类的初始化。六、被动引用的示例6.1、通过子类引用父类的静态字段而不被“初始化”6.2、通过数组定义来引用类而不被“初始化”6.3、调用类的常量而不被“初始化”一、类加载的时机概述类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Load原创 2022-03-20 14:15:04 · 1354 阅读 · 0 评论 -
深入理解Java虚拟机——类加载机制概述
一、类加载机制概述虚拟机把描述类的数据从Class文件加载加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为Java应用程序提供高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。...原创 2022-03-20 20:00:00 · 954 阅读 · 0 评论 -
深入理解Java虚拟机——同步指令
目录一、同步指令的概述二、同步指令的示例一、同步指令的概述Java虚拟机可以支持方法级的同步和方法内部一段指令序列的同步,这两种同步结构都是使用管程(Monitor)来支持的。方法级的同步是隐式的,即无须通过字节码指令来控制,它实现在方法调用和返回操作之中。同步一段指令集序列通常是由Java语言中的synchronized语句来表示的,Java虚拟机的指令集中有monitorenter和monitorexit两条指令来支持synchronized关键字的语义,正确实现synchronized关键字原创 2022-03-19 22:13:41 · 1031 阅读 · 0 评论 -
深入理解Java虚拟机——异常处理指令
目录一、异常处理指令的概述二、异常处理指令(示例1)三、异常处理指令(示例2)一、异常处理指令的概述在Java程序中显示抛出异常的操作(throw语句)都由athrow指令来实现,除了用throw语句显示抛出异常情况之外,Java虚拟机规范还规定了许多运行时异常会在其他Java虚拟机指令检测到异常状况时自动抛出。例如:当除数为零时,虚拟机会在idiv或Idiv指令中抛出ArithmeticException。在Java虚拟机中,处理异常(catch语句)不是由字节码指令来实现的(很久之前曾经使用j原创 2022-03-19 21:55:05 · 407 阅读 · 0 评论 -
深入理解Java虚拟机——方法调用和返回指令
目录一、方法调用指令二、方法调用指令的示例三、方法返回指令的示例一、方法调用指令指令作用invokevirtual用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),这也是java语言中最常见的方法分派方式invokeinterface用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用invokespecial用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和复类方法invokestatic用原创 2022-03-18 22:05:51 · 1730 阅读 · 0 评论 -
深入理解Java虚拟机——控制转移指令
目录一、控制转移指令的概述二、控制转移指令三、控制转移指令示例一、控制转移指令的概述控制转移指令可以让Java虚拟机有条件或无条件地从指定的位置指令而不是控制转移指令的下一条指令继续执行程序,从概念模型上理解,可以认为控制转移指令就是在有条件或无条件地修改PC寄存器的值。二、控制转移指令指令描述指令条件分支ifeq、iflt、ifle、ifne、ifgt、ifge、ifnull、ifnonnull、if_icmpeq、if_icmpne、if_icmplt、if_icmpg原创 2022-03-18 21:33:58 · 522 阅读 · 0 评论 -
深入理解Java虚拟机——对象创建与访问指令
目录一、对象创建与访问指令的概述二、对象创建与访问指令三、对象创建与访问指令的示例一、对象创建与访问指令的概述虽然类实例和数组都是对象,但Java虚拟机对类实例和数组的创建与操作使用了不同的字节码指令。对象创建后,就可以通过对象访问指令获取对象实例或者数组实例中的字段或者数组元素。二、对象创建与访问指令描述指令创建类的实例new访问类字段(static字段或者称为类变量)和实例字段(非static字段或者实例变量)getfield、putfield、getstat原创 2022-03-17 20:50:47 · 779 阅读 · 0 评论 -
深入理解Java虚拟机——类型转换指令
目录一、类型转换指令的概述二、宽化类型转换三、窄化类型转换四、类型转换指令的示例一、类型转换指令的概述类型转换指令可以将两种不同的数值类型进行相互转换,这些转换操作一般用于实现用户代码中的显示类型转换操作,或者用来处理字节码指令集中数据类型相关指令无法与数据类型一 一对应的问题。二、宽化类型转换宽化类型转换(Widening Numeric Conversions)即小范围类型向大范围类型的安全转换。int类型到long、float或者double类型。long类型到float、doubl原创 2022-03-06 21:21:33 · 228 阅读 · 0 评论 -
深入理解Java虚拟机——运算指令
目录一、运算指令的概述二、算术指令的内容三、算术指令的示例一、运算指令的概述运算或算数指令用于对两个操作数栈上的值进行某种特定运算,并把结果重新存入到操作栈顶。大体上算数指令可以分为两种:对整型数据进行运算的指令与对浮点型数据进行运算的指令,无论哪种算术指令,都使用Java虚拟机的数据类型,由于没有直接支持byte、short、char和boolean类型的算术指令,对于这类数据的运算,应使用操作int类型的指令代替。二、算术指令的内容算术指令描述算术指令加法指令iadd原创 2022-03-06 17:43:15 · 480 阅读 · 0 评论 -
深入理解Java虚拟机——加载和存储指令
目录一、加载和存储指令的概述二、加载和存储指令的内容三、加载和存储指令的示例一、加载和存储指令的概述加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输。二、加载和存储指令的内容将一个局部变量加载到操作数栈 iload、iload< n>、lload、lload< n>、fload、fload< n>、dload、dload< n>、aload、aload< n>;将一个数值从操作数栈存储到局部变量表 ist原创 2022-03-06 20:45:00 · 350 阅读 · 0 评论 -
深入理解Java虚拟机——字节码与数据类型
目录一、字节码与数据类型的概述二、字节码指令三、数据类型3.1、大部分指令包含类型信息3.2、其余部分指令不包含类型信息一、字节码与数据类型的概述在Java虚拟机的指令集合中,大多数的指令都包含了某操作所对应的数据类型信息。二、字节码指令iload指令用于从局部变量表中加载int类型的数据到操作数栈中。fload指令加载的则是float类型的数据。指令示例图三、数据类型3.1、大部分指令包含类型信息对于大部分与数据类型相关的字节码指令,他们的操作码助记符号中都有特殊的字原创 2022-03-05 21:38:20 · 509 阅读 · 0 评论 -
深入理解Java虚拟机——字节码指令简介
一、字节码指令简介Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数Operands)而构成。由于Java虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数指令都不包含操作数,只有一个操作码。操作码的长度为一个字节(即0~255),这意味着指令集的操作码总数不可能超过256条。...原创 2022-02-22 22:01:23 · 427 阅读 · 0 评论 -
深入理解Java虚拟机——魔数与Class文件的版本
目录一、魔数1.1、魔数的概述1.2、魔数的作用1.3、版本号二、通过Binary Viewer工具查看编译后的Class文件2.1、Binary Viewer工具的下载与安装2.2、Binary Viewer工具查看编译后的Class文件一、魔数1.1、魔数的概述每个Class文件的头4个字节称为魔数。Class文件的魔数的获得很有“浪漫气息”,值为0xCAFEBABE(咖啡宝贝?),这个魔数值在Java还称做“Oak”语言的时候(大约是1991年前后)就已经确定下来了。1.2、魔数的作用原创 2022-02-22 21:45:47 · 684 阅读 · 0 评论 -
深入理解Java虚拟机——Class类文件的结构
目录一、Class类文件的结构2.1、Class类文件结构的概述2.2、无符号数2.3、表二、Class类文件格式一、Class类文件的结构2.1、Class类文件结构的概述Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8为字节以上空间的数据项时,则会按照高位在前的方式分隔成若干个8位字节进行存储。Class文件格式采原创 2022-02-21 22:33:59 · 192 阅读 · 0 评论 -
深入理解Java虚拟机——Class类文件简介
目录一、Class文件简介二、Java虚拟机提供的语言无关性图解一、Class文件简介实现无语言无关性的基础仍然是虚拟机和字节码存储格式,Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集合符号表以及若干其他辅助信息。二、Java虚拟机提供的语言无关性图解使用Java编译器可以把Java代码编译为存储字节码的Class文件,使用JRuby等其他语言的编译器一样可以把程序代码编译成Class文件,虚原创 2022-02-21 22:10:12 · 906 阅读 · 0 评论 -
深入理解Java虚拟机——可视化监控工具(Jconsole)线程死锁监控示例
目录一、可视化监控工具(Jconsole)的使用二、可视化监控工具(Jconsole)线程死锁监控示例2.1、编写死锁代码示例并运行2.2、启动可视化监控工具(Jconsole),查看线程情况一、可视化监控工具(Jconsole)的使用参考lz此博文链接:可视化监控工具(Jconsole)的使用。二、可视化监控工具(Jconsole)线程死锁监控示例2.1、编写死锁代码示例并运行模拟死锁代码/** * @description: * @author: xz */public cl原创 2022-02-19 21:36:32 · 844 阅读 · 0 评论 -
深入理解Java虚拟机——Java堆栈跟踪工具(jstack)
目录一、Java堆栈跟踪工具(jstack)的概述二、线程快照2.1、线程快照的概述2.2、线程快照的目的三、Java堆栈跟踪工具(jstack)的格式及参数说明四、Java堆栈跟踪工具(jstack)的执行样例1四、Java堆栈跟踪工具(jstack)的执行样例2一、Java堆栈跟踪工具(jstack)的概述jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或javacore文件)。二、线程快照2.1、线程快照的概述线原创 2022-02-19 21:15:23 · 1456 阅读 · 0 评论 -
深入理解Java虚拟机——虚拟机堆转储快照分析工具(jhat)
目录一、虚拟机堆转储快照分析工具(jhat)的概述二、实际工作中一般不直接使用jhat命令分析dump文件原因三、使用jhat分析dump文件示例一、虚拟机堆转储快照分析工具(jhat)的概述jhat(JVM Head Analysis Tool)命令与jmap搭配使用,来分析Jmap生成的堆转储快照。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看。二、实际工作中一般不直接使用jhat命令分析dump文件原因一般不会在部署应用程序的服务器上原创 2022-02-17 22:40:33 · 1424 阅读 · 0 评论 -
深入理解Java虚拟机——Java内存映像工具(Jmap)
目录一、Java内存映像工具(jmap)的概述二、Java内存映像工具(jmap)的作用三、Java内存映像工具(jmap)的格式及参数说明四、Java内存映像工具(jmap)的执行样例一、Java内存映像工具(jmap)的概述jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为headdump或dump文件)。如果不使用jmap命令,要想获取Java堆转储快照,通过-XX:+HeadDumpOnOutOfMemoryError参数,可以让虚拟机在OOM异常出现之后自动原创 2022-02-17 22:24:10 · 1360 阅读 · 0 评论 -
深入理解Java虚拟机——Java配置信息工具(jinfo)
目录一、Java配置信息工具(Jinfo)的概述二、Java配置信息工具(Jinfo)的格式及参数说明三、Java配置信息工具(Jinfo)的执行样例3.1、执行样例13.2、执行样例2一、Java配置信息工具(Jinfo)的概述jinfo(Configuration Info for Java)的作用是实时地查看和吊证虚拟机各项参数。二、Java配置信息工具(Jinfo)的格式及参数说明格式jinfo [ option ] pid参数说明选项作用-v查看原创 2022-02-17 21:50:06 · 737 阅读 · 0 评论 -
深入理解Java虚拟机——虚拟机工具介绍
一、虚拟机工具介绍java开发人员肯定都知道JDK的bin目录中有“java.exe”、和“javac.exe”这两个命令行工具,每逢JDK更新版本之时,bin目录下命令行工具的数量和功能总会不知不觉地增加和增强。bin目录的内容如下。这些命令行工具大多数都是jdk/lib/tools.jar类库的一层薄包装而已,它们主要的功能代码是在tools类库中实现的。如下图对比一下就可以看得很清楚。二、Sun JDK监控和故障处理工具名称主要作用jpsJVM Proce原创 2022-02-16 22:46:02 · 613 阅读 · 0 评论 -
深入理解Java虚拟机——内存分配
目录一、内存分配策略二、对象优先在Eden分配2.1、对象优先在Eden分配的概述2.2、对象优先在Eden分配的参数2.3、新生代Minor GC 的代码示例三、大对象直接进入老年代3.1、大对象直接进入老年代的概述3.2、大对象直接进入老年代的参数3.3、老年代Major GC/Full GC 的代码示例四、长期存活的对象将进入老年代一、内存分配策略对象优先在Eden分配大对象直接进入老年代长期存活的对象将进入老年代动态对象年龄判断空间分配担保二、对象优先在Eden分配2.1、对象优原创 2022-02-16 22:17:15 · 1233 阅读 · 0 评论 -
深入理解Java虚拟机——G1收集器
目录一、G1收集器历史二、G1手收集器的概述三、G1手收集器的特点四、G1手收集器的运行步骤五、G1手收集器运行示意图一、G1收集器历史G1(Garbage-First)收集器是当今收集器技术发展的最前沿成果之一,从JDK6u14中开始就有Early Access版本的G1收集器供开发人员实验、试用,由此开始G1收集器的"Experimental"状态持续了数年时间,直至JDK7u4,Sun公司才认为它达到足够成熟的商用程序,移除了"Experimental"的标识。二、G1手收集器的概述G1原创 2022-02-14 22:07:49 · 1188 阅读 · 0 评论 -
深入理解Java虚拟机——CMS收集器
目录一、CMS收集器的概述二、CMS收集器运行过程三、CMS收集器优点四、CMS收集器缺点五、CMS收集器运行示意图一、CMS收集器的概述CMS(Concurrent Mark Sweep)收集器是一种咦获取最短回收停顿时间为目标的收集器,目前很大一部分的java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重石服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验,CMS收集器就非常符合这类应用的需求。CMS(Concurrent Mark Sweep)收集器是基于“标记-清除”算原创 2022-02-13 23:20:45 · 738 阅读 · 0 评论 -
深入理解Java虚拟机——Parallel Old收集器
目录一、Parallel Old收集器的概述二、Parallel Old收集器运行示意图一、Parallel Old收集器的概述Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法,这个收集器是在JDK1.6中才开始提供的。直到Parallel Old收集器出现后,“吞吐量优先”收集器终于有了比较名副其实的应用组合,在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器。原创 2022-02-13 22:38:38 · 966 阅读 · 0 评论 -
深入理解Java虚拟机——Serial Old收集器
一、Serial Old收集器的概述Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理算法”,这个收集器的主要意义也是在于给Client模式下的虚拟机使用。二、Serial Old收集器在server模式下的用途在JDK1.5以及之前的版本中与Parallel Scavenge收集器搭配使用。作为CMS收集器的后备预案,在并发收集放生Concurrent Mode Failure时使用。三、Serial/Serial Old收集器运行示意图原创 2022-02-13 22:17:15 · 663 阅读 · 0 评论 -
深入理解Java虚拟机——Parallel Scavenge收集器
目录一、Parallel Scavenge收集器的概述二、Parallel Scavenge收集器的目标三、Parallel Scavenge收集器的参数一、Parallel Scavenge收集器的概述Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器。由于与吞吐量关系密切,Parallel Scavenge收集器也经常称为“吞吐量优先”收集器。自适应的调节策略也是Parallel Scavenge收集器与ParNew收集器的一个重要区原创 2022-02-13 22:07:29 · 672 阅读 · 0 评论 -
深入理解Java虚拟机——ParNew收集器
目录一、ParNew收集器的概述二、ParNew收集器的缺点三、ParNew收集器收集器的优点四、ParNew/Serial Old收集器运行示意图一、ParNew收集器的概述ParNew收集器其实就是Serial收集器的多线程版本,除了多线程收集之外,其他与Serial收集器相比并没有太多创建之处。除了Serial收集器外,目前只有它能与CMS收集器配合工作。二、ParNew收集器的缺点ParNew收集器在单CPU的环境中绝对不会有比Serial收集器更好的效果,甚至由于存在线程交互的开销原创 2022-02-12 11:45:37 · 815 阅读 · 0 评论 -
深入理解Java虚拟机——Serial收集器
一、Serial收集器的概述Serial收集器是最基本、发展历史最悠久的收集器,曾经(在JDK1.3.1之前)是虚拟机新生代收集器的唯一选择,这个收集器是一个单线程的收集器。“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。二、Serial收集器的优点Serial收集器依然是虚拟机在Client模式下的默认新生代收集器,它有着优于其他收集器的地方:简单而高效(与其他收集器的单线程比),对于限定单个C原创 2022-02-12 11:25:37 · 697 阅读 · 0 评论