![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
深入理解Java虚拟机
文章平均质量分 91
小熊学Java
2年互联网金融方面的工作经验,CSDN Java领域优质创作者,阿里云社区博客专家,51CTO博客专家博主,担任过项目技术负责人,目前专攻于Java领域,也是全栈工程师哦!
展开
-
使用线程池比手动创建线程好在哪?
今天聊一聊为什么使用线程池比手动创建线程要好,具体好在哪里?原创 2024-03-15 00:10:20 · 1057 阅读 · 0 评论 -
案例分析:分库分表后,我的应用崩溃了
今天以 Spring Boot 项目常见的分层结构,介绍了每一层可能会引起的内存问题,我们把结论归结为一点,那就是保持输入集或者结果集的简洁。一次性获取非常多的数据,会让中间过程变得非常不可控。最后,我们分析了一个驱动层的数据库中间件,以及对内存使用的一些问题。很多时候我们把这些耗时又耗内存的操作,写了非常复杂的 SQL 语句,然后扔给最底层的数据库去解决,这种情况大多数认为换汤不换药,不过是把具体的问题冲突,转移到另一个场景而已。原创 2024-03-14 00:00:55 · 864 阅读 · 1 评论 -
遇到问题不要慌,轻松搞定内存泄露
今天介绍了很多 Linux 命令,用于定位分析问题,所有的命令都是可以实际操作的,能够让你详细地把握整个 JVM 乃至操作系统的运行状况。其中,jinfo、jstat、jstack、jhsdb(jmap)等是经常被使用的一些工具,尤其是 jmap,在分析处理内存泄漏问题的时候,是必须的。同时还介绍了保留现场的工具和辅助分析的方法论,遇到问题不要慌,记得隔离保存现场。接下来我们看了一个实际的例子,由于 SWAP 的启用造成的服务卡顿。SWAP 会引起很多问题,在高并发服务中一般是关掉它。原创 2024-01-16 22:17:06 · 880 阅读 · 0 评论 -
今天我们深刻认识一下 Java虚拟机的程序计数器
JVM中的程序计数寄存器(Program Counter Register)中, Register 的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。我们都知道所谓的多线程在一个特定的时间段内只会执行其中某一个线程的方法,CPU会不停地做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢?这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子) ,并且也不容易引起一些不必要的误会。原创 2023-12-14 14:58:08 · 116 阅读 · 0 评论 -
JVM类加载器ClassLoader的源码分析
在JDK1.2之前,在自定义类加载时,总会去继承ClassLoader类并重写loadClass方法,从而实现自定义的类加载类。但是在JDK1.2之后已不再建议用户去覆盖loadClass()方法,而是建议把自定义的类加载逻辑写在findClass()方法中,从前面的分析可知,findClass()方法是在loadClass()方法中被调用的,当loadClass()方法中父加载器加载失败后,则会调用自己的findClass()方法来完成类加载,这样就可以保证自定义的类加载器也符合双亲委托模式。原创 2023-12-09 22:50:38 · 248 阅读 · 0 评论 -
JVM 虚拟机 类的加载器分类与测试详解
启动类加载器(引导类加载器,Bootstrap ClassLoader)这个类加载使用C/C++语言实现的,嵌套在JVM内部。它用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar或sun.boot.class.path路径下的内容)。用于提供JVM自身需要的类。并不继承自java.lang.ClassLoader,没有父加载器。出于安全考虑,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类。原创 2023-12-08 14:16:13 · 252 阅读 · 0 评论 -
JVM 类的加载器的基本特征和作用
每一个类加载器,都拥有一个独立的类名称空间:比较两个类是否相等,只有在这两个类是由同一个类加载器加载的前提下才有意义。否则,即使这两个类源自同一个Class文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那这两个类就必定不相等。:则是不直接在代码中调用ClassLoader的方法加载class对象,而是通过虚拟机自动加载到内存中,如在加载某个类的class文件时,该类的class文件中引用了另外一个类的对象,此时额外引用的类将通过JVM自动加载到内存中。类加载器是 JVM 执行类加载机制的前提。原创 2023-12-07 22:31:41 · 520 阅读 · 0 评论 -
面试官:Java 类的加载过程(生命周期)分为哪几步?
Java全能学习面试指南:https://javaxiaobear.cn说说类加载分几步?需要什么来进行加载在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。原创 2023-12-03 23:13:49 · 219 阅读 · 1 评论 -
Java Class文件结构细节最全解读
Class文件的结构并不是一成不变的,随着Java虚拟机的不断发展,总是不可避免地会对Class文件结构做出一些调整,但是其基本结构和框架是非常稳定的。魔数Class文件版本常量池访问标识(或标志)类索引,父类索引,接口索引集合字段表集合方法表集合属性表集合这是一张Java字节码总的结构表,我们按照上面的顺序逐一进行解读就可以了。原创 2023-12-01 16:26:41 · 178 阅读 · 0 评论 -
oracle官方的反解析工具:javap详解
比如,你直接javac xx.java,就不会在生成对应的局部变量表等信息,如果你使用javac -g xx.java就可以生成所有相关信息了。它的作用就是根据class字节码文件,反解析出当前类对应的code区(字节码指令)、局部变量表、异常表和代码行偏移量映射表、常量池等信息。解析字节码文件得到的信息中,有些信息(如局部变量表、指令和代码行偏移量映射表、常量池中方法的参数名称等等)需要在使用javac编译成class文件时,指定参数才能输出。javap -l 会输出行号和本地变量表信息。原创 2023-11-29 18:00:11 · 584 阅读 · 0 评论 -
JVM字节码文件的相关概述解读
Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(operand)所构成。虚拟机中许多指令并不包含操作数,只有一个操作码。原创 2023-11-25 20:23:58 · 387 阅读 · 0 评论 -
Java字节码指令集概述及分类详解
Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。Java 虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于 Java 虚拟机采用面向操作数栈而不是寄存器的结构,所以大多数的指令都不包含操作数,只有一个操作码。由于限制了 Java 虚拟机操作码的长度为一个字节(即 0~255),这意味着指令集的操作码总数不可能超过 256 条。原创 2023-11-23 14:21:35 · 283 阅读 · 1 评论 -
了解JVM的相关概述,发现很多全忘了(文末福利)
垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。官方的说明:https://www.oracle.com/cn/java/technologies/javase-downloads.html。Java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。Java不是最强大的语言,但是JVM是最强大的虚拟机。原创 2023-11-21 15:06:49 · 312 阅读 · 0 评论 -
手把手教你模拟JVM内存溢出场景
Java全能学习+面试指南:https://javaxiaobear.cn今天我们主要自己模拟一个 JVM 内存溢出的场景。在模拟 JVM 内存溢出之前我们先来看下这样的几个问题。老年代溢出为什么那么可怕?元空间也有溢出?怎么优化?如何配置栈大小?避免栈溢出?进程突然死掉,没有留下任何信息时如何进行排查?年轻代由于有老年代的担保,一般在内存占满的时候,并没什么问题。但老年代满了就比较严重了,它没有其他的空间用来做担保,只能 OOM 了,也就是发生 Out Of Memery Error。原创 2023-09-18 15:43:25 · 588 阅读 · 0 评论 -
面对突如其来的 GC 问题如何下手解决
或。原创 2023-09-16 19:30:55 · 165 阅读 · 0 评论 -
亿级流量高并发下如何进行估算和调优
提醒一下,你可以算一下我们的 Survivor 区大小,大约是 182MB 左右,如果稍微有点流量偏移,或者流量突增,再或者和其他接口共用了 JVM,那么这个 Survivor 区就已经装不下 Minor GC 后的内容了。但不要忘了,我们还有一个区域叫作 Metaspace,它的容量是没有上限的,但是每当它扩容时,就会发生 Full GC。假如你的内存是无限大的,那么无论是存活对象,还是垃圾对象,都不需要额外的计算和回收,你只需要往里放就可以了。也就是说,我们的流量虽然很多,但大多数都在年轻代就销毁了。原创 2023-09-14 21:24:13 · 173 阅读 · 0 评论 -
大厂面试题:有了 G1 还需要其他垃圾回收器吗?
为了减少这个开销,将内容放入 RSet 的过程是异步的,而且经过了很多的优化:Write Barrier 把脏卡信息存放到本地缓冲区(local buffer),有专门的 GC 线程负责收集,并将相关信息传给被引用 Region 的 RSet。另外,如果应用的内存非常吃紧,对内存进行部分回收根本不够,始终要进行整个 Heap 的回收,那么 G1 要做的工作量就一点也不会比其他垃圾回收器少,而且因为本身算法复杂了,还可能比其他回收器要差。这不是我们的重点,对 G1 详细过程感兴趣的,可以参考纸质书籍。原创 2023-09-13 22:16:32 · 140 阅读 · 0 评论 -
深入剖析:垃圾回收你真的了解吗?
有的对象可能在 Eden 区,有的可能在老年代,那么这种跨代的引用是如何处理的呢?比如,如果幸存区中相同年龄对象大小的和,大于幸存区的一半,大于或等于 age 的对象将会直接进入老年代。是因为几乎所有的垃圾回收器,都是在这些基本思想上演化出来的,如果你对此不熟悉,那么我们后面讲解 CMS、G1、ZGC 的时候,就会有诸多障碍。如果年轻代有对象分配,而且老年代有对象指向这个新对象, 那么这个老年代对象所对应内存的卡页,就会标识为 dirty,卡表只需要非常小的存储空间就可以保留这些状态。原创 2023-09-11 15:30:36 · 105 阅读 · 0 评论 -
得心应手应对 OOM 的疑难杂症
test 函数同时使用了成员变量 a、静态变量 C,以及输入参数 num。我们此时说的函数执行,内存其实就是在虚拟机栈上分配的。下面这些内容,就是 test 方法的字节码。Code:0: aload_04: i2l5: lload_16: ladd10: laddline 13: 0我们介绍一下比较重要的 3 三个数值。首先,注意 stack 字样,它此时的数值为 4,表明了 test 方法的最大操作数栈深度为 4。JVM 运行时,会根据这个数值,来分配栈帧中操作栈的深度。原创 2023-09-07 09:48:07 · 140 阅读 · 0 评论 -
动手实践:从栈帧看字节码是如何在 JVM 中进行流转的
test 函数同时使用了成员变量 a、静态变量 C,以及输入参数 num。我们此时说的函数执行,内存其实就是在虚拟机栈上分配的。下面这些内容,就是 test 方法的字节码。Code:0: aload_04: i2l5: lload_16: ladd10: laddline 13: 0我们介绍一下比较重要的 3 三个数值。首先,注意 stack 字样,它此时的数值为 4,表明了 test 方法的最大操作数栈深度为 4。JVM 运行时,会根据这个数值,来分配栈帧中操作栈的深度。原创 2023-09-06 16:56:20 · 422 阅读 · 0 评论 -
大厂面试题:你不得不掌握的 JVM 内存管理
JVM 的运行时区域是栈,而存储区域是堆。很多变量,其实在编译期就已经固定了。.class 文件的字节码,由于助记符的作用,理解起来并不是那么吃力,我们将在课程最后几个课时,从字节码层面看一下多线程的特性。JVM 的运行时特性,以及字节码,是比较偏底层的知识。本课时属于初步介绍,有些部分并未深入讲解。希望你应该能够在脑海里建立一个 Java 程序怎么运行的概念,以便我们在后面的课时中,提到相应的内存区域时,有个整体的印象。原创 2023-09-05 16:26:54 · 61 阅读 · 0 评论 -
一探究竟:为什么需要 JVM?它处在什么位置?
到这里内容就全部讲完了,今天我们分别从三个角度,了解了 JVM 在 Java 研发体系中的位置,并以一个简单的程序,看了下一个 Java 程序基本的执行过程。我们所说的 JVM,狭义上指的就 HotSpot。如非特殊说明,我们都以 HotSpot 为准。我们了解到,Java 之所以成为跨平台,就是由于 JVM 的存在。Java 的字节码,是沟通 Java 语言与 JVM 的桥梁,同时也是沟通 JVM 与操作系统的桥梁。原创 2023-09-03 18:01:21 · 544 阅读 · 0 评论 -
Java内存溢出的几个区域,注意避坑
在开发过程中,时常会遇到内存溢出的问题,有可能是在生产环境,有的就在开发中,今天就聊一聊内存溢出。存在内存的区域:Java堆溢出虚拟机栈和本地方法栈溢出方法区和运行时常量池溢出本机内存溢出。原创 2022-11-09 08:53:16 · 993 阅读 · 0 评论 -
深入理解Java内存区域(最新版面试题)
JVM(Java Virtual Machine)是用于运行Java字节码的虚拟机,包括一套字节码指令集、一组程序寄存器、一个虚拟机栈、一个虚拟机堆、一个方法区和一个垃圾回收器。JVM运行在操作系统之上,不与硬件设备直接交互。Java源文件在通过编译器之后被编译成相应的.Class文件(字节码文件),.Class文件又被JVM中的解释器编译成机器码在不同的操作系统(Windows、Linux、Mac)上运行。每种操作系统的解释器都是不同的,但基于解释器实现的虚拟机是相同的,这也是Java能够跨平台的原因。原创 2022-11-05 20:57:59 · 522 阅读 · 0 评论