JDK源码剖析
文章平均质量分 93
hashcon
做自媒体技术分享很久了,大家的抬爱与支持让我很开心很感激,但是个人本来做这些也并不是为了收益,只是为了个人学习与传播知识帮助更多的人,所以我将全网所有账号全部收益,持续捐给各种公益项目,也算不辜负大家的抬爱,也是回报祖国对我的一番培养。
曾任职于顺丰,华为,网易等公司,从Java小白,成长为资深开发与项目组首席架构师。喜欢源码与开源,曾贡献 MyCat1.6 核心源码,贡献过druid,Spring Cloud,dubbox,Apache RocketMQ,Apache Bookeeper 等多开源项目。
展开
-
Java Record 的一些思考 - 默认方法使用以及基于预编译生成相关字节码的底层实现
快速上手 Record 类我们先举一个简单例子,声明一个用户 Record。public record User(long id, String name, int age) {}这样编写代码之后,Record 类默认包含的元素和方法实现包括:record 头指定的组成元素(int id, String name, int age),并且,这些元素都是 final 的。record 默认只有一个构造器,是包含所有元素的构造器。record 的每个元素都有一个对应的 getter(但这种 ge原创 2021-12-23 08:58:29 · 534 阅读 · 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 · 55868 阅读 · 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 · 2053 阅读 · 1 评论 -
Java GC详解 - 1. 最全面的理解Java对象结构 - 对象指针 OOPs
最近在抽时间阅读 JDK 的源码,主要是 GC 还有 Safepoint 相关的源码,发现很多我在之前拜读网上各种 JVM 原理大作时候的对于底层原理的误解。果然,一百个人读水浒传,就有一百种水浒传。还是需要更加深入的了解下源码,才能更好地理解 JVM,进行调优。这个系列,将在讲述 Java GC 各种原理的基础上,结合对应的源码分析,并附上源码地址。因为JVM的源码更新还是很快的,尤其是 GC 这一块,但是基本原理,应该大体不会变,附上源码地址,旨在让各位读者掌握这些原理最新实现情况。本文在撰写的时候,.原创 2020-09-16 17:42:48 · 1660 阅读 · 2 评论 -
HashMap 的 defaultLoadFactor 的一种推导计算思路
1. 为啥需要 defaultLoadFactor现在主流的 HashMap,一般的实现思路都是开放地址法+链地址法的方式来实现。即数组 + 链表的实现方式,通过计算哈希值,找到数组对应的位置,如果已存在元素,就加到这个位置的链表上。在 Java 8 之后,链表过长还会转化为红黑树。红黑树相较于原来的链表,多占用了一倍的空间,但是查询速度快乐一个数量级,属于空间换时间。 同时,链表转换红黑树也是一个耗时的操作。并且,一个效率高的哈希表,这个链表不应该过长。所以,如果数组的很多元素上面已经有值了,那么原创 2020-08-03 19:45:09 · 3344 阅读 · 2 评论 -
JVM相关 - SafePoint 与 Stop The World 全解(基于OpenJDK 11版本)
本文基于 OpenJDK 11在分析线上 JVM 性能问题的时候,我们可能会碰到下面这些场景:1.GC 本身没有花多长时间,但是 JVM 暂停了很久,例如下面:2.JVM 没有 GC,但是程序暂停了很久,而且这种情况时不时就出现。这些问题一般和 SafePoint 还有 Stop the World 有关。什么是 SafePoint?什么是 Stop the world?他们之间有何关系?我们先来设想下如下场景:当需要 GC 时,需要知道哪些对象还被使用,或者已经不被使用可以回收了,这样.原创 2020-07-19 20:32:21 · 33687 阅读 · 5 评论 -
OpenJDK 11 JVM日志相关参数解析与使用
OpenJDK 11是在OpenJDK 8之后的第一个长期支持版本,这一版本在JVM日志配置有了很大改动,主要是规范化,统一化了。在OpenJDK 8中,日志配置有很多状态位,让人摸不着头脑,并且比较难以维护与进一步迭代。在OpenJDK 11终于将JVM日志相关的配置规范起来,统一配置。这篇文章会对于这些配置做一个详尽的说明和解析。一、JVM日志标签JVM日志和我们java代码中的日志,其实...原创 2020-02-28 16:01:08 · 5758 阅读 · 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 · 17642 阅读 · 0 评论 -
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 · 3040 阅读 · 3 评论 -
OpenJDK8升级到OpenJDK11需要注意的修改与异常
目前,JDK两个长期版本是8和11,由于大部分项目使用的还是8,所以从8升级到11会遇到一些困难。本篇文章会基于实践遇到的问题,分类总结可能1. Java模块化从Java 9开始,由于引入了JPMS(https://openjdk.java.net/projects/jigsaw/spec/),开始更精细化的包管理和模块复用,导致很多JDK默认加载的包被移除了。其中我们可能会碰到的例如:...原创 2019-09-11 12:26:23 · 15950 阅读 · 1 评论 -
Java9之后的模块化烦恼解决(由RocketMQ升级OpenJDK11想到的)
本文基于OpenJDK11最近从OpenJDK8升级到了OpenJDK11,系统业务MQ用的RocketMQ,升级RocketMQ过程中,在已修改好JVM参数的情况下(参考我另一篇文章),遇到如下异常:java.lang.IllegalStateException: java.lang.reflect.InaccessibleObjectException: Unable to make ...原创 2019-05-24 11:58:59 · 5830 阅读 · 4 评论 -
JDK核心JAVA源码解析(6) - 原子类AtomicLong与LongAdder对比
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对JAVA中的原子类以及JDK1.8新增的LongAdder进行对比,探究它们的原理以及为何LongAdder在多线程环境下比较快。本文基于JDK 1.8性能对比:测试程...原创 2018-09-18 14:10:42 · 8616 阅读 · 18 评论 -
JDK核心JAVA源码解析(5) - JAVA File MMAP原理解析
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对JAVA中的MMAP的文件映射读写机制,来分析为何很多告诉框架用了这个机制,以及这个机制好在哪里,快在哪里。 本文基于JDK 1.8JAVA File MMA...原创 2018-07-20 12:14:14 · 21491 阅读 · 5 评论 -
Java 7新特性总结 - Coin项目新语言特性
Coin项目OpenJDK中的Coin项目的目的是维护对Java语言所做的语法增强。 在Coin项目开始之初,曾经广泛地向社区征求提议。在短短的一个月时间内就收到了近70条提议。最后有9条提议被列入考虑之中。在这9条提议中,有6条成为Java 7的一部分,剩下的2条提议会在Java 8中重新考虑,还有1条提议被移到其他项目中实现。1. 在switch语句中使用字符串在Java 7之前,switch转载 2016-04-18 11:19:34 · 5067 阅读 · 0 评论 -
Java 7新特性总结 - Java IO
绝大多数应用程序在运行过程中都会进行两种类型的计算:一种是占用CPU时间的计算,另外一种是与数据输入/输出(I/O)相关的计算。在这两种计算中,一般是与I/O相关的计算所花费的时间占较大的比重。这其中的主要原因是在进行I/O操作时,一般需要竞争操作系统中有限的资源,或是需要等待速度较慢的外部设备完成其操作,从而造成I/O相关的计算所等待的时间较长。从性能优化的角度出发,提升I/O相关操作的性能会对应转载 2016-04-18 12:20:06 · 4384 阅读 · 0 评论 -
Java遗忘笔记(1)
1. 静态代码块class Parent{ static String name = "hello"; { System.out.println("parent block"); } static { System.out.println("parent static block"); } public Parent(){ System.out.println("pare原创 2016-05-03 09:33:31 · 4982 阅读 · 0 评论 -
JDK核心JAVA源码解析(1) - Object
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。 首先我们从所有类的父类Object开始:1. Object类(1)hashCode方法和equals方法public native int hashCode();public boolea原创 2017-04-09 15:11:50 · 18066 阅读 · 6 评论 -
栈分配与TLAB
在学习Java的过程中,一般认为new出来的对象都是被分配在堆上的,其实这个结论不完全正确,因为是大部分new出来的对象被分配在堆上,而不是全部。通过对Java对象分配的过程分析,可以知道有另外两个地方也是可以存放对象的。这两个地方分别栈 (涉及逃逸分析相关知识)和TLAB(Thread Local Allocation Buffer)。我们首先对这两者进行介绍,而后对Java对象分配过程进行介绍转载 2017-10-16 23:11:24 · 6352 阅读 · 0 评论 -
类加载器解析(1)类生命周期
最近看到了Greys这个工具,感觉很好用,不再想用BTrace了。Greys这个小工具激发了我对于Java类加载机制还有Instrumentation的兴趣,所以想通过这个系列详细分析下。类的整个生命周期引用这篇文章的图片:主要是五大步,加载,链接,初始化,使用和卸载。加载JVM虚拟机规范中,并没有规定类在何时被加载。只规定了在何时一定要被初始化 加载主要做三件事...原创 2018-03-06 14:58:46 · 4178 阅读 · 0 评论 -
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 · 11737 阅读 · 0 评论 -
JDK核心JAVA源码解析(3) - 引用相关
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对引用分析,是后面分析各种框架机制的基础Java引用相关强引用(Strong Reference)强引用就是指在程序代码之中普遍存在的,一般的new一个对象并...原创 2018-07-10 20:44:45 · 9188 阅读 · 0 评论 -
JDK核心JAVA源码解析(4) - 堆外内存、零拷贝、DirectByteBuffer以及针对于NIO中的FileChannel的思考
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对堆外内存与DirectBuffer进行深入分析,了解Java对于堆外内存处理的机制,为下一篇文件IO做好准备Java堆栈内存与堆外内存首先我们扔出一个公式:...原创 2018-07-17 17:05:18 · 17340 阅读 · 29 评论 -
[笔记]Executors框架
框架结构任务:Runnable和Callable任务的执行:Executor接口->ExecutorService接口 ThreadPoolExecutorScheduledThreadPoolExecutor异步计算的结果:Future接口->FutureTask类ThreadPoolExecutornew ThreadPoolExecutor(corePoolSize,maximum转载 2016-03-08 20:08:28 · 4794 阅读 · 0 评论