
源码阅读
文章平均质量分 85
码农包工头
硕士
java开发11年
大数据开发6年
深度网络开发2年
研发总监
人工智能高级开发工程师
展开
-
jvm15版本源码阅读之补充java异常探究
jvm15版本源码阅读之补充java异常探究1 jvm中抛出异常NullPointerException的方法1.1 THROW方法1.2 THROW_方法1.3 THROW_0方法2 jvm中抛出error的分析3 总结 首先,欢庆一下jdk16版本在今天的发行. 从jvm的源码可以看到,其大致分为四大系统:加载系统,栈执行系统,线程模型和错误与异常系统. 从使用者的角度来说,错误和异常系统离日常开发最近,所以这里也详细解析一下java中的错误和异常在jvm源码中对应着什么以及是如何处理的.原创 2021-03-18 18:48:14 · 371 阅读 · 0 评论 -
jvm15版本源码阅读之main方法调用
jvm15源码阅读之main方法调用1 返回之前的方法1.1 返回JNI_CreateJavaVM_inner方法1.2 返回到JavaMain方法2 执行main方法2.1 entry_point3 执行main完毕4 总结 关于初始化的部分已经分析完了,这里回到最初的方法调用中. 之前的启动并初始化vm是在Threads::create_vm方法中实现的,该方法在JNI_CreateJavaVM_inner中,回到该方法.1 返回之前的方法1.1 返回JNI_CreateJavaVM_原创 2021-03-11 17:32:01 · 461 阅读 · 0 评论 -
jvm15版本源码阅读之从init_globals之后到初始化结束
jvm15版本源码阅读之从init_globals之后到初始化结束1 从init_globals之后到宏结束1.1 main_thread->cache_global_variables1.2 HandleMark hm1.3 MutexLocker mu1.4 Threads::add1.5 VMThread::create1.6 Thread* vmthread = VMThread::vm_thread1.7 os::create_thread1.8 os::start_thread1.9 Un原创 2021-03-10 13:30:56 · 1200 阅读 · 0 评论 -
jvm15版本源码阅读之从universe_init 到init_globals的剩余部分
jvm15版本源码阅读之从universe_init到init_globals的剩余部分1 从universe_init开始到init_globals结束1.1 gc_barrier_stubs_init1.2 interpreter_init_stub1.3 accessFlags_init1.4 InterfaceSupport_init1.5 universe2_init1.6 javaClasses_init1.7 interpreter_init_code1.8 invocationCounte原创 2021-03-09 15:16:51 · 552 阅读 · 0 评论 -
jvm15版本源码阅读之init_globals中universe_init的初始化
jvm15版本源码阅读之init_globals中universe_init的初始化1 universe_init初始化1.1 initialize_global_behaviours1.2 GCLogPrecious::initialize1.3 GCConfig::arguments()->initialize_heap_sizes1.4 Universe::initialize_heap1.5 Universe::initialize_tlab1.6 Metaspace::global_init原创 2021-03-09 13:46:18 · 558 阅读 · 0 评论 -
jvm15版本源码阅读之从init_globals开始到universe_init之前
jvm15版本源码阅读之从init_globals开始到universe_init之前1 初始化1.1 management_init1.2 bytecodes_init1.3 classLoader_init111.4 compilationPolicy_init1.5 codeCache_init1.6 VM_Version_init1.7 stubRoutines_init11.8 universe_init2 小结 init_globals是最核心的初始化方法,几乎包括了所有的jvm核心系统,原创 2021-03-08 15:49:15 · 441 阅读 · 0 评论 -
jvm15版本源码阅读之宏开始初始化到init_globals之前
jvm15版本源码阅读之宏开始初始化到init_globals之前1 宏之后到init_globals之前的初始化方法1.1 SafepointMechanism::initialize1.2 ostream_init_log1.3 Arguments::init_libraries_at_startup1.4 Arguments::init_agents_at_startup1.5 vm_init_globals1.6 JavaThread* main_thread = new JavaThread()1原创 2021-03-07 16:04:03 · 621 阅读 · 0 评论 -
Jvm15版本源码阅读之宏开始之前的初始化方法
Jvm15版本源码阅读之宏开始之前的初始化方法1 宏开始之前的关于系统的初始化方法1.1 VM_Version::early_initialize1.2 ThreadLocalStorage::init1.3 ostream_init1.4 Arguments::process_sun_java_launcher_properties1.5 os::init1.6 create_vm_timer.start1.7 Arguments::init_system_properties1.8 JDK_Versio原创 2021-03-07 10:56:08 · 456 阅读 · 0 评论 -
jvm15源码阅读之vm创建和初始化操作列表
jvm15源码阅读之vm创建和初始化操作列表1 InitializeJVM方法2 Threads::create_vm方法3 vm创建初和始化的初步逻辑梳理4 后续安排 这里承接之前的前奏部分,在JavaMain方法中进行jvm创建和初始化的初步解析.1 InitializeJVM方法 此方法是初始化jvm的核心方法,很多需要初始化的操作都在此方法内完成. 进入此方法后,主要做的就是创建jvm,是由CreateJavaVM方法来完成的.可见,初始化就包含在内了.此处该方法就是之前的通过链接动原创 2021-03-06 19:21:35 · 489 阅读 · 0 评论 -
jvm15版本源码阅读之进入主体程序的前奏
jvm15版本源码阅读之进入主体程序的前奏1 调试2 进入主体程序2.1 启动并初始化jvm2.2 JavaMain方法3 小结) 首先对之前的三篇文章做一个总结,这三篇都是正式进入jvm主程序的铺垫,和之前java代码的阅读明显复杂了很多. 在正式进入jvm15版本的正式代码之前,首先为阅读源码做了准备说明,介绍了jvm的主要运行逻辑.其次说明了本地编译该版本的过程,并导入到clion编辑器中.最后解释了在使用java命令时,是怎么找到主体程序的入口的.这些都是铺垫,为之后的源码解析做准备.原创 2021-03-05 16:06:42 · 357 阅读 · 0 评论 -
jvm15版本源码阅读之make定位程序入口
jvm源码阅读流之make1 bash configure做了什么1.1 make/autoconf/configure2 bash make做了什么2.1 make3 java可执行文件是由哪些source文件生成4 真正的程序入口5 总结 Jvm的编译依然是cpp的传统编译模式,使用了autoconf生成configure脚本,通过执行configure脚本来生成各个目录或自工程的makefile文件,有了makefile文件执行gun的make命令,生成最终的可执行文件. 这个过程都知道,对原创 2021-03-04 17:56:39 · 534 阅读 · 1 评论 -
jvm15版本源码阅读之本地编译
jvm源码阅读之本地编译1 编译1.1 编译流程1.2 导入到clion2 调试设置3 总结 这里对openjdk的15版本进行本地的编译,然后说明一下调试的设置.1 编译 由于编译后是要导入clion中的,所以这里参考jetbrain的一篇专门介绍编译jdk并导入clion的文章,该文章的地址为: https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/1.1 编译流程 1 下载源码 首先下载15版本的源码,gith原创 2021-03-03 21:20:34 · 413 阅读 · 1 评论 -
jvm15版本源码阅读准备说明
jvm源码阅读准备说明1 jvm执行java class文件的执行流程2 jvm源码整体结构3 调试4 关于make目录的说明 之前已规划过,在大数据相关源码阅读解析完之后会进行jvm源码的分析,这里给出jvm源码的阅读之前的准备. 调试的主要ide工具为clion,最新版本的,其余的会在编译章节中详细给出.1 jvm执行java class文件的执行流程 Jvm主要是用c++编写的,外加少量的c和汇编,那么首先需要弄清楚的就是jvm是如何执行class文件的. Jvm首先把java源码原创 2021-03-03 19:48:13 · 562 阅读 · 2 评论 -
Flink-1.12.1源码阅读之精确一次消费
Flink-1.12.1源码阅读之精确一次消费1 关于精确一次消费的解释2 flink二阶段提交的实现2.1 TwoPhaseCommitSinkFunction类概述2.2 FlinkKafkaProducer类解析2.3 小结3 补充说明4 总结 flink中精确一次消费的范畴要比普通的诸如spark streaming,kafka来的更广泛,而且flink确实是这么做的. Flink提供了基于二阶段提交的分布式锁,可拿来直接使用,也是相当便捷的,但是这种使用也是有前提的.1 关于精确一次消原创 2021-02-19 13:01:25 · 861 阅读 · 0 评论 -
Flink-1.12.1源码阅读之table
Flink-1.12.1源码阅读之table1 调试2 main方法分析3 对大数据中sql的一些总结4 总结 Flink的核心工程之一便是table,虽然flink不像spark那样有sql专门为一个核心点,但是这个table其实就是sql,就是基于sql来执行流或批处理. Flink和hive一样,使用calcite来解析sql,同时加入了自己的一些额外的优化,至于calcite是如何解析sql的这里不再展开,可以参照其apache的官网,上面有详细的解释.所以这里就是类似于解释spark的s原创 2021-02-19 12:51:53 · 500 阅读 · 0 评论 -
flink-1.12.1源码阅读之计算流程
flink-1.12.1源码阅读之计算流程1 调试2 flink流计算的整体概述2.1 flink流计算相关的任务概念2.2 flink流计算相关的阶段概念3 第一个断点fromElements方法4 第二个断点execute方法4.1 getStreamGraph方法4.2 execute(StreamGraph)方法4.3 getJobGraph方法4.4 submitJob方法4.5 生成executionGraph4.6根据executionGraph执行task4.7 flink的rpc4.8 s原创 2021-02-17 19:04:18 · 518 阅读 · 0 评论 -
flink-1.21.1源码阅读之内存管理
flink-1.21.1源码阅读之内存管理1 flink内存设计的显著之处1.1 分页内存设计1.2 自定义序列化1.3 直接操作二进制数据2 源码参照2.1 MemoryManager2.2 MemorySegment3 结论 Flink的内存管理设计的主要目标是不进行jvm的full-gc,甚至尽量少的进行young-gc,所以如果不发生full-gc,那么基本不会出现oom. Spark的内存管理也是借鉴了flink的内存设计,所以目前为止,在大数据计算领域,可以说flink的内存设计是最好原创 2021-02-16 11:25:30 · 210 阅读 · 0 评论 -
Flink-1.12.1源码阅读说明
Flink-1.12.1源码阅读说明1 核心概念1.1 内存管理1.2 流处理过程1.3 连接器1.4 分布式锁实现精准一次消费2 编译和调试1.1 编译1.2 调试3 主要工程简介 Flink的源码极其多,是目前所看到的最多的,子工程有186个,源码目测超过300万行,所以对其解析要有重点和主次之分,这里也是围绕一些核心概念对其展开解析.1 核心概念1.1 内存管理 这个是重中之重,也是flink的精华,可以说,任何大部分的计算都是基于此完成的,这里会详细分析.1.2 流处理过程 Fl原创 2021-02-15 12:00:55 · 555 阅读 · 0 评论 -
spark-3.0.1源码阅读之流处理
spark-3.0.1源码阅读之流处理1 spark流处理框架简要说明1.1 微批处理方式1.2 结构化流处理方式2 spark sql VS mysql sql2.1 mysql的sql解析和执行2.2 spark的sql解析和执行2.3 小节3 调试的代码4 结构化流飞快的原因分析4.1 ContinuousExecution类解析4.2 MicroBatchExecution类解析4.3 原因分析5 结论 Spark的流处理从2.0开始就使用结构化流处理的模式,之前的微批处理模式已经不在跟新了,原创 2021-02-11 18:42:34 · 549 阅读 · 0 评论 -
spark-3.0.1源码阅读之内存管理
spark-3.0.1源码阅读之内存管理1 内存管理的由来1.1 shuffle需要1.2 cpu的瓶颈2 内存管理解析2.1 管理谁的内存2.2 内存管理的顶层设计2.3 内存管理的实现3 源码参照3.1 计算区3.2 存储区4 总结 Spark的内存管理比较庞大,内部分类也比较细致,所以对这部分的理解最重要的就是要弄清楚这些庞大又细致的设计和实现的来龙去脉,它们从哪里来,要实现什么目的,是怎样实现的问题. 如果弄明白了上述这些问题,再回过头来看源码就一目了然了,甚至是只看类名或方法名就能猜到其原创 2021-02-10 16:53:36 · 472 阅读 · 0 评论 -
spark-3.0.1源码阅读之文件数据计算的补充内容
spark-3.0.1源码阅读之文件数据计算的补充内容1 数据读入时的分片处理1.1 defaultMinPattions分析1.2 分片数分析2 令人迷惑的shuffle2.1 mr和spark的计算目的2.2 shuffle之于mr和spark2.3 mr的shuffle的作用2.4 spark的shuffle的作用3 总结 之前对计算部分的主要代码进行了分析,但是一些重要的细节没有展开来说,本人思量了一下,在这里对其给出补充. 这里主要以hadoop为例,说明一下spark的分片处理和shu原创 2021-02-08 17:47:58 · 162 阅读 · 1 评论 -
spark-3.0.1源码阅读之文件数据计算
spark-3.0.1源码阅读之文件数据计算1 调试1.1 makeRDD方法1.2 saveAsTextFile方法1.3 collect方法2 关于executor的最大并行度的说明3 总结 Spark作为分布式的计算引擎,本身并不存储要计算的数据源,需要使用外部的数据,所以这些外部数据接入spark的方式也不同.在接入数据后,spark使用自身的一套计算模式,对数据进行计算,并输出到目标目录中.1 调试 使用core子工程下的测试类FileSuite,使用第一个test("text fil原创 2021-02-07 19:38:57 · 257 阅读 · 0 评论 -
spark-3.0.1源码阅读说明
spark-3.0.1源码阅读说明1 围绕核心概念展开阅读1.1 spark批处理1.2 spark流处理2 调试3 额外补充 Spark是继hadoop的mr计算模式之后的内存计算引擎,号称比mr快100倍,同时也使用了多个第一次出现的概念,比如dag等,同时spark也开创了“移动数据不如移动计算”的计算理念.综合多方面来看,spark可以说是目前大数据计算引擎的首选,因此对于它的源码,在阅读时也遵循一定的逻辑. 6年前本人就阅读过spark的源码,那时还是1.5.2版本,如今已来到3.0版本原创 2021-02-05 18:11:17 · 503 阅读 · 0 评论 -
kafka-2.6.0源码阅读
kafka-2.6.0源码阅读1 调试类代码修改2 生产者源码2.1 runOnce方法2.2 sendProducerData方法2.3 poll方法3 broker工作流程解析3.1 broker和kafka server的概念说明3.2 KafkaServer启动的线程3.3 broker接收请求及处理流程3.4 调试4 消费者5 总结 在其源码阅读说明中已经大致给出了相关的梳理,这里结合测试类来进行具体的调试.1 调试类代码修改 调试类之前已说过,使用的是KafkaServerTestH原创 2021-01-27 14:00:41 · 229 阅读 · 0 评论 -
kafka-2.6.0源码阅读说明
kafka-2.6.0源码阅读说明1 消息系统和文件系统的对比1.1 共同点1.2 差异2 kafka整体逻辑说明2.1 生产者2.2 代理人2.3 消费者3 调试4 额外计划1 消息系统和文件系统的对比1.1 共同点 Io是这两者最大的共同点.不论是消息系统还是文件系统,在io上都有着极高的需求,但是侧重点不同.1.2 差异 1 io差异 首先,在io上,消息系统更加频繁的使用网络io,而不是硬盘io.kafka的设计中最重要的就是网络io,使用了零拷贝技术,使得拷贝数据的次数降到了2原创 2021-01-27 13:39:27 · 168 阅读 · 2 评论 -
hbase-2.4.0源码阅读
hbase-2.4.0源码阅读1 调试类及代码更改2 put方法2.1 写入memstore的方法writeMiniBatchOperationsToMemStore3 get方法4 scan方法4.1 getScanner方法4.2 initializeKVHeap方法5 总结5.1 写和读数据的逻辑流程5.2 不高效的写数据流程5.3 不高效的读数据流程 Hbase的主要操作有put,get和scan,这里主要针对这三种操作进行源码的解读.整体上看hbase是简单的,因为不涉及复杂的查询逻辑,作为原创 2021-01-25 16:42:26 · 719 阅读 · 1 评论 -
hbase-2.4.0源码阅读说明
hbase源码阅读说明1 hbase作为数据库的特点1.1 先天缺陷: 缺失核心功能的分布式数据库1.2 主次不分: 为了提升写性能而严重降低读性能1.3 复杂凌乱: 从设计到实现没有一个要突出的主线功能2 源码阅读步骤和逻辑 最初在开始分析hadoop源码时,已做好了后续的源码阅读规划,hbase就是继hadoop之后要分析源码的软件.有关hbase的源码阅读这里要首先明确一下.1 hbase作为数据库的特点 Hbase的全称是hadoop database,是构建在hdfs文件系统之上的数据原创 2021-01-20 15:59:44 · 185 阅读 · 0 评论 -
rpc源码解析
rpc源码解析1 rpc设计和实现逻辑说明1.1 设计1.2 实现2 调试3 总结4 后续安排 如前所述,rpc是hadoop节藕各个功能模块的重要工具,相当于神经系统,串联各部分,使用频次最高,因此可以预见,rpc的设计和实现必然简单高效,不然容易出问题.1 rpc设计和实现逻辑说明1.1 设计 Rpc的设计采用常规远程调用的模式,通过socket和tcp协议,在网络间传输.其独有的特点为使用protocol接口来规定服务端提供的方法,并使用谷歌的protobuf来生成相应的类,这么做可视为原创 2021-01-13 10:46:51 · 495 阅读 · 1 评论 -
yarn和ha从进入到放弃
yarn和ha从进入到放弃1 调试问题1.1 yarn的调试问题1.2 ha的调试问题2 总结 本人主动放弃yarn和ha的解析,不是因为看不懂源码,而是因为不能进行调试.如果不能进行调试,就总感觉离真实的情况有些模糊的距离,这不是阅读源码的初衷.在阅读yarn和ha的源码时,发现了这么一个调试的问题,调试源码的难度大到不可实行,即使使用源码中已有的测试类,也无法达到阅读真实源码的目的,下文会详细的说明.1 调试问题 Yarn和Ha的调试问题并不完全相同.1.1 yarn的调试问题 主要问原创 2021-01-12 13:35:45 · 165 阅读 · 0 评论 -
datanode操作源码-put源码阅读
datanode操作源码-put源码阅读1 调试代码2 整体流程说明3 核心方法3.1 newStreamForCreate()3.2 写数据线程开启3.3 nextBlockOutputStream()3.4 writeBlock()3.5 DataXceiver.run()4 总结4.1 写数据的整体逻辑4.2 监控线程所起到的作用4.3 写数据的具体流程 这里使用和namenode类似的方式,借助MiniCluster进行测试.1 调试代码 添加copyFromLocalFile方法.原创 2021-01-09 14:38:37 · 167 阅读 · 0 评论 -
datanode启动源码
datanode启动源码1 调试代码2 核心方法3 总结 datanode的启动和namenode类似,相对来说也简单一些.1 调试代码 和namenode的调试代码类似,直接在main方法中调用main方法.2 核心方法 Main的调用方法树为: 重要方法为DataNode的构造方法,该构造方法的调用方法树为: 重要方法为startDataNode(),该方法的调用方法树为: 有两个重要的方法,首先是initDataXceiver()方法,该方法是主要的读写执行者,其原创 2021-01-09 13:41:50 · 139 阅读 · 0 评论 -
namenode的操作源码-mkdir源码阅读
namenode的操作源码-mkdir前言1 测试代码2 核心方法3 总结前言 之前的namenode启动源码是直接编写代码完成,在main方法中调用main方法,此处由于要使用rpc,所以使用MiniCluster即行测试.1 测试代码 把test中的TestNameNodeRpcServerMethods类修改一下(该类的具体位置参看前章),去掉单元测试的注解,直接使用main方法进行测试.主体代码如下:2 核心方法 此方法需要和namenode进行rpc,从之前的nnRpc也可以原创 2021-01-09 13:33:12 · 157 阅读 · 0 评论 -
namenode启动源码阅读
namenode启动源码阅读1 编写调试代码2 核心方法2.1 createNamenode方法2.2 FSImage2.3 FSNamesystem2.4 loadFSImage()3 总结 在之前的说明中已介绍了namenode的功能,这里不再过多介绍.1 编写调试代码 根据下图的位置,在test中编写调试的代码. 这里不适用MiniCluster,因为这样在调试的时候可以逐步看到在本地创建的namenode目录,同时在此过程中一些问题也会出现,比如源码中的bug,后面会说到.2 核原创 2021-01-09 13:20:49 · 163 阅读 · 0 评论 -
hadoop3.3.0启动脚本分析
hadoop3.3.0启动脚本分析1 启动start-all.sh2 启动hadoop-config.sh3 启动hadoop-functions.sh4 启动start-dfs.sh4.1 使用hdfs脚本启动namenode4.2 使用hdfs脚本启动datanode4.3 使用hdfs脚本启动secondarynamenode4.4 使用hdfs脚本启动journalnode4.5 使用hdfs脚本启动zkfc5 启动start-yarn.sh6 总结启动顺序和内容1 启动start-all.sh原创 2021-01-09 13:06:05 · 492 阅读 · 0 评论 -
hadoop3.3.0源码阅读说明
hadoop3.3.0源码阅读说明1 hadoop实现逻辑及核心组件1.1 分布式文件存储服务1.2 计算引擎服务2 调试的补充3 MiniCluster的具体效果 这里在《java源码阅读说明》的基础上,需要额外添加一些补充说明. 可以说hadoop是一个大型工程,其包括的子工程超过110个,所以首先要明确一下hadoop的整体实现逻辑及其核心部件,这样有的放矢,围绕核心展开源码的阅读和解释.1 hadoop实现逻辑及核心组件 简单讲,Hadoop是分布式的文件存储系统,外加具有强健壮性的原创 2021-01-09 12:48:39 · 350 阅读 · 0 评论 -
spring 5 ioc源码解读
spring 5 ioc源码解读容器启动和初始化1 this()方法2 scan()方法3 refresh()方法3.1 finishBeanFactoryInitialization方法3.2 createBeanInstance方法4 总结4.1核心流程总结4.2 核心调用链路容器启动和初始化 建议首先阅读《java源码阅读说明》一文. 从语句 new AnnotationConfigApplicationContext(“com/mycom/cn/config") 开始进入.1 thi原创 2021-01-05 16:08:16 · 131 阅读 · 0 评论 -
java源码阅读说明
java源码阅读说明适合中高级开发人员阅读1 使用调试1.1 源码工程编译1.2 源码工程调试2 使用方法树2.1 使用方法树的原因3 阅读场景简述4 备注适合中高级开发人员阅读 阅读源码的方法有很多,使用的工具也有不少,所以这里首先要说明一下本人采用的源码阅读方法. 如果读者从源码的源头查找过类似hadoop等大型软件启动或运行中的报错,那么对这里采用的源码阅读方法就不会陌生.这里采用的方法就是从查找大型软件源码层面的报错方法中而来的.ide工具使用intellij的最新版本,针对java源原创 2021-01-05 15:32:14 · 181 阅读 · 0 评论