![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java底层
文章平均质量分 87
程序员李哈
本平台分享技术帖,某站:李哈zzz分享技术视频
展开
-
JVM源码剖析之信号处理机制
在看到Saturn唯品会的分布式调度框架时,看到此框架使用了信号处理,并且外面关于Java信号处理机制的文章很少有写到JVM层面,所以笔者心血来潮写下了这篇关于Java信号处理机制的文章~因为Java信号处理机制是依赖于底层操作系统的信号处理机制,本文重点关注于Java信号处理机制,所以并不会过度的去介绍操作系统的信号处理机制~原创 2023-12-13 16:45:31 · 347 阅读 · 0 评论 -
JVM源码剖析之为什么ctrl+c能够结束JVM进程
在Linux和mac操作系统上当开发者运行Java程序(当然不限于Java程序)想停止结束进程时一般都使用ctrl+c或者kill -9 进程号来结束。那么肯定会有开发者对ctrl+c为什么能结束JVM进程感到兴趣,所以笔者写在了这篇关于ctrl+c结束JVM进程的文章,带领各位读者研究为什么ctrl+c能结束,以及看了源码后得到的一些 " 有趣 " 的事情~本文讲解了JVM使用信号机制优雅的关闭JVM,也讲解了如何使用Java信号机制把JVM默认的信号处理函数给替换导致JVM无法正常关闭~原创 2023-12-13 14:45:59 · 189 阅读 · 0 评论 -
JVM源码剖析之registerNatives方法
在Java类库中很多类都有一个registerNatives的native方法,并且写在static静态代码块中进行初始化调用,有不少的读者应该会对这个方法感兴趣,但是此方法是一个native方法,让不少的读者望而却步,所以笔者写在这一篇关于registerNatives方法的文章~原创 2023-12-13 10:01:22 · 420 阅读 · 0 评论 -
JVM源码剖析之你不知道的HashCode
笔者看了很多关于HashCode文章,发现大家很多都是" 面试宝典 " 的内容照搬,这对于喜欢底层研究的程序员来说不是好事,所以在这种情况下促使我写下这篇关于hashCode的文档。hashCode 作为一个native方法定义在Object类中,方法上给出了方法的注释和定义。Returns:See Also:此方法返回一个整数的hash码,此方法提供给HashMap类使用此方法在同一对象上多次调用都返回同一个hash码。原创 2023-12-12 15:51:11 · 110 阅读 · 0 评论 -
JVM源码剖析之软、弱、虚引用的处理细节
对于大大大大大大部分Java业务场景来说都是强引用,基本上不会使用到软、弱、虚引用。而在JDK1.2推出的软、弱、虚引用大部分出现场景都是在缓存中,在JDK类库ThreadLocal、WeakHashMap。框架:Mybatis、Netty、以及各种缓存框架等等。至于为什么要用在缓存中呢,也很好理解,因为这些引用实际上可有可无,完美契合于缓存,在有的时候给系统加速,在系统内存紧张的时候清除缓存给核心业务使用。原创 2023-11-10 15:56:52 · 788 阅读 · 0 评论 -
JVM源码剖析之Thread类中sleep方法
大部分的Java程序员知道让线程睡眠的方法是Thread.sleep方法,而这个方法是一个native方法,让很多想知道底层如何让线程睡眠的程序员望而却步。所以笔者特意写在这篇文章,带各位读者剖析一下Thread.sleep方法背后的神秘。sleep的底层实现并不复杂,但是不看源码是不会知道,如果传入的时间为0会优化成yield方法,并且在底层并不会像Object类中wait方法一样,释放锁资源等等~原创 2023-10-08 16:52:08 · 476 阅读 · 0 评论 -
JVM源码剖析之线程的创建过程
对于Java线程的创建这个话题,似乎已经被"八股文"带偏~ 大部分Java程序员从"八股文"得知创建Java线程有N种方式,比如new Thread、new Runnable、Callable、线程池等等~ 而笔者写下这篇文章的目的是让大家从JVM源码的层面知道创建一个Java线程的方式。原创 2023-10-08 15:37:50 · 281 阅读 · 0 评论 -
JDK源码剖析之PriorityQueue优先级队列
在数据结构中,队列分为FIFOLIFO两种模型,分别为先进先出,后进后出先进后出,后进先出(栈)而一切数据结构都是基于数组或者是链表实现。在Java中,定义了Queue接口,接口中定义了CRUD的基本方法。分别add、offer、remove、poll等等,而PriorityQueue 实现此接口实现了基本的CRUD的同时拥有了自己的特性,从名字来看也能知道是优先级队列 : 保持队列头部节点是整条队列中永远是最小或者最大的节点,其实现原理就是一个小顶堆或者大顶堆。上文提及到。原创 2023-09-07 16:54:45 · 169 阅读 · 0 评论 -
JVM源码剖析之Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded异常
最近在群里看到有一位老哥拿着异常信息到处问,而发生的就是java.lang.OutOfMemoryError: GC overhead limit exceeded异常,恰好看到经常有人询问关于这个异常的问题,如何发生的,要如何解决呢?所以促使我写下这篇文章,此文章分为3大块,出现的原因,如何解决,源码论证。原创 2023-08-11 16:13:13 · 786 阅读 · 0 评论 -
JVM源码剖析之System.getProperty实现
System.getProperty 方法大家并不陌生,在各大框架源码中都能见到,项目中也能使用到,那么此篇文章将带你揭开System.getProperty方法底层实现。System.getProperty 可以拿到当前系统属性,比如当前操作系统的属性、动态链接库位置、编码集、当前虚拟机的版本等等一系列系统属性。当然,你可以把它理解为整个系统上下文的一个存储数据的集合,你可以往里面set属性,任何地点get取出,并且线程安全。下面案例是展示了默认情况下所有的属性(所有的key都展示出来了,项目中如需使原创 2023-08-09 17:11:28 · 994 阅读 · 0 评论 -
JVM源码剖析之Java命令行参数全解
最近,有一位网友询问关于Java命令行参数方面的问题,因为在Java中参数有很多种,有不少的读者一直没弄明白,所以特意写下此篇文章。此篇文章分2大块,第一块是不同参数的解释,第2块就是JVM源码论证~图1-1给出了运行Java代码的命令行,其中包括了启动命令和不同种类的参数,分别用红、黄、黑、绿、蓝、粉 6种颜色代表。原创 2023-08-09 15:11:22 · 1033 阅读 · 0 评论 -
JVM源码剖析之JIT工作流程
Hotspot中执行引擎分为解释器、JIT及时编译器,上篇文章描述到解释器过度到JIT的条件。[JVM源码剖析之达到什么条件进行JIT优化](https://blog.csdn.net/qq_43799161/article/details/131831105?spm=1001.2014.3001.5501) 这篇文章大致讲述JIT的编译过程。在JDK中javac和JIT两部分跟编译原理挂钩,而编译原理抛开内部实现的算法,从思想的角度出发可以分为前端、中间IR、后端,见图1.1描述。比如拿javac举例,开原创 2023-07-27 14:11:57 · 872 阅读 · 0 评论 -
JVM源码剖析之达到什么条件进行JIT优化
在Hotspot虚拟机中执行引擎包括解释器、JIT及时编译器。从" Hotspot" 这个单词也能看出,此虚拟机为了热点而生。Hotspot虚拟机默认允许2大执行引擎同时进行工作,在正常情况下使用解释器进行工作,当达到一定阈值后从解释器转为JIT编译器工作(PS:当然,一切都可由开发者高度配置,比如:只允许解释器,比如转换阈值变低等等,为了篇幅,这里并不会把配置参数提供出来)原创 2023-07-21 09:38:21 · 333 阅读 · 0 评论 -
JVM源码剖析之-Xms和-Xmx参数最小的设置值是多少
JVM是一个运行在操作系统上的虚拟机。因为是一台虚拟的机器,所以对于内存肯定是可以控制的,恰好JVM提供了众多个参数控制内部运行时,而Xms和Xmx两个参数是用来控制Java堆内存的最小内存和最大内存。可能不少读者会好奇Xms和Xmx两个参数能够设置的最小值是多少,所以笔者借助源码来简单论述~答案先放在这里JDK8JDK12。原创 2023-07-17 15:08:18 · 3438 阅读 · 0 评论 -
JVM源码剖析之Java对象创建过程
关于 "Java的对象创建" 这个话题分布在各种论坛、各种帖子,文章的水平参差不齐。并且大部分仅仅是总结 "面试宝典" 的流程,小部分就是copy其他帖子,极少能看到拿源码作为论证。所以特意写下这篇文章。原创 2023-07-07 15:44:28 · 998 阅读 · 0 评论 -
JVM源码剖析之SymbolTable和StringTable
很多读者在观看JVM相关的书籍时会看到SymbolTable和StringTable,书中的三言二语介绍的不是很清楚,并且读者的水平有限,导致无法理解SymbolTable和StringTable。所以特意写此篇图文并茂的文章来彻底理解SymbolTable和StringTable这两张表。因为Hotspot是c++构成,所以也存在面向对象的思想,也即存在类和对象,所以直接看到SymbolTable和StringTable的类定义即可。原创 2023-07-04 15:56:53 · 739 阅读 · 0 评论 -
JVM源码剖析之JVM层面调用Java方法
先看以下2个案例。为什么调用Thread的start方法就能执行Runnable的代码?作为Java开发者,一定明白main方法是作为Java程序的入口。那么,为什么是main方法?那main方法是如何被调用执行的?此篇文章借用2个很简单的案例,带读者明白JVM层面是如何调用Java方法。原创 2023-07-03 19:49:53 · 810 阅读 · 0 评论 -
JVM源码分析VMThread线程
而安全点的触发工作就是"VMThread"线程来做,并且此线程还会执行需要安全点才能执行的工作,比如:GC垃圾回收、dump 线程堆栈数据 等等需要安全点的操作。原创 2023-05-31 16:15:43 · 1171 阅读 · 0 评论 -
JVM Shutdown Hook 机制原理以及源码分析
最近看众多框架源码的时候都看到使用到了Shutdown Hook机制。比如下图:SkyWalking、Spring、Tomcat等等框架,几乎只要是Java层面的框架都会使用到此机制。所以,借用论坛给读者写一篇关于JVM Shutdown Hook 机制原理分析以及源码分析。原创 2023-05-09 15:35:38 · 829 阅读 · 1 评论 -
JUC并发编程之ArrayBlockingQueue的底层原理
在JUC包下关于线程安全的队列实现有很多,那么此篇文章讲解ArrayBlockingQueue的实现原理。相对于LinkedBlockingQueue和来说,ArrayBlockingQueue效率比较低,但是实现比较容易,从类名也可以看出,这个是基于数组实现的队列。从简单入手,再一步步学习复杂的。JUC并发编程之LinkedBlockingQueue的底层原理JUC并发编程之SynchronousQueue的底层原理// 因为基于数组实现的队列,全局数组// 消费者索引// 生产者索引。原创 2023-02-01 16:45:06 · 370 阅读 · 0 评论 -
JUC并发编程之LinkedBlockingQueue的底层原理
在JUC包下关于线程安全的队列实现有很多,那么此篇文章讲解LinkedBlockingQueue的实现原理,相信各位读者在线程池中能看到或者队列来作为储存任务和消费任务的通道。一个并发安全的队列,在多线程中充当着安全的传输任务的责任。既然是介绍那么从构造方法入手最合适不过。// 初始化一个伪节点,让head和last都指向这个伪节点// 为什么需要伪节点的存在?// 因为可以保证不会发生极端情况(假设没有伪节点,并且只存在一个节点的情况下,生产者和消费者并发执行就可能出现极端情况)原创 2023-02-01 14:55:19 · 296 阅读 · 0 评论 -
JUC并发编程之SynchronousQueue的底层原理
判断当前线程与队列最后一个节点是否是同一个模式(因为在SynchronousQueue队列同一时刻节点都是一样的,如果当前插入的节点不一致,他就是一个匹配节点,反之,如果一致就需要插入到队尾中,阻塞等待,直到轮到他与其他线程做匹配)可以很清楚的看到不管是put还是take方法,他们的统一入口都是transferer.transfer方法,只不过参数不一致,所以也可以明白,内部可能是根据参数来判断当前是消费者还是生产者。以上代码是transfer方法的所有实现,读者先需明白,这个方法是统一的入口。原创 2023-01-31 23:57:29 · 314 阅读 · 0 评论 -
Synchronized底层原理系列之Synchronized的偏向锁实现原理
上篇文章已经对Synchronized关键字做了初步的介绍,从字节码层面介绍了Synchronized关键字,最终字节码层面就是和字节码指令。并且拿Synchronized关键字和Java的JUC包下的ReentrantLock做了比较。Synchronized关键字的初体验-超链接地址那么本篇文章将开始深入解析Synchronized关键字的底层原理,也就是解析Hotspot虚拟机对和字节码指令的实现原理。理论知识。原创 2023-01-14 16:17:07 · 686 阅读 · 1 评论 -
Synchronized底层原理系列之Synchronized的初体验
Synchronized是什么:各位Java读者,对于synchronized关键字并不陌生,在各种中间件源码或者JDK源码中都能看到,对于不熟悉synchronized的读者只知道在多线程中需要使用到synchronized关键字,知道synchronized能够保证线程安全,那么本篇文章带领各位读者对synchronized有一个认识。称之为:互斥锁(同时只能一个线程执行,其他的线程将会等待)又称之为:悲观锁(同时只能一个线程执行,其他的线程将会等待)原创 2023-01-13 14:17:48 · 564 阅读 · 0 评论 -
AQS源码中cancelAcquire()方法详解
首先,先考虑一个问题,什么条件会触发cancelAcquire()方法? 可以清楚的看到在互斥锁和共享锁的拿锁过程中都是有调用此方法的,而cancelAcquire()方法是写在finally代码块中,并且使用failed标志位来控制cancelAcquire()方法的执行。可以得出,在触发异常的情况下会执行cancelAcquire()方法。 可以清楚的看到,这里是响应异常,如果发生了异常,比如中断异常,那么当前线程Node需要做出取消的操作,那么下面详细的说明cancelAcquire()方法。原创 2022-11-08 15:07:51 · 1172 阅读 · 1 评论 -
从源码角度解读JDK动态代理
什么是动态代理我们熟知的Javaee中大量框架使用到动态代理这个概念,那么动态代理到底是个什么玩意呢?我们知道接口他是无法生成对象的,他只能被实现,而动态代理就是程序在运行中,通过一种方式使得接口生成一个代理的class文件,然后再通过class文件再生成代理类的对象。并且通过构造方法来传入InvocationHandler对象,而InvocationHandler对象通过用户自己重写并传入,具体的代理业务逻辑就可以在其中实现。InvocationHandler顾名思义就是用来处理接口代理对象的方法原创 2022-03-17 20:10:19 · 666 阅读 · 0 评论