JDK框架JAVA源码解析
文章平均质量分 93
原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。所以写这个系列来分析下JDK自带的JAVA源码的实现和底层原理,来更好地帮助大家写出高性能的代码
hashcon
做自媒体技术分享很久了,大家的抬爱与支持让我很开心很感激,但是个人本来做这些也并不是为了收益,只是为了个人学习与传播知识帮助更多的人,所以我将全网所有账号全部收益,持续捐给各种公益项目,也算不辜负大家的抬爱,也是回报祖国对我的一番培养。
曾任职于顺丰,华为,网易等公司,从Java小白,成长为资深开发与项目组首席架构师。喜欢源码与开源,曾贡献 MyCat1.6 核心源码,贡献过druid,Spring Cloud,dubbox,Apache RocketMQ,Apache Bookeeper 等多开源项目。
展开
-
为什么我建议线上高并发量的日志输出的时候不能带有代码位置
个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判。如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个github 仓库提交 issue,谢谢支持~本文是“为什么我建议”系列第二篇,本系列中会针对一些在高并发场景下,我对于组内后台开发的一些开发建议以及开发规范的要求进行说明和分析解读,相信能让各位在面对高并发业务的时候避开一些坑。往期回顾:为什么我建议在复杂但是性能关键的表上所有查询都加上 force index在...原创 2022-03-26 08:32:59 · 471 阅读 · 1 评论 -
硬核 - Java 随机数相关 API 的演进与思考(下)
本系列将 Java 17 之前的随机数 API 以及 Java 17 之后的统一 API 都做了比较详细的说明,并且将随机数的特性以及实现思路也做了一些简单的分析,帮助大家明白为何会有这么多的随机数算法,以及他们的设计思路是什么。本系列会分为两篇,第一篇讲述 Java 随机数算法的演变思路以及底层原理与考量,之后介绍 Java 17 之前的随机算法 API 以及测试性能,第二篇详细分析 Java 17 之后的随机数生成器算法以及 API 和底层实现类以及他们的属性,性能以及使用场景,如何选择随机算法.原创 2022-01-11 09:25:40 · 361 阅读 · 0 评论 -
硬核 - Java 随机数相关 API 的演进与思考(上)
本系列将 Java 17 之前的随机数 API 以及 Java 17 之后的统一 API 都做了比较详细的说明,并且将随机数的特性以及实现思路也做了一些简单的分析,帮助大家明白为何会有这么多的随机数算法,以及他们的设计思路是什么。本系列会分为两篇,第一篇讲述 Java 随机数算法的演变思路以及底层原理与考量,之后介绍 Java 17 之前的随机算法 API 以及测试性能,第二篇详细分析 Java 17 之后的随机数生成器算法以及 API 和底层实现类以及他们的属性,性能以及使用场景,如何选择随机算法.原创 2022-01-10 09:43:46 · 580 阅读 · 0 评论 -
JEP解读与尝鲜系列4 - Java 16 中对于 Project Valhalla 的铺垫
这是 JEP 解读与尝鲜系列的第 4 篇,之前的文章如下:JEP解读与尝鲜系列 1 - Java Valhalla与Java Inline classJEP解读与尝鲜系列 2 - JEP 142 缓存行填充简化JEP解读与尝鲜系列 3 - Project Loom 使用虚线程进行同步网络 IO 不阻塞的底层原理在系列之前的第一篇文章 - JEP 解读与尝鲜系列 1 - Java Valhalla 与 Java Inline class 中,我介绍了 Project Valhalla 项目中的.原创 2022-01-06 08:12:13 · 834 阅读 · 1 评论 -
Java 16 中新增的 Stream 接口的一些思考
这里先提一个题外话,如果想看 JDK 不同版本之间有何差异,增加或者删除了哪些 API,可以通过下面这个链接查看:https://javaalmanac.io/jdk/17/apidiff/11/路径中的两个版本就是要对比的两个版本,其界面如下:同时,我们也可以通过 JDK 内置 jdeps 工具查找过期以及废弃API以及对应的替换jdeps --jdk-internals -R --class-path 'libs/*' $projectlibs是你的所有依赖的目录,$project是原创 2022-01-05 09:53:43 · 442 阅读 · 0 评论 -
Java Record 的一些思考 - 序列化相关
Java Record 序列化相关Record 在设计之初,就是为了找寻一种纯表示数据的类型载体。Java 的 class 现在经过不断的迭代做功能加法,用法已经非常复杂,各种语法糖,各种多态构造器,各种继承设计导致针对 Java 的序列化框架也做得非常复杂,要考虑的情况有很多很多。每次 Java 升级,如果对类结构有做改动或者加入了新特性,那么序列化框架就都需要改来兼容。这样会阻碍 Java 的发展,于是设计出了 Record 这个专门用来存储数据的类型。经过上一节的分析我们知道,Record 类型声原创 2022-01-04 08:56:05 · 452 阅读 · 0 评论 -
关于 Spring-WebFlux 的一些想法
本文是本人在知乎提问 spring webflux现在看来是否成功? 下的回答,其他回答也很精彩,如果感兴趣可以查看现在基于 spring web 的同步微服务有一个非常大的缺陷就是:相对于基于 spring-webflux 的异步微服务,基于 spring-web 的同步微服务没有很好的处理客户端有请求超时配置的情况。当客户端请求超时时,客户端会直接返回超时异常,但是调用的服务端任务,在基于 spring-web 的同步微服务并没有被取消,基于 spring-webflux 的异步微服务是会被取消的.原创 2022-01-03 11:30:04 · 871 阅读 · 0 评论 -
JVM 相关 - 深入 JVM 的钥匙 WhiteBox API
什么是 WhiteBox APIWhiteBox API 是 HotSpot VM 自带的白盒测试工具,将内部的很多核心机制的 API 暴露出来,用于白盒测试 JVM,压测 JVM 特性,以及辅助学习理解 JVM 并调优参数。WhiteBox API 是 Java 7 引入的,目前 Java 8 LTS 以及 Java 11 LTS(其实是 Java 9+ 以后的所有版本,这里只关心 LTS 版本,Java 9 引入了模块化所以 WhiteBox API 有所变化)都是有的。但是默认这个 API 并没有编原创 2020-12-25 17:07:54 · 55855 阅读 · 0 评论 -
JVM相关 - StackOverflowError 与 OutOfMemoryError
本文基于 Java 15StackOverflowError 与 OutOfMemoryError 是两个老生常谈的 Java 错误。Java 中的虚拟机错误 VirtualMachineError 包括以下四种:我们比较关心的就是 StackOverflowError 与 OutOfMemoryError,剩下的 InternalError 一般是内部使用错误,UnknownError 是虚拟机发生未知异常,这两种我们这里不讨论。虚拟机规范中的 StackOverflowError 与 Out.原创 2020-10-12 12:05:36 · 1167 阅读 · 0 评论 -
JDK核心JAVA源码解析(9) - hashcode 方法
本文基于 OpenJDK 11, HotSpot 虚拟机在开发过程中我们可能会经常接触到hashcode这个方法来生成哈希码,那么底层是如何实现的?使用时有何注意点呢?hashcode() 方法底层实现hashcode()是Object的方法:@HotSpotIntrinsicCandidatepublic native int hashCode();它是一个native的方法,并且被@HotSpotIntrinsicCandidate注解修饰,证明它是一个在HotSpot中有一套高效的实.原创 2020-09-16 17:44:51 · 2045 阅读 · 1 评论 -
JDK核心JAVA源码解析(8) - 自动封箱拆箱与效率的思考
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本文基于 Java 14在JDK1.5引入自动装箱/拆箱,让开发更高效。自动装箱时编译器调用valueOf()将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值。自动装箱是将 boolean 值转换成 Bo原创 2020-06-16 20:19:38 · 3512 阅读 · 0 评论 -
JEP解读与尝鲜系列2 - JEP 142 缓存行填充简化
本文基于 OpenJDK 8 ~ 14 的版本JEP 142 内容用于将某个或者某些需要多线程读取和修改的 field 进行缓存行填充。同时由于 Java 8 之前对于缓存行填充的方式,比较繁琐且不够优雅,还有可能缓存行大小不一的问题,所以这个 JEP 中引入了 @Contended 注解。什么是缓存行填充以及 False SharingCPU 缓存结构:CPU 只能直接处理寄存器...原创 2020-04-18 15:28:12 · 607 阅读 · 0 评论 -
增强 Stream 接口的 distinct 方法的一些思考
遇到的问题Java 8 开始引入了 Stream, 其中的 api 一直在不断的优化更新完善,Java 9 中更是引入了 ofNullable 还有 takeWhile 和 dropWhile 这两个关键 api。有时候,我们想对 Stream 中的对象进行排重,默认的可以用 distinct 这个 api,例如:List<String> collect = Arrays.stre...原创 2020-04-14 17:59:07 · 1461 阅读 · 1 评论 -
Java新特性快速笔记 - Java 11
Java 11 是 Java 新的版本发布周期公布公布之后的第一个 LTS (长期支持)版本,一共有17个 JEP发布日期: 2018-9-25所有的 JEP 链接地址一些值得关注并且实际使用的新特性:[异步 HTTPClien](https://openjdk.java.net/jeps/321):在Java 11中,HTTPClient被完全重构,并且都改造为异步调用代码(基于...原创 2020-03-31 14:51:14 · 284 阅读 · 0 评论 -
Java新特性快速笔记 - Java 10
Java 10 是 Java 新的版本发布周期公布公布之后的第一个版本,相比于Java 9那么多新特性,这个版本就很轻量级了,只有12个JEP,涉及一些小的API修改发布日期: 2018-3-20所有的 JEP 链接地址一些值得关注并且实际使用的新特性:本地 var 变量: 使用 var 定义本地变量,会自动推导类型统一 GC 接口:通过统一 GC 设计接口,可以方便的设计与扩展新...原创 2020-03-31 14:46:21 · 2279 阅读 · 1 评论 -
Java新特性快速笔记 - Java 9
Java 9 是 Java 新的版本发布周期公布之前的最后一个新版本,并且因此,他这个版本特性极多,有着81个 JEP。发布日期: 2017-9-21所有的 JEP 链接地址: https://openjdk.java.net/projects/jdk9/在这个版本中,最重要的特性就是 Java 模块化 JPMS,也就是 Project Jigsaw (https://openjdk.jav...原创 2020-03-31 14:39:08 · 221 阅读 · 0 评论 -
结合CompletableFuture与Spring的Sleuth结合工具类与allOf以及anyOf
系列目录:Spring WebFlux运用中的思考与对比CompletableFuture与Spring的Sleuth结合工具类CommpetableFuture使用anyOf过程中的一些优化思考结合CompletableFuture与Spring的Sleuth结合工具类与allOf以及anyOf之前实现的CompletableFutureWithSpan,不能直接使用anyOf或者...原创 2019-11-22 17:06:38 · 17638 阅读 · 0 评论 -
CommpetableFuture使用anyOf过程中的一些优化思考
CompetableFuture的上一篇我们讲述了如何将CompletableFuture与Spring Sleuth结合起来。这篇我们继续优化CompletableFuture。CompletableFuture的allOf首先我们看看allOf的定义:public static CompletableFuture<Void> allOf(CompletableFuture&...原创 2019-11-18 20:22:05 · 12118 阅读 · 1 评论 -
JEP解读与尝鲜系列1 - Java Valhalla与Java Inline class
涉及到的JEP:Project ValhallaJEP 169: Value ObjectsJEP 218: Generics over Primitive Types这些特性将在JDK14实现Valhalla项目背景最主要的一点就是,让Java适应现代硬件:在Java语言发布之初,一次内存访问和一次数字计算的消耗时间是差不多的,但是现在,一次内存访问耗时大概是一次数值计算的2...原创 2019-10-22 19:54:09 · 3027 阅读 · 3 评论 -
JDK核心JAVA源码解析(1) - Object
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。 首先我们从所有类的父类Object开始:1. Object类(1)hashCode方法和equals方法public native int hashCode();public boolea原创 2017-04-09 15:11:50 · 18061 阅读 · 6 评论 -
JDK核心JAVA源码解析(2) - String(上)
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。 本文从JDK 1.8 & JDK 9.0 String的组成区别开始讨论,之后以9.0为准讨论代码2. String类2.1. String的基本组成(1....原创 2018-06-25 16:12:46 · 11731 阅读 · 0 评论 -
JDK核心JAVA源码解析(3) - 引用相关
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对引用分析,是后面分析各种框架机制的基础Java引用相关强引用(Strong Reference)强引用就是指在程序代码之中普遍存在的,一般的new一个对象并...原创 2018-07-10 20:44:45 · 9186 阅读 · 0 评论 -
JDK核心JAVA源码解析(4) - 堆外内存、零拷贝、DirectByteBuffer以及针对于NIO中的FileChannel的思考
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对堆外内存与DirectBuffer进行深入分析,了解Java对于堆外内存处理的机制,为下一篇文件IO做好准备Java堆栈内存与堆外内存首先我们扔出一个公式:...原创 2018-07-17 17:05:18 · 17333 阅读 · 29 评论 -
JDK核心JAVA源码解析(5) - JAVA File MMAP原理解析
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对JAVA中的MMAP的文件映射读写机制,来分析为何很多告诉框架用了这个机制,以及这个机制好在哪里,快在哪里。 本文基于JDK 1.8JAVA File MMA...原创 2018-07-20 12:14:14 · 21483 阅读 · 5 评论 -
JDK核心JAVA源码解析(6) - 原子类AtomicLong与LongAdder对比
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对JAVA中的原子类以及JDK1.8新增的LongAdder进行对比,探究它们的原理以及为何LongAdder在多线程环境下比较快。本文基于JDK 1.8性能对比:测试程...原创 2018-09-18 14:10:42 · 8607 阅读 · 18 评论 -
从OpenJDK8到OpenJDK11 - StackWalker类
本文基于OpenJDK 11之前升级了JDK到OpenJDK11,把遇到的问题以及解决方案列一下。每篇文章会以提出问题,思路说明,解决问题的思路去行文。这篇文章是关于堆栈信息获取的。遇到的问题 - 调用堆栈获取之前有做调用堆栈监控上报,某些仅采集调用类,某些需要采集调用方法,总体来说:在Java8中,我们可以这样去获取调用堆栈:通过Reflection类:private st...原创 2019-09-10 19:57:28 · 6493 阅读 · 0 评论 -
JDK核心JAVA源码解析(7)- 集合相关(1) - LinkedList
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对JAVA中集合类LinkedList进行分析,通过代码解释Java中的Fail-fast设计思想,以及LinkedList底层实现和与ArrayList对比下的就业场景。本文会...原创 2019-09-04 18:33:56 · 4914 阅读 · 0 评论