
JVM从入门到精通
文章平均质量分 91
从基础概念讲解到深入的实践操作,系统地剖析JVM的运行机制和原理。逐一解析JVM中的各个重要概念,包括类加载机制、内存模型、垃圾回收算法等。让我们一起,从入门到精通JVM,拓宽Java技术的知识领域,提升我们的开发能力。
冰点.
《Redis从入门到精通2023版》作者-
日拱一卒无有尽,功不唐捐终入海。路漫漫其修远兮。吾将上下而求索
展开
-
CPU缓存一致性协议剖析
首先,我们需要了解什么是缓存一致性。多处理器系统中的每个处理器都有自己的缓存,用于存储最近使用的数据,以减少内存访问的延迟。然而,这引入了一个问题:当多个处理器修改共享数据时,其他处理器的缓存可能会变得过时。CPU缓存一致性问题主要出现在多核处理器系统中。每个核心都有它自己的缓存,当它们并行处理数据时,如果一个核心修改了它的缓存中的数据,那么其他核心的缓存可能就会变得过时或不一致。解决CPU缓存一致性问题的主要协议有以下几种:虽然这些都是硬件层面的事情,但是我们作为开发者应该要具备这些知识。原创 2023-10-24 22:58:29 · 909 阅读 · 0 评论 -
字节码进阶之java反射的底层实现原理
Java反射的底层实现原理主要涉及到Java的类加载机制和字节码操作。总结起来,Java反射的底层实现原理是通过类加载机制将类的字节码加载到内存中,并通过字节码操作解析和操作类的成员变量、方法和构造方法。这样就实现了在运行时动态地获取和操作类的信息。原创 2023-10-23 23:26:02 · 406 阅读 · 0 评论 -
字节码进阶之JVM Attach API详解
总的来说,JVM的Attach API是一种强大的工具,它为我们提供了许多可能性,使我们能够深入到Java应用程序的运行内部。然而,同时也需要注意其带来的安全和性能问题。希望本篇文章能帮助大家更深入的理解和正确使用JVM Attach API,最大限度地发挥其潜力。原创 2023-10-22 23:57:56 · 980 阅读 · 0 评论 -
字节码进阶之JSR269详解
在Java的世界中,我们经常会听到JSR(Java Specification Requests)的名字。JSR是Java社区的一种提案,它定义了Java平台的各种标准和规范。其中,JSR269(Pluggable Annotation Processing API)是Java 6引入的一项关于注解处理的规范。注解在Java中是一种常见的元数据形式,它可以提供编译时或运行时的额外信息。通过JSR269,开发者可以创建处理器来处理这些注解,并可在编译时生成额外的源代码或做其他处理。原创 2023-10-21 23:58:16 · 877 阅读 · 0 评论 -
字节码进阶之java Instrumentation原理详解
Java Instrumentation是Java API的一部分,它允许开发人员在运行时修改类的字节码。使用此功能,可以实现许多高级操作,例如性能监控、代码覆盖率分析等。通过Java提供的Instrumentation接口,我们能够在运行时改变和监控Java程序,这种能力在许多场景中都非常有用,比如性能调优、故障排查、代码覆盖率分析等。然而,Instrumentation接口的使用和字节码操作本身都是高级主题,需要深入理解JVM和字节码的工作原理。原创 2023-10-21 23:53:20 · 1530 阅读 · 0 评论 -
字节码进阶之ASM字节码操作类库详解
在Java的世界里,一切都围绕着字节码进行。字节码,作为Java源代码到Java虚拟机(JVM)的中间表示,扮演了重要的角色。然而,直接操作字节码并非易事,需要深入理解JVM的工作原理以及字节码的细节。这就是ASM类库登场的地方。ASM是一个在Java中广泛使用的字节码操作和分析框架。它提供了直接操作字节码的能力,从而可以实现一些Java语言本身无法实现或者难以实现的功能。通过使用ASM,开发者可以动态生成类,修改已存在的类,优化代码性能,以及进行深度的代码分析。原创 2023-10-20 23:55:17 · 986 阅读 · 4 评论 -
4.从字节码分析synchronized的实现原理
前几个章节我们了解到Class文件的结构剖析,以及字节码的场景语句的底层原理,以及字节码中的指令的基本含义。本章节我们学以致用,来从字节码层面分析synchronized的实现原理。原创 2023-10-20 10:39:24 · 297 阅读 · 0 评论 -
字节码进阶之Lombok底层原理
例如,我们经常在Java代码中为类的属性生成getter和setter方法,这是一种重复且繁琐的工作。使用Lombok可以极大地简化这个过程。在传统的做法中,我们需要手动为name和age属性生成getter和setter方法,这样的代码既冗长又容易出错。但是,如果我们使用Lombok的@Getter和@SetterGetter;Setter;@Getter@Setter源代码解析:Java编译器首先会解析这段源代码,并生成对应的AST。注解处理:编译器检测到@Getter和。原创 2023-10-16 23:34:58 · 723 阅读 · 0 评论 -
字节码进阶之方法调用指令详解
Java字节码是Java虚拟机(JVM)执行的代码,它是由Java编译器编译Java源代码生成的。字节码可以在任何安装了JVM的平台上运行,这也是Java“一次编写,到处运行”的基础。在字节码中,方法调用指令是一类重要的指令,它用于调用Java方法。方法调用指令主要包括五种:invokevirtual、invokespecial、invokestatic、invokeinterface和invokedynamic。每种指令对应一种特定的方法调用场景。原创 2023-10-16 10:30:00 · 1080 阅读 · 0 评论 -
JVM之class文件结构剖析
在Java编译过程中,源代码首先会被编译器编译成为字节码文件,这些文件的后缀名为.class。然而,尽管.class文件在Java编程中占有重要地位,但是大多数Java开发者对其内部的结构和工作原理并不是非常了解。所以抽时间我整理一下,和大家一起学习进步。本文旨在对Java的.class文件结构进行详细的剖析,让我们一起了解其内部的工作机制。希望大家在阅读本文后, 对Java虚拟机有更多的了解,并在日后的编程工作中更加得心应手。原创 2023-10-15 21:12:00 · 455 阅读 · 0 评论 -
字节码之 Lambda 表达式底层原理
前两章我们了解了JVM之所以夸平台的一个重要特性,字节码指令、并且通过javap反编译了一些常见的java 语句的字节码指令,了解了之所以这些语句举报那样的特性。今天我们从字节码指令层面聊聊Lambda表达式的底层原理。首先我们写一个简单的lambda表达式,并用javap命令反编译成字节码指令。(动态方法调用)是Java 7引入的一个新的字节码指令,目的是为了支持动态类型语言在Java平台上的执行。这个指令特别适用于执行那些在编译时类型未知的方法调用。在Lambda表达式中,原创 2023-10-15 09:39:39 · 565 阅读 · 0 评论 -
字节码学习之常见java语句的底层原理
上一章我们聊了《JVM字节码指令详解》。本章我们学以致用,聊一下我们常见的一些java语句的特性底层是如何实现。原创 2023-10-14 21:11:37 · 443 阅读 · 0 评论 -
JVM字节码指令详解
在我们日常的Java开发中,我们的IDE开发工具会自动的通过编译器将Java代码编译成字节码文件,最后通过JVM来执行这些字节码文件。在这个过程中,一个重要的环节就是Java字节码。Java字节码是Java虚拟机(JVM)可以执行的指令集,它在一定程度上代表了Java的跨平台特性,因为不同的操作系统平台上的JVM都可以执行相同的Java字节码。因此,深入理解Java字节码对于掌握Java的运行机制是非常重要的。在本篇博文中,我将对JVM字节码的基础知识、指令类型、命名规则以及优化策略等方面进行详细的讲解。原创 2023-10-14 20:21:59 · 885 阅读 · 0 评论 -
聊聊JAVA中的锁优化锁升级及其底层原理剖析
在Java中,锁是实现多线程并发控制的一种重要机制。它可以保证多个线程之间安全地访问共享资源,防止数据的不一致性。锁有两种类型:内部锁和外部锁。内部锁是通过synchronized实现的,它可以解决方法或代码块在多线程环境下的同步问题。外部锁则是通过ReentrantLock等类实现的,除了能解决同步问题外,还提供了更多高级功能,如公平锁、非公平锁、条件等待/通知等。锁优化是为了提高系统的并发性能,包括减少锁的竞争、减小锁的粒度、减少锁的持有时间等,以减少线程等待锁的时间,提高系统的吞吐量。原创 2023-10-03 23:40:02 · 624 阅读 · 1 评论 -
自定义热加载:如何不停机实现核心代码更新
Instrumentation是Java语言中的一个API,它提供了一种在程序运行时监测、管理和修改Java字节码的能力。今天我们利用URLClassLoader 写一个简单的工具程序,内置到我们的应用中,方便我们在不停服务的情况下快速在发布环境验证我们的功能或者修复bug.这种方式只是临时更新 JVM 中的字节码,如果应用重启,修改的内容会丢失。因为这种方式可能带来一些风险,所以在生产环境中使用时需要谨慎。Arthas 会立即加载新的 class 文件,你的应用会立即使用新的代码逻辑。原创 2023-09-27 19:26:18 · 493 阅读 · 1 评论 -
java对象半初始化问题是怎么回事
Java对象的创建过程包括内存分配、执行构造方法进行初始化和设置堆内存中的引用地址。在多线程环境下,由于Java内存模型允许指令的重排序,可能导致一个线程看到了另一个线程创建的对象的引用地址,但是这个对象还没有完成初始化。此时,我们称这个对象为半初始化对象。原创 2023-09-25 22:04:17 · 788 阅读 · 3 评论 -
高并发下双重检测锁DCL指令重排问题剖析
双重检查锁定(Double-Checked Locking)是一种并发设计模式,该模式减少了同步的开销,提高了执行效率。该模式通过两次检查锁定,确保被检查的代码的线程安全性。在第一次检查中,如果发现变量不满足条件,才进行加锁操作。然后在锁定的区块内再进行一次检查,如果仍不满足条件,才进行相关操作。指令重排是为了提高处理器性能,允许编译器和处理器调整指令的执行顺序。一旦保证最终执行结果与代码顺序执行的结果一致,即使没有按照代码原有的顺序执行也不影响。volatile是Java提供的一种轻量级的同步机制。原创 2023-09-25 21:31:22 · 1264 阅读 · 0 评论 -
聊聊Hotspot内存屏障如何禁止指令重排
JVM的内存模型,也就是Java内存模型(Java Memory Model,JMM),主要是围绕在并发过程中如何处理原子性、可见性和有序性这三个特性来建立的模型。在Java中,所有实例域、静态域和数组元素都存储在堆内存中,并且在多个线程之间共享。本地变量、方法定义的参数以及异常处理器参数不会在线程之间共享,它们不会有数据竞争的问题。线程对这些共享数据的操作必须通过主内存来协调。线程之间不能直接通信,线程对共享数据的所有读写都必须通过主内存进行。原创 2023-09-22 23:47:50 · 299 阅读 · 5 评论 -
as-if-serial与happens-before原则详解
"as-if-serial"原则是Java内存模型中的一个重要概念。该规则规定:不管怎么重排序(编译期间的重排序,指令级并行的重排序,内存系统的重排序等),(单线程)程序的执行结果不能被改变。编译器、runtime和处理器都必须遵守as-if-serial语义。为了获取更好的性能,编译器和处理器常常会对指令做重排序,但是他们必须遵守数据依赖性,即在不改变单线程程序执行结果的前提下进行指令重排序。int a = 1;//语句1int b = 2;//语句2//语句3。原创 2023-09-21 23:00:03 · 524 阅读 · 0 评论 -
Unable to open socket file: target process not responding or HotSpot VM not loaded
在说问题之前,还是那句话,linux 系统一切皆文件。之所以这个错误,那肯定是某些文件有问题。经过查阅相关资料了解到如下:1.java进程在启动时,在%TEMP%/hsperfdata_%USERNAME%路径下创建进程的临时文件。%TEMP% 在windows系统中表示 windows的临时目录。一般在C:\Users\用户名\AppData\Local\Temp %TEMP% 在linux 系统中,一般在/tmp目录下2.java进程创建的临时文件作用存储JVM的运行信息 存储jvm原创 2020-11-25 16:12:24 · 6646 阅读 · 1 评论 -
JVM命令-jcmd
1. jcmd -l 列出当前虚拟机的java进程2.jcmd 进程ID help 列出当前java进程 能使用的jvm指令。这些指令可通过名字就知道是做什么的VM.native_memoryManagementAgent.stopManagementAgent.start_localManagementAgent.startVM.classloader_statsGC.rotate_logThread.printGC.class_statsGC.class_histogramG原创 2020-11-11 14:57:55 · 340 阅读 · 0 评论 -
深入理解下JVM以之JVM性能调优
深入理解JVM的内部原理对于编写高效的Java代码非常重要,它能够帮助我们更好地理解Java程序在运行时的行为,以及如何优化这些行为。希望本篇文章能够帮助你对JVM有更深入的理解。原创 2018-03-13 17:19:55 · 432 阅读 · 0 评论