JVM
文章平均质量分 77
阿达King哥
专注JVM原理分析
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JVM原理分析目录
逐步深入JVM核心原理原创 2025-11-07 16:24:23 · 220 阅读 · 0 评论
-
JVM中对于源码中符号的管理
本文探讨了JVM中符号管理的实现机制。首先通过C语言示例说明符号的基本概念和用途,分析了静态语言编译器(gcc)如何处理符号并存储在目标文件的符号表中。然后重点阐述了JVM中的符号管理,指出Java符号在运行时动态生成并存储在元数据区。详细解析了Symbol类的三个关键成员变量:_hash_and_refcount(包含哈希值和引用计数)、_length(符号长度)和_body(符号内容)。文章通过对比静态语言和JVM的符号处理方式,揭示了JVM符号管理的独特设计。原创 2025-12-26 10:41:31 · 659 阅读 · 0 评论 -
JVM的内存管理
摘要: JVM内存管理涉及堆、栈和元数据区域的管理。堆内存通过CHeapObj类使用malloc分配,栈对象随函数栈自动释放。元数据区域(MetaspaceObj)存储Java类信息,采用高效块分配算法管理。JVM通过自定义内存管理类(如SpaceManager和Metachunk)实现精细化内存控制,将管理对象与被管理内存分离。CodeHeap等特殊区域采用独特分配策略,体现了JVM内存管理的复杂性和高效性。 (149字)原创 2025-12-11 16:26:02 · 521 阅读 · 0 评论 -
关于JVM中重定位的问题
文章摘要: 本文探讨了JVM中的重定位问题,将其分为两类:整片代码重定位(代码块移动或替换时更新内存地址)和单个指令重定位(运行时动态确定指令操作数地址)。通过C语言编译示例展示了重定位的基本原理,并分析了HotSpot中的实现机制,包括relocInfo类记录重定位信息、RelocationHolder管理重定位对象,以及AddressLiteral处理字面地址重定位。文章结合代码片段和架构图,详细说明了重定位值的计算方法和实际应用场景。原创 2025-12-03 15:21:07 · 780 阅读 · 0 评论 -
JVM堆的管理者——CodeCache
JVM中的CodeCache是用于存储JIT编译生成的本地代码的内存区域。本文分析了CodeCache的关键实现细节原创 2025-11-06 15:30:16 · 311 阅读 · 0 评论 -
CodeBuffer与CodeBlob
本文分析了HotSpot虚拟机中的CodeBuffer和CodeBlob组件。CodeBuffer作为指令生成的临时缓冲区,包含consts、insts和stubs三个CodeSection。生成后的指令会先存放在CodeBuffer中,经过优化后才会存入永久内存CodeBlob。CodeBlob是二进制对象的管理者,根据编译等级(Level 0-4)分为MethodNonProfiled、MethodProfiled等不同类别。文章详细介绍了CodeBlob的内存布局,包含_code_begin、_cod原创 2025-11-05 16:19:38 · 623 阅读 · 0 评论 -
openjdk底层(hotspot)汇编指令的内存分布
本文介绍了内存分段机制及其在JVM中的实现。通过CodeSection类模拟内存中的段结构,详细说明了其关键属性如_start、_end、_limit等的作用。在JVM中,CodeBuffer类用于管理不同类型的CodeSection(常量段、指令段、桩代码段),并展示了指令插入指令段(_insts)的具体过程。文章还通过gdb调试示例,演示了如何在实际运行中查看CodeSection的内存布局,说明其起始地址对齐和段长度设计对CPU访存性能的优化。原创 2025-05-25 23:04:03 · 939 阅读 · 0 评论 -
openjdk底层(hotspot)汇编指令调用(五)——内存访问
在aarch64架构下,src\hotspot\cpu\架构文件夹中的文件如assembler_xx.hpp和register_xx.hpp等,主要涉及寄存器定义和汇编编码函数的实现。文章进一步探讨了计算机中寄存器和内存之间的数据访问方式,特别是在x86架构下的访存模型。通过具体示例,如movl %rdi, (%rbp),展示了如何将寄存器中的数据存储到内存中,或从内存加载数据到寄存器。此外,文章还介绍了x86架构中的基地址、变址和比例因子等概念,并说明了如何在hotspot的x86访存模型中通过Addre原创 2025-05-20 11:01:00 · 607 阅读 · 0 评论 -
openjdk底层(hotspot)汇编指令调用(四)——发送指令到内存
文章主要讨论了JVM如何将指令发送到代码段中执行。首先,JVM通过软件模拟计算机行为,将内存分为数据段和代码段。在指令编码完成后,JVM通过assembler_aarch64.hpp文件中的add函数将指令发送到代码段。原创 2025-05-15 11:43:33 · 542 阅读 · 0 评论 -
openjdk底层(hotspot)汇编指令调用(三)——编码
本文以AArch64架构的add x0,x1,x2指令为例,详细介绍了如何实现指令编码。原创 2025-05-13 16:55:22 · 531 阅读 · 0 评论 -
openjdk底层(hotspot)汇编指令调用(二)——寄存器定义
通过面向对象编程思想,定义了寄存器类和汇编器类,分别用于管理寄存器的名称、值以及汇编指令的编码规则。为了支持多平台,OpenJDK在share/asm目录下抽象了寄存器和汇编器的基类。原创 2025-05-12 10:13:37 · 1123 阅读 · 0 评论 -
openjdk底层(hotspot)汇编指令调用(一)——汇编指令及指令编码基础
计算机通过识别0和1的电信号执行指令,早期程序员直接使用二进制编程,但易出错且不便记忆。为此,厂商定义了汇编指令,如x64平台的push %rbx对应二进制0x53。原创 2025-05-11 20:58:23 · 1079 阅读 · 0 评论 -
JVM局部变量表和操作数栈的内存布局
局部变量表(locals)包括了函数内部的临时变量和形参,另外还包括了当前函数的this指针操作数栈实现了Java虚拟机的栈式操作在openjdk的实现中,局部变量表位于解释栈的高地址处,用locals寄存器定位局部变量表并根据偏移值获取值;操作数栈位于解释栈的低地址,用sp寄存器定位实现字节码逻辑。原创 2025-05-07 11:19:12 · 551 阅读 · 0 评论 -
字节,字节码,字节码文件,字节码指令
计算机一般是一个字节一个字节的读取数据,使用字节进行编码符合计算机的读取数据的流程。第三,使用通用的字节码指令针对的是纯软件的虚拟机,其内容与平台无关。因此使用字节码的程序很方便移植,甚至可以说不需要任何操作,直接放在有Java虚拟机的机器上运行即可,实现了。这些字节根据Java虚拟机规范的要求在不同的位置表达不同的意思。由于电路实现上的原因,计算机的计数方式为二进制,即由0和1组成。为了方便的表示字节,一般采用16进制的形式。生成的.class文件为01组成的文件,使用vs code的。原创 2025-04-24 09:43:37 · 1120 阅读 · 0 评论 -
配置openjdk调试环境
如何调试openjdk原创 2025-04-22 21:02:45 · 864 阅读 · 0 评论 -
关于编译和调试OpenJDK的一些问题
由于`OpenJDK`的编译环境是跟操作系统紧密相关的,所以,当分析`OpenJDK`代码的时候,首先应该阅读`README.md`,确定当前阅读的`OpenJDK`能够在哪些环境下进行编译和调试。这里将一些基本需要解决的问题进行阐述。原创 2025-04-21 14:25:11 · 624 阅读 · 0 评论 -
在Ubuntu 18.04下编译OpenJDK 11
链接: https://pan.baidu.com/s/1QAdu-B6n9KqeBakGlpBS3Q 密码: 8lho不同版本的jdk会要求在不同版本的Ubuntu下编译,不要用太高版本的Ubuntu或者gcc,特别是gcc,这个跟glibc的版本还绑定,如果gcc版本太高,则glibc版本也高,也会影响openjdk的编译。gcc7,freetype2可以直接使用apt-get install安装先configure,再makeconfigure可以参考openjdk/doc/building.htm原创 2025-04-21 13:50:36 · 621 阅读 · 0 评论 -
Java虚拟机(JVM)平台无关?相关?
平台无关是因为其执行过程是由纯软件实现的栈式计算机实现,而平台相关是因为Java虚拟机的具体操作跟平台指令和操作系统相关。不仅如此,为了能够实现**“一次编译,处处执行”**,Java虚拟机还能根据不同的操作系统进行适配,对于有些与操作系统和CPU结合的部分,也提供了不同的实现。所以,如果有程序要实现一个加法,那么在计算机底层执行时,其执行的内容是不一样的。上生成的.class文件,其内容是一样的。Tape是输入数据,Program是针对这些数据进行计算的程序,中间横着的方块表示的是机器的状态。原创 2025-04-17 17:25:21 · 924 阅读 · 0 评论 -
openjdk11 compiling failure undefined JvmtiSampledObjectAllocEventCollector::object_alloc_is_safe_to
【代码】openjdk11 compiling failure undefined JvmtiSampledObjectAllocEventCollector::object_alloc_is_safe_to。原创 2023-05-26 14:34:31 · 213 阅读 · 0 评论 -
Hadoop学习中VMWare的网路配置
Hadoop学习中VMWare的网路配置1 背景为了学习Hadoop,则在自己的机器上模拟构建一个集群环境2 VMWare网络配置步骤首先在VMWare中新建一个网络适配器在VMWare中“编辑”–>“虚拟网络编辑器”–>“添加网络”设置网络设置NAT在Windows的网络连接中设置右键设置IPV4这里表示是Windows的IP,也就是Windows自己有了2个IP,一个是路由器DHCP分配的,一个是自己设置的网络连接的结构是这样的3 VMWare中的Cen原创 2022-03-28 15:59:31 · 2541 阅读 · 0 评论 -
Hotspot中的Arena内存对齐算法
算法分析最近在分析Hotspot的内存代码时,看到如下的宏定义#define ARENA_AMALLOC_ALIGNMENT (2*BytesPerWord)#define ARENA_ALIGN_M1 (((size_t)(ARENA_AMALLOC_ALIGNMENT)) - 1)#define ARENA_ALIGN_MASK (~((size_t)ARENA_ALIGN_M1))#define ARENA_ALIGN(x) ((((size_t)(x)) + ARENA_ALIGN_M1原创 2022-02-14 22:51:27 · 435 阅读 · 0 评论 -
如何把JCK测试集中的程序单独拿出来测试
如何把JCK测试集中的程序单独拿出来测试以brkp00102课题为例1 在IDEA中建立工程找到课题在JCK测试集中的位置,将对应的文件夹拷贝到需要单独进行调试的位置cp $HOME/src/java/jck8b/JCK-runtime-8b/tests/vm/jvmti/Breakpoint/brkp001/brkp00102 $HOME/src/java/然后使用IDEA在此文件夹下建立工程2 根据源码修改文件夹打开brkp00102.java文件可以看到下面的代.原创 2021-07-27 14:19:25 · 573 阅读 · 0 评论 -
碰到调试JNI_CreateJavaVM时SIGSEGV fault错误的解决方案
调试时出现 Signal received: SIGSEGV (Segmentation fault) 比较烦。在 jni.cpp 的 JNI_CreateJavaVM 设置断点调试。不同 jdk 版本路径不同。(https://www.jianshu.com/p/fc8f223a3f1b)这是因为:测试本来就是要触发SIGSEGV的。而GDB在调试的时候会在程序注册的signal handler之前先获取到signal,要continue才会跑到应用注册的signal handler去。解决方原创 2020-09-04 17:07:08 · 2270 阅读 · 5 评论
分享