jvm
文章平均质量分 51
Hao_JunJie
这个作者很懒,什么都没留下…
展开
-
jvm指令集
一、概述:官方文档:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html二、执行模型:三、数据类型:上图可以看出字节码指令大体上可以分为三类,一类是和数据类型有关,第二类是 没有明确地知名操作类型,第三类是和数据类型无关。四、指令分类:五、详细介绍指令(1)加载与存储指令:a、局部变量压栈指令:b、常量入栈指令:c、出栈装入局部变量表指令:(2)算数指.....原创 2022-06-15 17:15:01 · 480 阅读 · 2 评论 -
JVM之Class文件
一、官方文档位置:Chapter4.The class File Format (oracle.com)https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html二、Class 文件格式:Class 的结构不像 XML 等描述语言,由于它没有任何分割符号。所以在其中的数据项,无论是字节顺序还是数量,都是被严格限定的,哪个字节代表什么含义,长度是多少,先后顺序如何,都不允许改变。三、Class 文件总体结构:Class 文件格式..原创 2022-05-11 14:44:36 · 306 阅读 · 0 评论 -
JVM之G1垃圾收集器
一、概述:G1(Grabage-First)是一款面向服务端应用的垃圾收集器,主要针对配备多核cpu及大容量内存的机器,以及高概率满足GC停顿时间的同时,还兼顾高吞吐量的的性能特征在JDK1.7版本正式启用,移除了Experimental的标识,是JDK 9以后的默认垃圾回收器,取代了CMS 回收器以及Parallel + Parallel Ol的组合。被Oracle官方称为“全功能垃圾收集器”。与此同时,CMS已经在JDK9中被标记为废弃(deprecated)。在jdk8中还不是默认垃圾收集原创 2022-05-01 11:29:51 · 8514 阅读 · 1 评论 -
JVM之CMS垃圾回收器
主打:低延迟一、概述a、在jdk1.5时期,HotSpot推出了一款强交互应用中几乎可以认为有划时代意义的垃圾收集器CMS(Concurrent-Mark-Sweep)收集器,这款收集器是HotSpot虚拟机中第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程同时工作。b、CMS收集器的关注点是尽可能缩短垃圾收集时用户线程停顿时间,停顿时间越短(低延迟)就越适合与用户交互的程序,良好的响应速度能提升用户体验。 目前很大一部分的java应用集中在互联网或者B/S系...原创 2022-04-23 12:02:05 · 602 阅读 · 0 评论 -
JVM之Parallel Scavenge回收器
吞吐量优先一、概述:HotSpot的年轻代中除了拥有ParNew收集器是基于并行回收的以外,Parallerl Scavenge收集器同样也是采用了复制算法、并行回收、“Stop-the-World”机制。二、和ParNew并行收集器比较:a、ParNew收集器不同,Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput),它也被称为吞吐量优先的垃圾收集器。b、自适应调节策略也是Parallel Scavenge 与ParNew一个重要区别。三原创 2022-04-18 15:24:59 · 728 阅读 · 1 评论 -
JVM之ParNew垃圾收集器
一、概述:如果说Serial GC 是年轻代中的单线程垃圾收集器,那么ParNew收集器则是Serial收集器的多线程版本二、采用的机制:ParNew 收集器除了采用并行回收的方式执行内存回收外,两款垃圾收集器之间几乎没有任何区别。ParNew收集器在年轻代中同样也是采用复制算法、“Stop-the-World”机制。三、ParNew是很多JVM运行在Server模式下新生代的默认垃圾收集器。四、由于ParNew收集器是基于并行回收,那么是否可以断定ParNew收集器的回收效率在任何场景原创 2022-04-17 15:04:14 · 1809 阅读 · 4 评论 -
JVM之Serial垃圾回收器
Serial回收器(串行回收)一、概述:Serial 收集器是最基本的、历史最悠久的垃圾收集器。JDK1.3之前回收新生代唯一的选择。二、client默认的垃圾收集器:Serial收集器作为HotSpot中Client模式下的默认新生代垃圾收集器。三、采用的机制:Serial 收集器采用复制算法、串行回收和“Stop-the-World”机制的方式执行内存回收。四、老年代的垃圾收集:除了年轻代之外,Serial收集器还提供于执行老年代的Serial Old 收集器。Ser原创 2022-04-17 14:22:43 · 1465 阅读 · 1 评论 -
JVM之垃圾收集器概述
一、垃圾收集器发展史:二、如何评判垃圾收集器:三、现在垃圾收集器的评判标准:高吞吐量:低延迟:四、经典的垃圾收集器:a、新生代:Serial、ParNew、Parallel Scavenge;b、老年代:Serial Old、Parallel Old、CMS;c、整堆收集:G1五、经典垃圾收集器的组合(基于JDK14):六、不同JDK版本查看垃圾收集器:...原创 2022-04-17 13:38:25 · 121 阅读 · 0 评论 -
Java几种不同的引用
一、前言:在JDK1.2版之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4种,这4种引用强度依次逐渐减弱。除强引用外,其他3种引用均可以在java.lang.ref包种找到它们的身影,如下图,显示了这3种引用类型对应的类,开发人员可以在应用程序中直接使用它们。二、四种引用:Reference子类中只有终结器引用是包内可见原创 2022-04-15 13:51:54 · 614 阅读 · 0 评论 -
JVM之安全点和安全区域
安全点(Safepoint):一、定义:程序执行时并非所有地方都能停下来开始GC,只有在特定的位置才能停顿下来开始GC,这些位置称为“安全点(Safepoint)”二、如何选择:Safe Point 的选择很重要,如果太少可能导致GC等待的时间太长,如果太频繁可能导致运行时的性能问题。大部分指令的执行的时间都非常短暂,通常会根据“是否具有让程序长时间执行的特征”为标准。比如:选择一些执行时间较长的指令作为Safe Point,如方法调用、循环跳转和异常跳转等。三、如何在GC发生时,检查所原创 2022-04-14 15:17:10 · 2246 阅读 · 0 评论 -
JVM之Stop-the-World
一、说明:Stop-the-World,简称STW,指的是GC时间发生过程中,会产生应用程序停顿。停顿产生时整个应用程序线程都会被暂停,没有任何响应,有点像卡死的感觉,这个停顿称为STW。二、为什么要进行STW:都知道java采用的是可达性分析算法,可达性分析算法中枚举根节点(GC Roots)会导致java执行线程停顿。分析工作必须在一个能确保一致性快照中进行。一致性指整个分析期间整个执行系统看起来像被冻结在某个时间点上。如果出现分析过程中对象引用关系还在不断变化,则分析结果的准确原创 2022-04-13 18:39:01 · 625 阅读 · 0 评论 -
内存溢出和内存泄漏
内存溢出:一、内存溢出相对于内存泄漏来说,尽管更容易被理解,但是同样的,内存溢出也是引发程序崩溃的罪魁祸首之一。二、由于GC一直在发展,所有一般情况下,除非应用程序占用的内存增长速度非常快,造成垃圾回收已经跟不上内存消耗的速度,否则不太容易出现OOM情况。三、大多数情况下,GC会进行各种年龄段的垃圾回收,实在不行了就放大招,来一次独占式的Full GC操作,这时候会回收大量的内存,供应用程序继续使用。四、javadoc中对OutOfMemoryError的解释是,没有空闲内存,并且垃圾收集也原创 2022-04-13 18:08:29 · 3342 阅读 · 2 评论 -
System.gc()的理解
一、在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显示触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。二、原创 2022-04-13 15:08:19 · 7623 阅读 · 1 评论 -
JVM之增量收集和分区收集算法
前提:在垃圾回收过程中,应用软件将处于一种Stop the World 的状态。在Stop the Word 状态下,应用程序所有的线程都会挂起,暂停一切正常的工作,等待垃圾回收的完成,如果垃圾回收时间过长,应用程序会被挂起很久,将严重影响用户体验或者系统的稳定性。为了解决这个问题,即对实时垃圾收集算法的研究直接导致增量收集算法和分区收集算法的诞生。增量收集:一、基本思想如果一次性将所有的垃圾进行处理,需要造成系统长时间的停顿,那么就可以让垃圾收集线程和应用程序线程交替执行,每次,垃圾收集线原创 2022-04-10 15:22:05 · 548 阅读 · 0 评论 -
JVM之分代收集说明
一、说明:a、没有一种算法可以完全替代其他算法,它们都具有自己独特的优势和特点。分代收集算法应运而生。b、分代收集算法,是基于这样一个事实:不同的对象的生命周期是不一样的,因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。一般是把Java 堆分为新生代和老年代,这样就可以根据各个年代的特点使用不同的回收算法,以提高垃圾回收的效率。c、在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session 对象,线程,Socket连接,这类对原创 2022-04-10 11:55:23 · 686 阅读 · 0 评论 -
JVM之标记整理算法
一、背景:二、区别:标记-压缩算法的最终效果等同于标记-清除算法执行完成后,在进行一次内存碎片整理,因此,也可以把它称为标记-清除-压缩(Mark-Sweep-Compact)算法。二者的本质差异在于标记-清除算法是一种非移动式的回收算法,标记-压缩是移动式的。是否移动回收后的存活对象是一项优缺点并存的风险决策。可以看到,标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存会被清理掉。如此一来,当我们需要给新对象分配内存时,JVM只需要维持一个内存的起始地址即可,这比维护一个原创 2022-04-10 11:03:00 · 712 阅读 · 0 评论 -
JVM之复制算法
一、背景:二、核心思想:三、图解:不用标记存活对象,直接将A中存活的对象复制到B中。四、优缺点:优点:a.没有标记和清除过程,实现简单,运行高效。b.复制过去以后保证空间的连续性,不会出现“碎片” 问题。(使用的指针碰撞分配内存)缺点:a.此算法的缺点也是很明显的,就是需要两倍的内存空间。b.对于G1这拆分成为大量region 的GC,复制而不是移动,就意味着GC需要维护region之间对象引用关系,不管是内存占用或者时间开销也不小。java 对象访问原创 2022-04-10 10:37:47 · 985 阅读 · 0 评论 -
JVM之标记清除算法(清除阶段)
一、前言:当成功区分出内存中的存活对象和死亡对象后,GC接下来的任务就是执行垃圾回收,释放掉无用对象所占的内存空间,以便有足够的可用内存空间为新对象分配内存。二、常见的垃圾回收算法:目前在JVM中比较常见的三种垃圾收集算法是标记-清除算法(Mark-Sweep)复制算法(Copying)标记-压缩算法(Mark-Compact)三、背景标记-清除算法(Mark-Sweep)是一种非常基础和常见的垃圾收集算法,改算法被J.McCarthy等人在1960年被提出并应用于Lis原创 2022-04-10 10:09:13 · 884 阅读 · 0 评论 -
JVM之对象的finalization机制
一、定义:Java 语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义出来逻辑二、执行时机:当垃圾回收发现没有一个引用指向一个对象,即:垃圾回收此对象之前,总会先调用这个对象的finalize() 方法。三、用法:finalize()方法允许在子类中被重写,用于在对象被回收时进行资源释放。通常在这个方法中进行一些资源释放和清理的工作,比如关闭文件,套接字和数据库连接等源码截图:四、永远不要主动调用:永远不要主动调用某个对象的fi原创 2022-03-22 20:10:08 · 499 阅读 · 0 评论 -
JVM垃圾标记算法之可达性分析算法
一、别名:可达性分析算法也叫根搜索算法,追踪性垃圾收集二、相较于引用计数算法:三、可达性分析算法实现思路:所谓的GC Roots根集合就是一组必须活跃的引用。图解:四、Java中 GC Roots 包括哪些元素:图解:五、GC Roots扩展:六、注意:...原创 2022-03-22 19:10:14 · 732 阅读 · 0 评论 -
JVM垃圾标记算法之引用计数算法
一、标记阶段概念:二、JVM中是怎么判断一个对象死亡的呢?简单的说,当一个对象已经不再被任何的存活的对象继续引用时,就可以宣判已经死亡了。三、判断对象存活一般有两种方式:(1)引用计数算法(2)可达性分析算法、四、引用计数器算法:五、引用计数器算法的优缺点:循环引用eg:六、举例说明java并没有使用引用计数算法:代码:图解:没进行GC前 内存情况:显示进行GC后 内存情况:发现obj1和obj2 对象被...原创 2022-03-10 19:51:04 · 386 阅读 · 0 评论 -
JVM之垃圾回收概述
一、什么是垃圾:二、为什么需要GC:三、早期垃圾回收:四、Java垃圾回收机制:担忧:原创 2022-03-08 20:29:13 · 211 阅读 · 0 评论 -
String相关面试题
一、String的基本特性:具体可以查看网址查看变更具体信息:http://openjdk.java.net/jeps/254a、String 的不可变性:eg(1):(2)原有字符串常量池里的"abc" 不变,只是在常量池里新创建了一个"abcdef"(3)b、字符串常量池里不能存储相同内容的字符串、底层实现:二、String的内存分配:内存位置发生改变:StringTable为什么要调整?(1)permSize...原创 2022-03-08 18:15:28 · 470 阅读 · 0 评论 -
JVM之类的加载器
JVM 支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader) 和自定义类加载器(user-Defined ClassLoader).从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java 虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器无论类加载器类型如何划分,在程序中我们最常见的类加载器始终只有三个,如下图所示:但发现Extension Class Loader(原创 2022-02-24 18:42:20 · 80 阅读 · 0 评论 -
JVM之直接内存
一、概述:a.不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。b.直接内存是在Java堆外的、直接向系统申请的内存区间。c、来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存。d、通常,访问直接内存的速度会优于Java堆。即读写性能高。e、也有可能导致OutOfMemoryError 异常。f、由于直接内存存在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆内存大小,但是系统内存是有限的,Java堆和直接内存的综原创 2022-01-07 14:49:19 · 297 阅读 · 0 评论 -
JVM之对象实例化
一、图解:原创 2021-12-23 14:45:27 · 410 阅读 · 0 评论 -
JVM之对象的访问定位
一、图解:二、栈帧中的局部变量是如何访问到对象实体的:通过栈帧上的reference。三、对象的两种访问方式: (1)句柄访问: (2)直接访问:四、对象两种访问方式的优缺点...原创 2021-12-23 13:56:33 · 348 阅读 · 0 评论 -
JVM之对象的内存布局
一、图解:原创 2021-12-22 19:50:17 · 387 阅读 · 0 评论 -
JVM之TLAB
一、提出:堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据,由于对象实例的创建再jvm中非常频繁,因此再并发环境下堆区中划分内存空间是线程不安全的,为了避免多个线程操作同一地址,需要使用加锁等机制,从而影响分配速度。二、什么是TLAB;三、图解:四、TLAB详细说明:a、尽管不是所有的对象实例都能够在TLAB中成功分配内存,但JVM确实是将TLAB作为内存分配的首选b.在程序中,开发人员可以通过选项:“-XX:UserTLAB” 设置是否开启TLAB空间c.默认.原创 2021-12-09 19:21:57 · 1135 阅读 · 0 评论 -
jvm之堆
一。概述:二、堆内存细分:从逻辑上jvm堆上包含方法区,但实际上 只包含 新生代和老年代例子:从上面的例子可知:Eden+S0+S1+Old Gen = 10Mjdk1.8和jdk1.8之前方法区的对比:验证:三、堆内存大小设置和查看...原创 2021-12-31 16:10:55 · 324 阅读 · 0 评论 -
JVM之 MinorGC、 MajorGC、 FullGC、
一、概念:JVM在进行GC时,并非每次都对新生代,老年代,方法区,三个内存区域一起回收,大部分时候回收指的是新生代。二、分类:针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类:一种是部分收集(Partial GC),一种是整堆收集(Full GC).部分收集(不是完整收集整个Java堆的垃圾收集)分为:a.新生代收集(Minor GC / Young GC):只是新生代的垃圾收集。b.老年代收集(Major GC/ Old GC):只是老年代的垃圾收集。原创 2021-12-09 16:39:30 · 348 阅读 · 0 评论 -
JVM之方法返回地址
一、存放的是调用者的pc寄存器的值:二、一个方法的结束,有两种方式: 1.正常执行完成。 2出现未处理的异常,非正常退出。三、无论通过那种方式退出,在方法退出后都返回到该方法被调用的位置。方法正常退出时,调用者的pc寄存器的值作为返回地址,即调用该方法的下一条指令的地址。而异常退出的,返回地址是幺通过异常表来确定,栈帧中一般不会保存这部分信息。四、本质上,方法的退出就是当前栈帧出栈的过程,此时需要恢复上层方法的局部变量表,操作数栈,将返回值压入调用者的栈帧的操作数栈,...原创 2021-12-02 09:45:26 · 944 阅读 · 0 评论 -
Java 语言中方法重写的本质,以及虚方法表引入
一、1.找到操作数栈顶的第一个元素所执行的对象的实际类型,记作C。 2.如果在类型C中找到与常量中的描述符合简单名称都相符的方法,则进行访问权限校验,如果通过则放回这个方法的直接引用,查找过程结束;如果不通过,则返回java.lang.IllegalAccessError异常。 3,否则,按照继承关系从下往上依次对C的父类进行第2步的搜索和验证过程。 4.如果始终没有找到合适的方法,则抛出java.lang.AbstractMethodError异常。二、为了避...原创 2021-11-28 13:23:05 · 896 阅读 · 0 评论 -
JVM四种调用方法的指令
一、非虚方法:(1)如果方法在编译期间就确定了具体的调用版本,这个版本在运行时是不可变的。这样的方法称之为非虚方法。(2)静态方法,私有方法,final 方法,实例构造器,显式调用的方法 都是非虚方法。(3)其他方法成为虚方法。二、jvm提供了以下几条方法调用指令:(1)普通调用指令:1.invokestatic:调用静态方法,解析阶段确定唯一方法版本。2.invokespecial:调用<init> 方法,私有及显式调用父类方法,解析阶段确定唯一方法版本。3.i原创 2021-11-28 12:58:56 · 450 阅读 · 0 评论 -
JVM之方法的绑定机制
一、前提:在JVM中,将符号引用转换为调用方法的直接引用与方法的绑定机制相关。二、区别:(1)静态链接:当一个字节码原创 2021-11-28 11:23:11 · 432 阅读 · 0 评论 -
JVM之虚拟机栈之动态链接
一、前提:本篇我们主要讲解栈帧中的动态链接(指向运行时常量池的引用)二、概念:先来看一下上图,有时候我们将方法返回地址、动态链接、一些附加信息统称为帧数据区(1)每一个栈帧内部包含一个指向运行时常量池中该栈帧所属方法的引用,包含这个引用的目的就是为了支持当前方法的代码能够实现动态来链接。比如:invokdynamic指令。(2)在Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用,保存在class 文件的常量池里。比如:描述一个方法调用了另外的其他方法时,就是通原创 2021-04-07 22:22:20 · 510 阅读 · 0 评论 -
JVM虚拟机栈之操作数栈
上图时JVM虚拟机栈的栈帧的内部结构,本篇主要讲解操作数栈一、概念:(1)操作数栈,主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。(2)操作数栈就是JVM执行引擎的一个工作区,当一个方法刚开始执行的时候,一个新的栈帧也会随之被创建出来,这个方法的操作数栈是空的。(操作数栈的实现是一个数组,当数组被创建出来的时候,它的长度已经确定,只不过操作数栈不能用索引来获取数据,它是一个栈结构,只有出栈和入栈操作).(3)每一个操作数栈都会拥有一个明确的栈帧深度用来存储数值,...原创 2021-03-27 17:06:43 · 1668 阅读 · 0 评论 -
JVM虚拟机栈之局部变量表
上图是每个栈帧的内部结构,一个栈能放多少栈帧,取决于栈帧的大小,栈帧的大小取决于局部变量表这篇主要讲解 局部变量表:一,概念:(1)局部变量表也被称之为局部变量表数组或本地变量表(2)定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括个中基本数据类型,对象引用,以及returnAddress类型(3)由于局部变量表是建立在线程的栈上,是线程私有数据,因此不存在数据安全问题(4)局部变量表所需的容量大小实在编译期确定下来的,并保存在方法的code...原创 2021-03-27 15:54:50 · 579 阅读 · 0 评论 -
JVM之虚拟机栈
当class 文件通过类加载子系统到内存中,在内存中生成对应的运行时数据区。这篇主要讲解的是图中红框的部分——>Java虚拟机栈。一、概念:Java虚拟机栈,早期也叫Java 栈。每个线程都在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应着一次次的Java方法调用,是线程私有的。如图:二、生命周期:生命周期和线程是一致的。三、作用:主管java程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回。四、栈的特点(优点)a、栈是一种快原创 2021-03-24 22:43:35 · 153 阅读 · 0 评论 -
JVM之程序计数器
将class 文件加载到内存中后,会在内存中生成一个运行时数据区,如下图:这篇主要讲解程序计数器概念:a、它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。b、在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。c、任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法,程序计数器会存储当前线程正在执行的Java 方法的JVM指令地址;或者,如果是在执行native方法,则是未指定值。例子:反编译:原创 2021-03-23 22:01:19 · 296 阅读 · 0 评论