
JVM
文章平均质量分 72
Shockang
我是Shockang,AI进化比我喝咖啡还快,程序员危机UP!不想被取代,就抱紧读书救命稻草,还能一起边学边吐槽,欢迎来玩!
展开
-
100个问题搞定Java虚拟机
100个问题搞定大数据理论体系1000个问题搞定大数据技术体系原创 2021-05-12 23:52:14 · 16252 阅读 · 26 评论 -
一篇文章理解 Java 中的 Unsafe 类
在本文中,我们将讨论 。该类为我们提供了底层的机制,这些机制旨在仅供核心 Java 库使用,而不是由标准用户使用。首先,为了能够使用 Unsafe 类,我们需要得到一个实例——鉴于该类仅为内部使用而设计,这并不简单。获取实例的方法是通过静态方法 。值得注意的是,默认情况下这将抛出异常:SecurityException。幸运的是,我们可以使用反射获得实例:使用 Unsafe 实例化...原创 2022-07-04 22:50:28 · 524 阅读 · 0 评论 -
如何避免 JVM 内存泄漏?
Java 的核心优势之一是 JVM,这是一种开箱即用的内存管理。从本质上讲,我们可以创建对象,Java 垃圾收集器将负责为我们分配和释放内存。尽管如此,Java 应用程序中仍然可能发生内存泄漏。在本文中,我们将讨论最常见的内存泄漏,了解其原因,并研究一些检测/避免它们的技术。我们还将在整篇文章中使用 Java YourKit 分析器来分析我们运行时的内存状态。内存泄漏的标准定义是当应用...原创 2022-07-04 00:38:46 · 532 阅读 · 0 评论 -
JNI的实现原理是什么?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机正文Java 中 native 方法的底层原理当在 Java 代码中调用这些 native 方法时,Java 虚拟机将通过 JNI,调用至对应的 C 函数(即 native 方法对应的 C 实现)中。Java 中的 native 方法的链接方式一是按照 JNI 的默认规范命名所要链接的 C 函数,并依赖于原创 2021-06-07 22:59:52 · 12579 阅读 · 23 评论 -
volatile 的实现原理是什么?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机正文使用 volatile 有三大理由字分裂(Word tearing)当你的 Java 数据类型足够大(在 Java 中 long 和 double 类型都是 64 位),写入变量的过程分两步进行,就会发生 Word tearing(字分裂)情况。JWM 被允许将 64 位数量的读写作为两个单独的 32原创 2021-06-07 22:58:04 · 12935 阅读 · 28 评论 -
Java虚拟机是怎么实现synchronized的?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机正文Java 虚拟机中 对 synchronized 关键字的实现,按照代价由高至低可分为重量级锁、轻量级锁和偏向锁三种。当 JVM 检测到不同的竞争状况时,会自动切换到适合的锁实现,这种切换就是锁的升级、降级。偏向锁JVM 会利用 CAS 操作,在对象头上的 Mark Word 部分设置线程 ID,以表示原创 2021-06-07 22:55:47 · 35023 阅读 · 21 评论 -
什么是happens-before原则?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机正文happens-before 关系是用来描述两个操作的内存可见性的。如果操作 X happens-before 操作 Y,那么 X 的结果对于 Y 可见。Java 内存模型底层是通过内存屏障(memory barrier)来禁止重排序的。线程内的 happens-before在同一个线程中,字节码的先原创 2021-06-07 22:53:52 · 16069 阅读 · 25 评论 -
主内存和工作内存是什么?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机正文Java内存模型规定了所有的变量都存储在主内存(Main Memory)中。主内存可以类比成物理硬件的主内存,但此处仅是虚拟机内存的部分每条线程还有自己的工作内存(Working Memory)。工作内存可以类比成处理器高速缓存线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝, 线程原创 2021-06-07 22:52:19 · 13714 阅读 · 0 评论 -
什么是Java内存模型?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机正文什么是 Java 内存模型?Java 虚拟机规范中定义了 Java 内存模型(Java Memory Model,JMM)用来屏蔽各种硬件和操作系统的内存访问差异。这样的话,Java程序在各种平台下都能达到一致的内存访问效果。在 Java 前,主流程序语言(如C/C++等)直接使用物理硬件和操作系统的内原创 2021-06-07 22:51:05 · 11504 阅读 · 22 评论 -
final 字段的实现原理是什么?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机正文final实例字段涉及新建对象的发布问题。当一个对象包含 final实例字段时,我们希望其他线程只能看到已初始化的final实例字段。因此,即时编译器会在final字段的写操作后插入一个写写屏障,以防某些优化将新建对象的发布(即将实例对象写入一个共享引用中)重排序至final字段的写操作之前。实例字段的原创 2021-06-07 22:47:23 · 11192 阅读 · 21 评论 -
注解处理器的实现原理是什么?Lombok 的实现原理是什么?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机正文注解处理器的用途定义编译规则,并检查被编译的源文件。修改已有源代码。生成新的源代码。其中,第二种涉及了 Java 编译器的内部 API,因此并不推荐。第三种较为常见,是 OpenJDK 工具 jcstress,以及 JMH 生成测试代码的方式。Java 源代码的编译过程Java 源代码的原创 2021-06-07 22:44:40 · 10848 阅读 · 27 评论 -
在什么情况下对象分配会被优化?JVM中所有的对象只在堆上分配吗?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机正文在回答这个问题前,先要明白 JVM 中创建一个对象要花费什么?可以从时间和空间两个角度来考虑时间new关键字在虚拟机中是怎样的一个过程?JVM构造对象的步骤都有哪些?空间对象在堆内存中的存储布局是怎样的?从上面就可以看出,Java 对象实际上给 JVM 带来了很多负担,也给服务器带来了麻烦原创 2021-06-06 20:26:33 · 10739 阅读 · 23 评论 -
即时编译器的向量化优化是什么?SIMD 到底是什么?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机正文向量化优化借助的是 CPU 的 SIMD 指令,即通过单条指令控制多组数据的运算。它被称为 CPU 指令级别的并行。HotSpot 虚拟机运用向量化优化的方式第一种是使用 HotSpot intrinsic,在调用特定方法的时候替换为使用了 SIMD 指令的高效实现。Intrinsic 属于点覆盖,原创 2021-06-06 20:02:01 · 12144 阅读 · 24 评论 -
在什么情况下循环代码会被优化?JVM 针对循环代码有哪些优化?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机正文循环无关代码外提所谓的循环无关代码(Loop-invariant Code),指的是循环中值不变的表达式。如果能够在不改变程序语义的情况下,将这些循环无关代码提出循环之外,那么程序便可以避免重复执行这些表达式,从而达到性能提升的效果。循环展开另外一项非常重要的循环优化是循环展开(Loop Unroll原创 2021-06-06 19:45:49 · 10995 阅读 · 28 评论 -
即时编译器对于字段读取及存储指令的优化是什么?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机正文字段读取优化即时编译器会优化实例字段以及静态字段访问,以减少总的内存访问数目。具体来说,它将沿着控制流,缓存各个字段存储节点将要存储的值,或者字段读取节点所得到的值。当即时编译器遇到对同一字段的读取节点时,如果缓存值还没有失效,那么它会将读取节点替换为该缓存值。当即时编译器遇到对同一字段的存储节点时,原创 2021-06-06 19:40:48 · 10299 阅读 · 25 评论 -
JDK9 的字符串底层原理是什么?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机正文在 Java 9 之前,字符串是用 char 数组来存储的,主要为了支持非英文字符。然而,大多数 Java 程序中的字符串都是由 Latin1 字符组成的。也就是说每个字符仅需占据一个字节,而使用 char 数组的存储方式将极大地浪费内存空间。Java 9 引入了 Compact Strings 的概念原创 2021-06-06 19:33:23 · 11525 阅读 · 30 评论 -
HotSpot虚拟机中的intrinsic是指什么?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机正文HotSpot 虚拟机将对标注了@HotSpotIntrinsicCandidate注解的方法的调用,替换为直接使用基于特定 CPU 指令的高效实现。这些方法我们便称之为 intrinsic。intrinsic 的实现桩程序,可以在解释执行或者即时编译生成的代码中使用。特殊的 IR 节点。即时编译原创 2021-06-06 19:31:52 · 10859 阅读 · 32 评论 -
一篇文章搞懂逃逸分析,栈上分配,标量替换,同步消除,锁消除之间的区别
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机解答逃逸分析是一种确定对象动态作用域的技术。如果能证明一个对象不会逃逸到方法或线程之外,也就是别的方法或线程无法通过任何途径访问到这个对象,则可以为这个变量进行一些高效的优化。栈上分配、标量替换和同步消除(又叫锁消除),正是基于逃逸分析结果的优化手段。补充逃逸分析逃逸分析是一种确定指针动态范围的静原创 2021-06-06 15:46:13 · 11221 阅读 · 26 评论 -
即时编译器的去虚化是什么?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答什么是去虚化?对于需要动态绑定的虚方法调用来说,即时编译器则需要先对虚方法调用进行去虚化(devirtualize),即转换为一个或多个直接调用,然后才能进行方法内联。怎样去虚化?即时编译器的去虚化方式可分为完全去虚化以及条件去虚化(guarded devirtualization)。完全去虚化原创 2021-05-30 23:27:29 · 10998 阅读 · 34 评论 -
在什么情况下方法调用会被内联?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答方法内联有许多规则。除了一些强制内联以及强制不内联的规则外,即时编译器会根据方法调用的层数、方法调用指令所在的程序路径的热度、目标方法的调用次数及大小,以及当前 IR 图的大小来决定方法调用能否被内联。补充强制内联和强制不内联由 -XX:CompileCommand 中的 inline 指令原创 2021-05-30 23:26:11 · 10865 阅读 · 21 评论 -
什么是方法内联?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答方法内联是指,在编译过程中,当遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段。Java 虚拟机中的即时编译器会使用内联缓存来加速动态绑定。Java 虚拟机所采用的单态内联缓存将纪录调用者的动态类型,以及它所对应的目标方法。当碰到新的调用者时,如果其动态类型与缓存中的类原创 2021-05-30 23:23:31 · 14154 阅读 · 14 评论 -
学习了 Java 虚拟机,你连JVM优化Java代码时做了什么都不知道吗?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答JVM 在对代码执行的优化可分为运行时(runtime)优化和即时编译器(JIT)优化。运行时(runtime)优化运行时优化主要是解释执行和动态编译通用的一些机制,比如说锁机制(如偏斜锁)、内存分配机制(如 TLAB)等。除此之外,还有一些专门用于优化解释执行效率的,比如说模版解释器、内联缓存(i原创 2021-05-30 23:22:04 · 10791 阅读 · 3 评论 -
全网最新最全的Java即时编译器优化手段大全
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答JIT 对 Java 编译的基本单元是整个方法,通过对方法调用的计数统计,甄别出热点方法,编译为本地代码。常见的优化手段有方法内联,去虚化,基于逃逸分析的栈上分配,锁消除和标量替换,字段读取存储优化,死代码消除,和循环优化相关的循环判断外提以及循环剥离,向量化优化,还有HotSpot 虚拟机中的 in原创 2021-05-30 23:19:02 · 45523 阅读 · 37 评论 -
Java 中的编译器分为哪些类型?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答按照《深入理解Java虚拟机:JVM高级特性与最佳实践第3版》的说法,Java 语言的编译器可以分为 3 类:前端编译器作用把 java 文件转变成 class 文件举例JDK 的 Javac、 Eclipse JDT中的增量式编译器(ECJ)JIT编译器(Just In Time Compi原创 2021-05-30 23:09:00 · 12697 阅读 · 33 评论 -
作为 Java 程序员,你连即时编译和分层编译都不知道吗?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答即时编译。这是一项用来提升应用程序运行效率的技术。通常而言,代码会先被 Java 虚拟机解释执行,之后反复执行的热点代码则会被即时编译成为机器码,直接运行在底层硬件之上。即时编译是由方法调用计数器和循环回边计数器触发的。在使用分层编译的情况下,触发编译的阈值是根据当前待编译的方法数目动态调整的。原创 2021-05-29 23:22:36 · 12890 阅读 · 25 评论 -
一篇文章搞懂 JVM 的 profiling 是什么
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答profiling 是指在程序执行过程中,收集能够反映程序执行状态的数据。这里所收集的数据我们称之为程序的 profile。这些 profiler 大多通过注入(instrumentation)或者 JVMTI 事件来实现的。补充profiling 的触发时机通常情况下,解释执行过程中仅收原创 2021-05-29 23:20:38 · 12928 阅读 · 20 评论 -
全网最全的 Java 语法糖指南
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答截止到 JDK8,Java语言中的语法糖一共有 16 种1. 自动装箱/拆箱(基本类型)2. 泛型3. 内部类4. 枚举5. 枚举 switch6. 字符串 switch7. 字符串拼接8. 数值字面量9. 变长参数(可变参数)10. foreach 循环11. 桥接方法12. L原创 2021-05-29 23:18:18 · 21247 阅读 · 28 评论 -
一篇文章搞懂什么是 Java Agent
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答Java Agent 概述Java Agent 本质上是 JDK 提供的一个工具。在 JDK1.5 之后,可以使用 Java Agent 技术构建一个独立于应用程序的代理程序(即Agent)。可以用来协助监测、运行甚至替换其他JVM上的程序。使用它可以实现虚拟机级别的 AOP 功能,比如字节码注入。原创 2021-05-29 23:16:42 · 13838 阅读 · 20 评论 -
有哪些常见的字节码指令?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答Java 方法的栈桢分为操作数栈和局部变量区。通常来说,程序需要将变量从局部变量区加载至操作数栈中,进行一番运算之后再存储回局部变量区中。Java 字节码可以划分为很多种类型,如加载常量指令,操作数栈专用指令,局部变量区访问指令,Java 相关指令,方法调用指令,数组相关指令,控制流指令,以及计算相关原创 2021-05-25 22:59:49 · 11080 阅读 · 31 评论 -
哪些情况下类加载不需要遵守双亲委派模型?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答1. 调用 ClassLoader 的 loadClass()方法2. Java SPI,比如 JDBC,JNDI等3. OSGi补充调用 ClassLoader 的 loadClass()方法由于双亲委派模型在JDK1.2之后オ被引入,而类加载器和抽象类java.lang.Classload原创 2021-05-25 22:57:46 · 11102 阅读 · 35 评论 -
String.intern()是如何实现的?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答直接使用双引号声明出来的String对象会直接存储在常量池中。如果不是用双引号声明的String对象,可以使用String提供的intern方法。intern 方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中补充String.intern()源码注释(JDK8)原创 2021-05-25 22:55:25 · 11858 阅读 · 27 评论 -
双亲委派模型是什么?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答当类加载器(Class-Loader)试图加载某个类型的时候,除非父加载器找不到相应类型,否则尽量将这个任务代理给当前加载器的父加载器去做。使用委派模型的目的1. 避免重复加载2. 保障加载的安全性补充如果要真正理解双亲委派模型,需要理解 Java 中类加载器的架构和职责,至少要懂具体有哪些内原创 2021-05-23 23:30:26 · 10878 阅读 · 25 评论 -
数组类型如何完成类加载?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答数组类本身不通过类加载器创建,它是由Java虚拟机直接创建的。但数组类与类加载器仍然有很密切的关系,因为数组类的元素类型(Element Type,指的是数组去掉所有维度的类型)最终是要靠类加载器去创建,一个数组类(下面简称为C)创建过程就遵循以下规则: 1. 如果数组的组件类型(Compon原创 2021-05-23 23:27:48 · 12568 阅读 · 2 评论 -
类加载的过程是怎样的?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答JVM加载java类就是将字节流(如.class文件,网络传输的字节流)文件加入到内存中的过程,分为以下三步:加载、链接、初始化1. 加载是指查找字节流,并且据此创建类的过程。 加载需要借助类加载器,在 Java 虚拟机中,类加载器使用了双亲委派模型,即接收到加载请求时,会先将请求转发给父类加载器原创 2021-05-23 23:27:05 · 11934 阅读 · 28 评论 -
类加载的时机是什么?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答《Java 虚拟机规范》枚举了下述8种触发情况:1. 当虚拟机启动时,初始化用户指定的主类;2. 当遇到用以新建目标类实例的 new 指令时,初始化 new 指令的目标类;3. 当遇到调用静态方法的指令时,初始化该静态方法所在的类;4. 当遇到访问静态字段的指令时,初始化该静态字段所在的类;5.原创 2021-05-23 23:23:45 · 10892 阅读 · 2 评论 -
一句话搞懂Java中this和super的实现原理
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答在 Java 中,每当一个对象创建后,Java 虚拟机都会给这个对象分配一个指向自身的引用,也就是 this。同时如果对象是子类对象,则还会有一个 super 引用指向当前对象的父类对象。this 的本质是:编译器在调用某个实例方法时,实际上会把当前的实例对象的引用作为第一个参数传递给方法。supe原创 2021-05-23 23:23:10 · 12288 阅读 · 24 评论 -
全网最详细完备的class类文件结构解析
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答Class文件是一组以8位字节为基础单位的二进制流,不同的数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有任何空隙存在。这些数据项目由无符号数和表来存储数据,按照顺序依次是:1. 魔数和Class文件的版本2. 常量池3. 访问标志4. 类索引、父类索引与接口索引集合5. 字段表原创 2021-05-21 23:56:30 · 20373 阅读 · 24 评论 -
JVM是如何实现反射的?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答在默认情况下,方法的反射调用为委派实现,委派给本地实现来进行方法调用。在调用超过 15 次之后,委派实现便会将委派对象切换至动态实现。这个动态实现的字节码是自动生成的,它将直接使用 invoke 指令来调用目标方法。补充方法的反射调用对性能有影响吗?方法的反射调用会带来不少性能开销,原因主要有原创 2021-05-20 00:30:43 · 12192 阅读 · 0 评论 -
JVM是如何处理异常的?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答Java 字节码中,每个方法对应一个异常表。当程序触发异常时,Java 虚拟机将查找异常表,并依此决定需要将控制流转移至哪个异常处理器之中。Java 代码中的 catch 代码块和 finally 代码块都会生成异常表条目。补充异常表在编译生成的字节码中,每个方法都附带一个异常表。异常表中的原创 2021-05-20 00:29:59 · 12827 阅读 · 30 评论 -
Java8的Lambda表达式是如何实现的?
写在前面本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java虚拟机解答在 Java 8 中,Lambda 表达式是借助 invokedynamic 指令来实现的。invokedymaic 指令抽象出调用点的概念,并且将调用该调用点所链接的方法句柄。在第一次执行 invokedynamic 指令时,Java 虚拟机将执行它所对应的启动方法,生成并且绑定一个调用点。之后如原创 2021-05-20 00:29:19 · 11719 阅读 · 22 评论