欢迎来到【开源码教程】【圣诞祝福源码】【mytv下载源码】jvm源码分析-皮皮网网站!!!

皮皮网

【开源码教程】【圣诞祝福源码】【mytv下载源码】jvm源码分析-皮皮网 扫描左侧二维码访问本站手机端

【开源码教程】【圣诞祝福源码】【mytv下载源码】jvm源码分析

2025-01-05 12:20:20 来源:{typename type="name"/} 分类:{typename type="name"/}

1.OpenJDK17-JVM 源码阅读 - ZGC - 并发标记 | 京东物流技术团队
2.各位能推荐一下jvm权威的码分书籍吗?
3.java是如何调用native方法?hotspot源码分析必会技能
4.Jvm-Sandbox原理分析-Sandbox的启动-01
5.慢慢体会jvm中的class文件解析你就懂了

jvm源码分析

OpenJDK17-JVM 源码阅读 - ZGC - 并发标记 | 京东物流技术团队

       ZGC简介:

       ZGC是Java垃圾回收器的前沿技术,支持低延迟、码分大容量堆、码分染色指针、码分读屏障等特性,码分自JDK起作为试验特性,码分开源码教程JDK起支持Windows,码分JDK正式投入生产使用。码分在JDK中已实现分代收集,码分预计不久将发布,码分性能将更优秀。码分

       ZGC特征:

       1. 低延迟

       2. 大容量堆

       3. 染色指针

       4. 读屏障

       并发标记过程:

       ZGC并发标记主要分为三个阶段:初始标记、码分并发标记/重映射、码分重分配。码分本篇主要分析并发标记/重映射部分源代码。码分

       入口与并发标记:

       整个ZGC源码入口是ZDriver::gc函数,其中concurrent()是一个宏定义。并发标记函数是concurrent_mark。

       并发标记流程:

       从ZHeap::heap()进入mark函数,使用任务框架执行任务逻辑在ZMarkTask里,具体执行函数是work。工作逻辑循环从标记条带中取出数据,直到取完或时间到。圣诞祝福源码此循环即为ZGC三色标记主循环。之后进入drain函数,从栈中取出指针进行标记,直到栈排空。标记过程包括从栈取数据,标记和递归标记。

       标记与迭代:

       标记过程涉及对象迭代遍历。标记流程中,ZGC通过map存储对象地址的finalizable和inc_live信息。map大小约为堆中对象对齐大小的二分之一。接着通过oop_iterate函数对对象中的指针进行迭代,使用ZMarkBarrierOopClosure作为读屏障,实现了指针自愈和防止漏标。

       读屏障细节:

       ZMarkBarrierOopClosure函数在标记非静态成员变量的指针时触发读屏障。慢路径处理和指针自愈是核心逻辑,慢路径标记指针,快速路径通过cas操作修复坏指针,并重新标记。

       重映射过程:

       读屏障触发标记后,对象被推入栈中,下次标记循环时取出。ZGC并发标记流程至此结束。mytv下载源码

       问题回顾:

       本文解答了ZGC如何标记指针、三色标记过程、如何防止漏标、指针自愈和并发重映射过程的问题。

       扩展思考:

       ZGC在指针上标记,当回收某个region时,如何得知对象是否存活?答案需要结合标记阶段和重分配阶段的代码。

       结束语:

       本文深入分析了ZGC并发标记的源码细节,对您有启发或帮助的话,请多多点赞支持。作者:京东物流 刘家存,来源:京东云开发者社区 自猿其说 Tech。转载请注明来源。

各位能推荐一下jvm权威的书籍吗?

       推荐JVM权威书籍如下:

       初学者(8本):

       1. 《深入理解Java虚拟机:JVM高级特性与实践(第3版)》

       2. 《深入Java虚拟机(原书第2版)---SUN公司核心技术丛书》

       3. 《实战JAVA虚拟机 JVM故障诊断与性能优化》

       4. 《深入理解JVM & G1 GC》

       5. 《Java虚拟机精讲》

       6. 《自己动手写Java虚拟机》 - 张秀宏,使用Go实现的

       7. 《自己动手写Python虚拟机》

       8. 《深入浅出:Java虚拟机设计与实现》

       进阶者(本):

       1. 《揭秘Java虚拟机:JVM设计原理与实现》

       2. 《虚拟机设计与实现:以JVM为例》

       3. 《Java虚拟机规范-JavaSE8》

       4. 《深入理解JVM字节码/Java核心技术系列》

       5. 《解析Java虚拟机开发--权衡优化高效和安全的最优方案》

       6. 《Java虚拟机基础教程》

       7. 《深入解析Java虚拟机HotSpot》

       8. 《深入理解Android:Java虚拟机ART (Chinese Edition)》

       9. 《JRockit权威指南:深入理解JVM》

       . 《深入Java虚拟机:JVM G1 GC的算法与实现》

       . 《垃圾回收算法与实现》

       . 《HotSpot实战》

       深入者(5本):

       1. 《虚拟机:系统与进程的通用平台》

       2. 《JVM G1源码分析和调优》

       3. 《深入剖析Java虚拟机 : 源码剖析与实例详解(基础卷)》

       4. 《垃圾回收算法手册-自动内存管理的艺术》

       5. 《GraalVM与Java静态编译:原理与应用林子熠》

       这些书籍涵盖了JVM学习的各个方面,从初学者到深入者,适合不同层次的学习者。希望对你有所帮助。

java是如何调用native方法?hotspot源码分析必会技能

       在深入研究JDK源码,如并发包和Thread相关部分时,往往会遇到native修饰的方法,它们隐藏在层层方法的江湖家政 源码底层。native方法的存在并非偶然,它是解决Java语言与操作系统直接交互的关键。Java作为高层语言,需要JVM作为桥梁,将Java指令转换为可以直接操作系统的C或C++代码,这就是native方法的用武之地。

       JDK、JRE和JVM的关系是这样的:JDK包含JRE,其中的JVM负责执行Java代码并进行操作系统间的转换。在OpenJDK源码中,特别是hotspot实现的JVM中,能找到native方法的具体实现。JNI(Java Native Interface)技术用于模拟Java调用C或C++编写的native方法,确保跨平台的兼容性。

       让我们通过实践来理解这个过程。首先,创建一个简单的Java类,通过javac编译,生成JavaCallC.class文件。然后使用javah命令生成JavaCallC.h头文件,这是C语言调用Java的关键部分,需要与Java代码中的指标结合源码native方法签名匹配。接着,编写C代码(Cclass.c),编译成动态链接库libJavaCallC.so,并将库文件路径添加到LD_LIBRARY_PATH环境变量中。

       最后,执行JavaCallC命令,如果一切顺利,会看到"Java_JavaCallC_cMethod call succ"的输出,表明Java成功调用了native方法。在尝试过程中可能会遇到各种问题,但通过一步步的调试和学习,我们可以逐步掌握这个过程。

Jvm-Sandbox原理分析-Sandbox的启动-

       Jvm-Sandbox的启动(一):sandbox.sh脚本分析

       Sandbox的启动是通过其内置的shell脚本 sandbox.sh 开始执行的,一切的开始皆可从该脚本中探寻出结果。脚本有一定的代码量,大概有+行,这里将该脚本分为如下几个部分进行讲解:

1、变量定义过程

       这个过程首先预定义了接下来即将使用的一些变量。代码如下:

# 定义sandbox的home目录,并为其赋值 typeset SANDBOX_HOME_DIR [[ -z ${ SANDBOX_HOME_DIR} ]] && SANDBOX_HOME_DIR=${ PWD}/..# 定义 SANDBOX_USER,并为其赋值 typeset SANDBOX_USER=${ USER} [[ -z ${ SANDBOX_USER} ]] && SANDBOX_USER=$(whoami)# 定义 SANDBOX_SERVER_NETWORK typeset SANDBOX_SERVER_NETWORK# 定义lib目录,这个目录下主要存放jar包 typeset SANDBOX_LIB_DIR=${ SANDBOX_HOME_DIR}/lib# 定义 SANDBOX_TOKEN_FILE typeset SANDBOX_TOKEN_FILE="${ HOME}/.sandbox.token"# 定义JVM参数 SANDBOX_JVM_OPS typeset SANDBOX_JVM_OPS="-XmsM -XmxM -Xnoclassgc -ea"# 定义目标JVM的进程号,后面的agent主要attach到该JVM进程上 typeset TARGET_JVM_PID# 定义目标机器IP以及默认机器IP typeset TARGET_SERVER_IP typeset DEFAULT_TARGET_SERVER_IP="0.0.0.0"# 定义目标进程端口 typeset TARGET_SERVER_PORT# 定义名称空间 typeset TARGET_NAMESPACE typeset DEFAULT_NAMESPACE="default"

       注释和变量命名已经描绘的非常清楚了,在看后面代码遇到忘记了的变量可以到这里来回顾下。

       这里为其中一些变量补充说明:

       SANDBOX_HOME_DIR:shell脚本中,-z表示检测紧跟的字符串长度是否为0,如果为0返回true。这里使用短路与,如果 ${ SANDBOX_HOME_DIR} 为0,则使用 ${ PWD}/.. 的目录作为sandbox的home目录。这种方式表示优先使用环境变量 SANDBOX_HOME_DIR,如果未定义环境变量SANDBOX_HOME_DIR,则使用当前目录。

       SANDBOX_TOKEN_FILE:这个文件主要存放了sandbox attach记录,包括attach进程的host:port。

       TARGET_SERVER_IP:一般情况下,我们都是将整个工程打包后上传至目标机器,然后在目标机器上执行该shell脚本,因此默认机器IP一般为localhost即可。

2、执行入口

       执行入口就比较简单了,就一行代码,其中${ @}会保存我们传递给该shell脚本的所有参数:

main "${ @}"

       比方说,我们以如下命令启动脚本,则${ @} 就包含了-p 这个参数

./sandbox.sh -p 、main函数

       main函数是该脚本的重要方法,也是脚本的执行入口,它主要完成了以下几件事:

       其代码如下所示:

function main() { # 遍历脚本参数 while getopts "hp:vFfRu:a:A:d:m:I:P:ClSn:X" ARG; do case ${ ARG} in h) # 帮助手册函数,大家可以自行翻阅源码查看 usage exit ;; # 赋值PID p) TARGET_JVM_PID=${ OPTARG} ;; v) OP_VERSION=1 ;; l) OP_MODULE_LIST=1 ;; R) OP_MODULE_RESET=1 ;; F) OP_MODULE_FORCE_FLUSH=1 ;; f) OP_MODULE_FLUSH=1 ;; u) OP_MODULE_UNLOAD=1 ARG_MODULE_UNLOAD=${ OPTARG} ;; a) OP_MODULE_ACTIVE=1 ARG_MODULE_ACTIVE=${ OPTARG} ;; A) OP_MODULE_FROZEN=1 ARG_MODULE_FROZEN=${ OPTARG} ;; d) OP_DEBUG=1 ARG_DEBUG=${ OPTARG} ;; m) OP_MODULE_DETAIL=1 ARG_MODULE_DETAIL=${ OPTARG} ;; # 赋值IP I) TARGET_SERVER_IP=${ OPTARG} ;; # 赋值PORT P) TARGET_SERVER_PORT=${ OPTARG} ;; C) OP_CONNECT_ONLY=1 ;; S) OP_SHUTDOWN=1 ;; n) OP_NAMESPACE=1 ARG_NAMESPACE=${ OPTARG} ;; X) set -x ;; ?) usage exit_on_err 1 ;; esac done # 重置环境 reset_for_env # 校验权限 check_permission# 根据不同的参数,进行相应处理 # 如果没有指定IP,则使用默认值 [ -z "${ TARGET_SERVER_IP}" ] && TARGET_SERVER_IP="${ DEFAULT_TARGET_SERVER_IP}"# 如果没有指定port,使用默认值 [ -z "${ TARGET_SERVER_PORT}" ] && TARGET_SERVER_PORT=0# reset NAMESPACE [[ ${ OP_NAMESPACE} ]] && TARGET_NAMESPACE=${ ARG_NAMESPACE} [[ -z ${ TARGET_NAMESPACE} ]] && TARGET_NAMESPACE=${ DEFAULT_NAMESPACE}if [[ ${ OP_CONNECT_ONLY} ]]; then [[ 0 -eq ${ TARGET_SERVER_PORT} ]] && exit_on_err 1 "server appoint PORT (-P) was missing" SANDBOX_SERVER_NETWORK="${ TARGET_SERVER_IP};${ TARGET_SERVER_PORT}" else # -p was missing [[ -z ${ TARGET_JVM_PID} ]] && exit_on_err 1 "PID (-p) was missing." # attach jvm的核心方法 attach_jvm fi# -v show version [[ -n ${ OP_VERSION} ]] && sandbox_curl_with_exit "sandbox-info/version"# -l list loaded modules [[ -n ${ OP_MODULE_LIST} ]] && sandbox_curl_with_exit "sandbox-module-mgr/list"# -F force flush module [[ -n ${ OP_MODULE_FORCE_FLUSH} ]] && sandbox_curl_with_exit "sandbox-module-mgr/flush" "&force=true"# -f flush module [[ -n ${ OP_MODULE_FLUSH} ]] && sandbox_curl_with_exit "sandbox-module-mgr/flush" "&force=false"# -R reset sandbox [[ -n ${ OP_MODULE_RESET} ]] && sandbox_curl_with_exit "sandbox-module-mgr/reset"# -u unload module [[ -n ${ OP_MODULE_UNLOAD} ]] && sandbox_curl_with_exit "sandbox-module-mgr/unload" "&action=unload&ids=${ ARG_MODULE_UNLOAD}"# -a active module [[ -n ${ OP_MODULE_ACTIVE} ]] && sandbox_curl_with_exit "sandbox-module-mgr/active" "&ids=${ ARG_MODULE_ACTIVE}"# -A frozen module [[ -n ${ OP_MODULE_FROZEN} ]] && sandbox_curl_with_exit "sandbox-module-mgr/frozen" "&ids=${ ARG_MODULE_FROZEN}"# -m module detail [[ -n ${ OP_MODULE_DETAIL} ]] && sandbox_curl_with_exit "sandbox-module-mgr/detail" "&id=${ ARG_MODULE_DETAIL}"# -S shutdown [[ -n ${ OP_SHUTDOWN} ]] && sandbox_curl_with_exit "sandbox-control/shutdown"# -d debug if [[ -n ${ OP_DEBUG} ]]; then sandbox_debug_curl "module//post/

慢慢体会jvm中的class文件解析你就懂了

       Java虚拟机(JVM)作为程序执行环境的关键组成部分,通过字节码(Byte Code)实现跨平台特性。字节码是一种特定的二进制文件格式,存储在Class文件中。Java程序首先编译为字节码,而非直接生成平台特定的机器语言。Class文件是平台无关性实现的基础,它使得Java虚拟机能够加载并执行程序,而无需考虑运行环境的差异。

       Class文件为Java程序提供了一种统一的存储格式。每个类对应一个独立的Class文件,即使内部类也是如此,它们各自生成单独的Class文件。这种设计使得Java虚拟机能够专注于加载和解析Class文件,而无需处理特定的源代码格式。其他编程语言可以将代码编译为符合Java虚拟机规范的Class文件,从而实现跨语言运行。

       Java虚拟机并不是直接运行Java程序的,而是通过加载Class文件来执行程序。Class文件包含了程序执行所需的所有信息,包括类的结构、方法、属性等。Java程序和Class文件之间存在着密切的联系,学习Class文件有助于深入了解代码的编译后形态。

       以下是Class文件的解析内容:

       1. Class文件格式:Class文件本质上是一个二进制文件,存储了Java程序的结构化信息。从一个.java文件编译出来的Class文件,可以通过IDE工具如 IntelliJ IDEA查看,展示了一个简单的二进制格式。借助于BinEd插件,可以进一步深入分析Class文件的结构。

       2. Class文件结构:Class文件由多个部分组成,包括通用信息、常量池、接口列表、属性列表、方法列表和附加属性等。这些部分共同描述了类的定义、方法、属性以及相关行为。

       3. 通用信息:包含Java版本、常量池数量、类修饰符、类名、父类名、接口列表数量、属性数量、方法数量等信息。

       4. 常量池:存储了常量、修饰符、方法名、字段名、类型信息等,为解析Class文件提供基础数据。

       5. 接口列表:列出类实现的所有接口的索引。

       6. 属性列表:包括类文件名、内部类列表、方法字节码、异常列表、源码位置关系、局部变量描述以及常量值等详细信息。

       通过解析Class文件,可以深入理解Java程序的编译后形式,以及类、方法、属性等核心元素的结构和功能。这些信息对于开发者来说至关重要,有助于优化代码性能、诊断程序错误以及实现更高级的工具和框架功能。