自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 收藏
  • 关注

原创 jdk16全面学习之jls的第十一章Exceptions

jdk16全面学习之jls的第十一章Exceptions1 受检异常2 运行时异常3 小节  异常在java中是很常见的,也是可以直接进行处理的.主要分为受检异常和运行时异常.  受检异常的捕获是按照子类和父类的先后顺序进行的,而运行时异常也是如此,只是更加灵活而已.1 受检异常  调试的代码为:package com.company;import java.io.FileNotFoundException;import java.io.IOException;public class

2021-09-17 09:56:25 166

原创 jdk16全面学习之jls的第十章Arrays

jdk16全面学习之jls的第十章Arrays1 数组的元素类型同样遵循上溯规则2 数组的类型是运行时接口表示3 小结  这一章是关于数组的部分介绍,相对简单一些.主要是数组的类型判断,至于多维数组和数组的初始化,由于比较简单,这里不再详述.1 数组的元素类型同样遵循上溯规则  调试如下简单的代码package com.company;// 定义了point类class Point { int x, y; }//定义了point的子类class ColoredPoint extends

2021-09-15 13:37:45 151

原创 jdk17详解

jdk17详解1 特性2 java或vm的新功能3 vm虚拟机4 调试工具5 工具6 安全7 客户端8 小节  今天是jdk17正式发布的日子,这个版本也是一个lts,与jdk11还是有很大不同的.  之前从2021年4月18号之后就没有再更新文章了,主要是在腾讯的工作涉及到了k8s的云架构设计和开发工作,再者由于本人的技术级别比较高,涉及的技术方面比较广,确实非常忙碌,所以也没有时间来做文章的更新.从今天开始,借着jdk17的发布日,继续来做文章的更新工作.  之前的jdk16的jls已经按照章节对

2021-09-15 13:29:04 3585

原创 jdk16全面学习之jls的第九章Interfaces

jdk16全面学习之jls的第九章Interfaces1 接口的继承没有传递性1.1 方法的重写1.2 继承不可传递1.3 default方法的调用1.4 静态方法无法继承2 注解3 总结  这一章是就是针对接口学习的.之前有过接口的初步学习,这里将深入展开.1 接口的继承没有传递性1.1 方法的重写  与抽象类不同,接口的方法可以任意的重写和改写.编辑如下代码MethodRewrite.javainterface PointInterface { int v = 2; sta

2021-04-18 11:23:32 175 1

原创 jdk16全面学习之jls的第八章Classes[下]

jdk16全面学习之jls的第八章Classes[下]1 构造方法的初始化1.1 默认的初始化方法1.2 内部类的初始化2 实例方法必须在实例化后调用的原则3 属性的初始化4 总结  这是关于classes的最后一部分,主要学习一下类成员的初始化.不同于cpp,java在语言层面并不是任何变量都有默认的初始值,有些可能会报错,同时各类型的成员也要按照一定的顺序完成初始化.1 构造方法的初始化  首先是类的实例构造方法.构造方法本事属于一类方法,如同其它方法一样,也有方法签名.普通的初始化方法较简单,

2021-04-17 15:34:07 102

原创 jdk16全面学习之jls的第八章Classes[中]

jdk16全面学习之jls的第八章Classes[中]1 接口的继承深入2 类成员屏蔽深入2.1 属性的屏蔽深入2.2 方法的屏蔽深入3 小节  关于classes的第二部分主要介绍类的成员,但是首先还是介绍一下接口在继承中的更深入的部分,其次是成员的屏蔽的深入学习.1 接口的继承深入  之前已经有了接口的初步学习,这里再延伸一下.编辑如下代码InterfaceMore.javapublic class InterfaceMore{}interface Frob { float v = 2.

2021-04-17 11:48:15 100

原创 jdk16全面学习之jls的第八章Classes(上)

jdk16全面学习之jls的第八章Classes[上]1 主要内容2 类的划分2.1 abstract2.1 strictfp2.3 final2.4 static3 增强的内部类初步4 接口的使用初步5 小节  这一章是关于类的,内容会很多,主要由是类的不同修饰符所划分的不同的种类,其次是类的成员,最后就是与继承等相关的一些规则.这里首先学习一下类的种类及接口相关的内容.1 主要内容  首先是类的修饰符,包括abstract,final,strictfp和static,由这些修饰符修饰的类也就分成

2021-04-16 12:08:54 130

原创 jdk16全面学习之jls的第七章Packages and Modules

jdk16全面学习之jls的第七章Packages and Modules1 模块系统1.1 模块出现的由来1.2 模块的使用限制1.3 对包进行安全限制1.4 模块的一些使用语法2 总结  这一章主要讲述了包和模块的概念及定义,关于包的东西应该都熟悉,所以这里主要介绍一下模块的概念,相关的用途会在后续章节中给出.1 模块系统1.1 模块出现的由来  和包的作用类似,模块也是容纳文件的一种手段.包作为目录,包含了各种文件,包括java源文件.同样,模块作为容纳文件的容器,也包含包括包在内的各种文件

2021-04-14 14:36:21 136

原创 jdk16全面学习之jls的第六章Names

jdk16全面学习之jls的第六章Names1 主要内容概述2 变量的重名演示3 方法调用规则初步4 总结  这一章与命名空间有关,虽然在java语言层面没有命名空间的概念,但是却有着类似的功能.1 主要内容概述  与类,方法等语句块相关的都会涉及访问权限等问题,这其实就是命名空间的一个子功能.  首先是命名规则,这个一般都知道,没有什特殊的,其次是本地变量和实例变量(其实就是栈和堆的变量)的重名问题,最后就是方法调用的权限与规则.  无论是在cpp还是在jvm中,方法调用都要且必须经过权限的核

2021-04-14 10:21:02 109

原创 jdk16全面学习之jls的第五章Conversions and Contexts

jdk16全面学习之jls的第五章Conversions and Contexts1 转换中的精度丢失2 jvm类型转换规则详述2.1 规则一: 类型和指针分离2.2 规则二: 左值屏蔽右值2.3 规则总结3 总结  这一章其实是对第四章类型变量值的进一步补充,包括了类型转换过程中的精度丢失等.主要分为两部分,一是在转换过程中的精度问题,二是jvm本质的类型转换规则.1 转换中的精度丢失  这里的转换主要针对数值而言,比如float转为int时发生的精度丢失.运行如下代码Float2Int.java

2021-04-13 12:41:58 133

原创 jdk16全面学习之jls的第四章Types, Values, and Variables

jdk16全面学习之jls的第四章Types, Values, and Variables1 主要内容2 数值溢出3 栈上的引用4 泛型5 类型转换初步6 总结  这里首先把intellij的版本升级为2021.1,该版本支持jdk16,之前使用的预览版本可以舍弃了.1 主要内容  关于java的类型,值和变量,之前在cpp的介绍中有介绍,因为jvm是使用cpp编写的,所以在这些方面也是一脉相承的.主要内容有:  1 数值类型的溢出  2 栈上的引用  3 泛型  4 类型转换初步2 数值

2021-04-13 11:13:40 125

原创 jdk16全面学习之jls的第三章lexical Structure

jdk16全面学习之jls的第三章lexical Structure1 核心内容2 代码演示2.1 string literals2.2 text blocks3 总结  此部分为Jls的第三章词法结构的解析.1 核心内容  本章的核心内容是介绍了基于unicode的jvm内部的编码及语法词的读入和解析.  在jvm层面,字符的unicode是按照utf-16来编码的,也是内存存储和执行的基础.输出可以是任何编码形式,没有什么特殊的限制.  源文件通过utf-16的编码后,被不同的分隔符或编译令

2021-03-31 10:54:49 143

原创 Jdk16全面学习之JLS章节说明

Jdk16全面学习之JLS章节说明1 各章节概述1.1 introduction1.2 grammars1.3 lexical structure1.4 types,values and variables1.5 conversions and contexts1.6 names1.7 packages and modules1.8 classes1.9 interfaces1.10 arrays1.11 exceptions1.12 execution1.13 binary compatibility1.

2021-03-30 15:12:12 294

原创 jdk16全面学习说明

jdk16全面学习说明1 代码示例1.1 jdk16下载1.2 intellij学习工程2 学习路线3 总结  开这个系列我也是思考了许久.从2014年3月jdk8出来之后,到现在已经过去了7年,继jdk11这个lts之后,jdk17的lts在今年9月份就要到来.目前广泛使用的jdk8就会逐步进入淘汰的节奏.  在这个节骨眼上,本人还是觉得有必要把jdk16彻底搞明白,作为迎接使用jdk17的前奏,是非常必要的.本人作为一线开发人员,也会从开发的角度全面解析jdk16.  这里全面学习的路线就是严格

2021-03-30 13:27:32 1580

原创 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 215

原创 Jvm15版本源码阅读之补充cpp的一些基本概念

Jvm15版本源码阅读之补充cpp的一些基本概念1 cpp的一些核心概念1.1 类与类型1.2 变量1.3 值1.4 指针1.5 引用1.6 小结2 cpp中的值传递,指针传递和引用传递3 总结  这里主要介绍一下源码中出现较多的cpp的一些核心概念以及java中的报错信息.1 cpp的一些核心概念  在jvm的源码中,常见的就是type*和type&两种类型了,确切说是指针类型和引用类型.这里需要规范一些说法,给出清晰的界限.1.1 类与类型  类这里专指在cpp中以struct或cl

2021-03-17 10:03:05 291

原创 jvm15版本源码阅读之总结

jvm15版本源码阅读之总结1 客观的看待jvm被接受的缘由1.1 java,cpp,c和汇编1.2 小节2 jvm的发展趋势概述3 对jvm的认识和把握3.1 jvm目前的特点3.2 jvm作为产品的内在发展规律4 总结5 后续规划  对于怎么总结jvm15的这个版本的源码,确实需要从大的方面着手思考.  首先就需要从使用者的角度来审视,毕竟jvm作为一款软件类产品,能被多数发开者所接受并使用,这里面的一些缘由需要弄清楚.  其次,源码阅读本身也是多少带有研究或者说挖根刨底性质的工作,在这一过程中

2021-03-15 12:19:59 571

原创 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 287

原创 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 399

原创 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 262

原创 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 254

原创 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 272

原创 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 280

原创 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 212

原创 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 376

原创 jvm15版本源码阅读之进入主体程序的前奏

jvm15版本源码阅读之进入主体程序的前奏1 调试2 进入主体程序2.1 启动并初始化jvm2.2 JavaMain方法3 小结)  首先对之前的三篇文章做一个总结,这三篇都是正式进入jvm主程序的铺垫,和之前java代码的阅读明显复杂了很多.  在正式进入jvm15版本的正式代码之前,首先为阅读源码做了准备说明,介绍了jvm的主要运行逻辑.其次说明了本地编译该版本的过程,并导入到clion编辑器中.最后解释了在使用java命令时,是怎么找到主体程序的入口的.这些都是铺垫,为之后的源码解析做准备.

2021-03-05 16:06:42 314

原创 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 462 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 360 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 431 2

原创 从源码阅读结束后的延伸说起

从源码阅读结束后的延伸说起1 没有细化到每一行解读源码的原因2 后续会分析jvm源码甚至是linux内核源码3 延伸部分3.1 从0到1和从1到1003.2 工作的主动权4 总有一些事会被说起  从hadoop,到hbase,再到kafka,接着是spark和flink,对这些常用的大数据软件都做了涉及核心部分的源码解析,但是都没有精确到每一行的代码分析,这里会先给出这么做的原因.  之后会说明后续要做的事情.近一段时间以来也一直在思考这个问题,这真的比较纠结,即使在工作中也少有这么纠结过.这里还是会

2021-02-24 14:13:02 78

原创 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 672

原创 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 424

原创 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 290

原创 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 169

原创 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 440

原创 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 270

原创 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 305

原创 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 113 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 222

原创 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 363

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除