自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

兵临奇点

亦余心之所向兮,虽九死其犹未悔

  • 博客(36)
  • 收藏
  • 关注

原创 Java并发——线程池原理解析

前言可以说,线程池是Java并发场景中应用到的最多并发框架了。几乎所有需要异步或者并发执行的任务程序都可以使用线程池。在开发过程中,合理的使用线程池会带来以下3个好处:降低资源的消耗。如果了解Java线程的前因后果,对于这一点应该很好理解。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不同等到创建线程立即就能立即执行。提高线程的可管理性。线程是稀缺资源,通过线程池框架可以进行统一的线程分配、监控、调优。世界上没有完美无瑕的事情,任何事情都有正反两面。

2020-07-07 22:14:51 341

原创 深入理解Java垃圾回收——虚拟机高效回收的背后

在《深入理解垃圾回收——对象已死?》中,我们知道了对象如何判定为死亡,这一章节,我们来深入理解一下虚拟机垃圾回收子系统收集对象的背后算法和思想。从如何判定对象消亡的角度来看,垃圾收集算法可以划分为:“引用计数式垃圾收集”和“追踪式垃圾收集”,也称为“直接垃圾收集”和“间接垃圾收集”。由于引用计数算法的无法解决循环引用,所以几乎所有Java虚拟机都采用的是“间接垃圾收集”的方式。经典的分代理论...

2020-04-18 22:39:25 267

原创 深入理解Java垃圾回收——对象已死?

Java语言经过几十年的发展,其内存分配策略与内存回收策略已经发展的相当成熟,一切看起来都进入到了“自动化”的时代了。但是在通往高级开发人员的道路上,在遇到各种内存溢出、内存泄漏的问题时,当垃圾回收成为高并发的瓶颈时,如果不了解内存分配的策略、内存回收的策略,那么肯定解决不了这些问题,注定成为不了一名合格的高级开发人员。

2020-04-16 00:29:31 172

原创 深入理解JVM内存模型(运行时数据区域)

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如图所示。

2020-04-11 14:31:58 194

原创 Java并发——AQS源码深度解析

一. AQS是什么?  ASQ是AbstractQueuedSynchronizer的简称,它的类全限定名为:java.util.concurrent.locks.AbstractQueuedSynchronizer. 后文中我们称之为同步器。同步器是构建同步锁和其他同步组件的基础框架。它使用了一个int成员变量表示同步状态,通过内部的FIFO队列来完成资源的获取和线程的排队工作。  同步器的主要使用方式是继承。子类继承同步器并实现它的抽象方式来管理同步状态。在实现的过程中,主要就是修改成员变量sta

2020-02-20 23:33:08 506 2

原创 Spring源码系列——手撸一个@EnableXXX

一. 前言    耍了一个国庆节,感觉好累~~ 必须写一篇文章休息一下!    通过前面几篇源码系列的学习之后,有必要进行一个阶段性总结了。基于前面的学习,我们已经非常清楚了Spring是如何基于BeanFactoryPostProcessor和BeanDefinitionRegistoryPostProcessor来插手BeanFactory的扩展的原理;@Configuration/@Import/@ComponentS

2020-10-11 19:00:00 1534 1

原创 Spring源码系列——ConfigurationClassPostProcessor源码解析

写在前面最近我发现我辛辛苦苦写的文章,被很多人直接Copy到知乎/微信公众号等其他平台改改样式就变成他的原创文章了~~ 有些人气旺盛的公众号直接阅读量破万~~ 各种维权无果.很伤心~~ 我写文章的目的不是为了吸引眼球,我写的不是最好,也不求多少关注者多少阅读量. 我只是一个踏实的开发者将平时的点滴学习和思考进行记录而已~~ 尊重原创,人人自重且有责~~一. 前言在这三篇文章以Java Config的启动方式系统的梳理了Spring在启动过程的源码解析。Spring源码系列——容器的启动过程(一)S

2020-09-13 19:17:43 470 3

原创 Spring源码系列——容器的启动过程(三)

一. 前言Spring源码系列——容器的启动过程(一)中,我们解析了构造方法.Spring源码系列——容器的启动过程(二)中,我们解析了注册方法.本篇文章,分析最后一个方法refresh()!public AnnotationConfigApplicationContext(Class<?>... componentClasses) { this(); register(componentClasses); // 3.刷新整个容器 refresh();}

2020-08-22 18:56:47 324

原创 Spring源码系列——容器的启动过程(二)

一. 前言在上一篇文章Spring源码系列——容器的启动过程(一)中,我们解析了构造方法. 本篇文章我们继续解析第二个方法public AnnotationConfigApplicationContext(Class<?>... componentClasses) { this(); // 2.基于配置类注册相关信息 register(componentClasses); refresh();}二. register()方法解析无参构造方法解析完毕之后

2020-08-22 18:56:06 231

原创 Spring源码系列——容器的启动过程(一)

一. 前言Spring家族特别庞大,对于开发人员而言,要想全面征服Spring家族,得花费不少的力气。俗话说,打蛇打七寸,那么Spring家族的“七寸”是什么呢?我心目中的答案一直都是 Spring Framework!本篇文章记录我自己在学习Spring Framework的过程中的一小部分源码解读和梳理,以@Configuration为主题来谈一谈Spring 容器在启动过程中是如何扫描Bean的。二. 学习方法论我相信每个想变成优秀的开发人员都想弄懂Spring源码,我亦如此。于是通过很多途径

2020-08-22 18:55:04 312

原创 Spring源码系列——FactoryBean源码解析

前言在实际开发当中,如果偏向于系统基础架构开发的话,对于FactoryBean的使用应该不会特别陌生。FactoryBean和BeanFactory这二者经常会被拿出来比较,原因在于这二者的名字看起来很容易让人混淆,然而这二者的原理和作用完全不一样。本篇文章将围绕FactoryBean展开源码解析。FactoryBean接口public interface FactoryBean<T> { // 返回创建的bean对象 T getObject() throws Exception;

2020-08-02 18:55:22 616 1

原创 阿里云中央仓库、中央代理仓库官方主页

阿里云云效Maven https://maven.aliyun.com/mvn/guide

2020-07-30 16:16:26 311

原创 Redis——配置文件深度解读

前言  最近,我们在对接口进行压测优化,发现有些接口的TPS太不正常了,这里面多数接口都是直接从redis里面取数据的,针对反常的压测结果,我们决定从接口和redis集群两方面进行优化。针对于redis集群优化方面,主要是根据当前业务情况,适当调整一些配置参数,如果有必要的话,还需要进行集群扩容等。其中,关于配置文件,我在网上搜索了很多答案,有csdn、博客园等很多文章,发现都大同小异。也就阿里云的redis配置手册要专业很多。因此,想借助本次机会,自己把redis的配置文件好好的梳理解读一遍,一方面是加

2020-07-28 23:58:02 754

原创 Redis——因为bitmap,咬咬牙增加了8台服务器

前言  最近,因为增加了一些风控措施,导致新人拼团订单接口的QPS、TPS下降了约5%~10%.这还了得!  首先,快速解释一下【新人拼团】活动:  业务简介:顾名思义,新人拼团是由新用户发起的拼团,如果拼团成功,系统会自动奖励新用户一张满15.1元减15的平台优惠券。这相当于是无门槛优惠了。每个用户仅有一次机会。新人拼团活动的最大目的主要是为了拉新。  新用户判断标准:是否有支付成功的订单 ? 不是新用户 : 是新用户。  当前问题:由于像这种优惠力度较大的活动很容易被羊毛党、黑产盯上。因此,我

2020-07-25 02:49:05 290

原创 Redis——熬了一个通宵终于把Key删完了

前言  由于有一条业务线不理想,高层决定下架业务。对于我们技术团队而言,其对应的所有服务器资源和其他相关资源都要释放。释放了8台应用服务器;1台es服务器;删除分布式定时任务中心相关的业务任务;备份并删除MySQL数据库;删除Redis中相关的业务缓存数据。CTO指名点姓让我带头冲锋,才扣了我绩效……好吧,冲~其他都还好,不多时就解决了。唯独这删除Redis中的数据,害得我又熬了一个通宵,真是折煞我也!难点分析共用Redis服务集群  由于这条业务线的数据在Redis大概在3G左右,完全没必要单独

2020-07-22 23:49:02 230

原创 Redis——由分布式锁造成的重大事故

前言基于Redis使用分布式锁在当今已经不是什么新鲜事了。本篇文章主要是基于我们实际项目中因为redis分布式锁造成的事故分析及解决方案。背景:我们项目中的抢购订单采用的是分布式锁来解决的。有一次,运营做了一个飞天茅台的抢购活动,库存100瓶,但是却超卖了!要知道,这个地球上飞天茅台的稀缺性啊!!!事故发生,只能坦然接受。整个项目组被扣绩效了~~事故发生后,CTO指名点姓让我带头冲锋来处理,好吧,冲~事故现场经过一番了解后,得知这个抢购活动接口以前从来没有出现过这种情况,但是这次为什么会超卖呢?原因

2020-07-21 00:43:42 868

原创 Redis——集群部署实战

前言在当今,大多数后端开发项目中,Redis的重要性可能比关系型数据库还要重要!主要体现在以下几个方面:性能:redis的底层实现逻辑让其天生支持高并发,因此可以很好地利用redis进行性能优化(比如首页加载、热点数据加载等);高可用:redis支持多机数据库协同工作(主从、哨兵、集群),让其具备高可用特性;功能丰富:如果对于redis的实现设计稍有研究就会发现,其特有的数据结构+算法让其能支持丰富的数据类型,比如常见的字符串、列表、哈希、集合、有序集合等,基于此,复杂的业务场景都可以使用redi

2020-07-18 17:40:19 256

原创 Java并发——Executor框架原理解析

前言在上一篇文章《Java并发——线程池原理解析》中,对线程池的原理进行了解析,本质上是对ThreadPoolExecutor的解析。实际上ThreadPoolExecutor只是Executor框架中的一名成员。本篇文章我们将围绕Executor框架继续探讨其他成员。对于Java语言,线程是非常昂贵的资源,而线程本身即是工作单元也是工作机制,直到JDK1.5,提供了强大的J.U.C包,可以将工作单元与工作机制分离开来。其中,Runnable、Callable为工作单元,而执行机制由Executor框架

2020-07-12 15:46:07 237

原创 Java并发——这些工具类你用过吗?

前言J.U.C包中提供了一些非常有用的工具类。在合适的场景下使用它们往往能够达到事半功倍的效果。比如Atomic工具类、Exchanger、CountDownLatch、CyclicBarrier、Semaphore这些。Atomic工具类Atomic工具类能够实现原子操作数据。从数据类型的角度来看,可以分为:基本数据类型、数组、引用类型、引用类型属性的原子更新操作。它的底层原理其实就是对于Unsafe类和volatile的封装。像AtomicInteger、AtomicLong等内部源码都是差不多

2020-07-04 19:10:50 222

原创 Java并发——Fork/Join框架原理解析

前言最近有个哥们问我一个实际项目的问题,大致如下:需要给一个目录下的所有文件的路径生成对应的MD5签名。这个哥们首先想到的是采用递归的方式处理,这个思路是没问题的,但是完全没有必要自己造轮子。因为Java已经提供了成熟的工具可以使用了,那就是Fork/Join并行执行任务框架。基于此契机,本篇文章将记录自己理解Fork/Join框架原理的心得。在JDK1.7版本中,J.U.C包迎来了新的成员Fork/Join并行执行任务框架。Fork/Join框架的思想其实就是分而治之的思想。什么是Fork/Join

2020-07-02 23:37:35 510

原创 Java并发——ThreadLocal原理深度解析

前言ThreadLocal在很多中间件、框架中都有大量的应用,在我们的实际工程开发中也有很多场景需要使用到。其主要作用就是提供线程安全的本地线程变量副本。要弄懂ThreadLocal的本质就聚焦于弄懂其是如何实现本地变量副本的。本来想打算自己写一篇博客来记录学习历程,但是通过网络搜索发现,其实已经有很多总结的十分精彩的博客文章了,故不再重复造轮子,这里仅仅贴出我任务十分优秀的博客链接。ThreadLocal-面试必问深度解析ThreadLocal内存泄漏真因探究这两篇文章已经把ThreadLocal

2020-07-01 21:49:59 281

原创 Java并发——阻塞队列原理解析

前言在前文中非阻塞队列之ConcurrentLinkedQueue源码解析中,深度解析了非阻塞队列的源码。本篇内容将对于阻塞队列的原理、4中处理方式以及7中阻塞队列进行详细解析。什么是阻塞队列首先,再一次申明,队列必须是线程安全的,否则将毫无意义。阻塞队列最大的特征就是提供两种阻塞操作:阻塞的插入元素:当队列满时,队列会阻塞插入元素的线程,直到队列非满;阻塞的获取元素:对队列空时,队列会阻塞获取元素的线程,直到队列非空。说到这里,其实要研究Java中阻塞队列的核心问题就付出水面了:阻塞队

2020-06-30 23:41:24 309

原创 Java并发——非阻塞队列之ConcurrentLinkedQueue源码解析

前言在Java并发体系中,很多并发场景都离不开队列。比如Java中的定时任务框架、线程池框架、MQ等。本篇文章将记录我的队列学习之旅中的无阻塞队列源码学习。线程安全性首先,队列必须是线程安全的,否则,在并发场编程中,就失去了使用队列的意义了。队列实现线程安全的方式有两种:非阻塞队列和阻塞队列。本篇文章我们先研究非阻塞队列。非阻塞队列在Java中要实现非阻塞的线程安全,一定绕不开自旋和CAS这一对好搭配。基于这个认知,我们来深入剖析一波Doug Lea大神笔下的ConcurrentLinkedQue

2020-06-27 18:47:49 283

原创 Java并发——volatile关键字的核心

前言在Java并发的话题中,volatile关键字一定是绕不开的话题。Java程序员都知道,volatile关键字的使用方式,以及它的特性:保证变量在内存中的可见性,但不保证可见性。Java的J.U.C包中volatile关键字可谓是基石般的存在。接下来我们便来好好的深究这个volatile关键字的核心。volatile关键字的作用被volatile修饰了的变量,是可以保证其在内存中的可见性的。其实在单核的操作系统下,不论是单线程还是多线程,都不存在变量的可见性问题。因此用不用volatile关键字都

2020-06-06 19:41:44 272

原创 Java并发——synchronized关键字性能分析

前言  所有Java开发者对于synchronized关键字都不陌生。其实对于synchronized关键字的理解莫过于这几个方面:对象在内存中的布局、字节码层面的执行指令—monitorenter-monitorexit、ObjectMonitor(C++语言)、锁膨胀等。当然前提是要对于锁实现的方式、锁的优化等有清晰认知。关于synchronized原理介绍网络上有很多精辟的总结,我们就不重复造轮子了。在这里我贴出我认为不错的文章:synchronized底层实现我想重点说的是关于锁膨胀过程中的

2020-06-06 14:22:55 309

原创 Java并发——锁优化

锁优化的背景  JDK5版本带来了J.U.C包以及其他并发相关的技术,使得Java语言对于并发的支持更加完善。在这个基础上,JDK6为了更加高效的并发,Hotspot虚拟机的开发团队花费了大量的精力去实现各种锁优化的技术:自旋锁、自适应自旋锁、锁消除、锁膨胀、轻量级锁、偏向锁等。自旋锁与自适应自旋锁  互斥同步对于性能最大的影响点在于线程阻塞导致用户态和内核态切换所带来的的性能消耗。同时一个现状是:多数情况下,共享数据的锁定状态持续的时间都比较短。在这么短的阻塞情况下,去阻塞线程带往往是不值得的,尤其

2020-06-06 14:21:51 188

原创 Java并发——线程与Java线程

前言对于大多数Java开发人员而言,在实际工作中很少遇到复杂的并发场景。最多可能也就用一下线程池来并发运行程序以提升执行效率。虽然现状如此,但这并非意味着我们简单掌握并发的应用就可以了。在当今摩尔定律失效的情况下,并发处理成为了计算机发展的新动力,也成为了人类压榨CPU运算能力最有利的武器!基于以上的认知,我认为从思想和底层基础的角度来系统学习Java并发知识会比零零散散的的学习和简单应用能够得到更高的收益。本篇文章将系统介绍Java并发的基础条件——线程。线程首先,我们必须深刻认识到,在计算机

2020-05-18 23:45:31 217

原创 Java与动态类型

在JDK7以前,Java虚拟机层面对动态语言的支持一直有所欠缺。这是因为方法调用的4个指令:invokevirtual、invokespecial、invokestatic、invokeinterface的第一个参数都是被调用方法的符号引用。方法的符号引用在编译时产生,而动态语言只能在运行期确定方法的接收者。我们可以思考一下,如何基于现有的技术来实现动态语言的支持?JVM可以在编译时将方法的所有版本记录并缓存,在运行时逐个遍历直到找到合适的方法版本,然而这种“曲线救国”方式将会大大增加内存开销,得不偿失。因

2020-05-16 16:55:20 1680

原创 方法调用——解析与分派

注意,方法调用并等同于方法中的代码被执行!方法调用阶段唯一做的事情就是确定被调用方法的版本。我们知道,Class文件的编译阶段并不像其他传统语言那样会包含连接步骤,在Java语言中,连接步骤是在类的加载过程触发,因此所有的方法调用在Class文件中都只是符号引用,而不是方法在运行过程中实际的内存入口地址(大白话就是 直接引用)。这个特性给Java语言带来了很强大的扩展能力,可以让Java程序在运行过程中"动态"的决定调用哪个方法,但任何事情都有正反两面性,这个特性也让Java的方法调用很复杂,也正因为很复

2020-05-15 22:05:31 329

原创 程序运行的基石——运行时栈桢结构

在《深入理解JVM内存模型(运行时数据区域)》中详细介绍了JVM内存模型,并在介绍虚拟机栈时明确说明了栈桢是方法执行时非常重要的基础数据结构,但并没有详细说明,本篇文章便来深入探讨这程序运行的基石——栈桢。Java虚拟机以【方法】作为执行的最小单元。而方法的调用和执行背后的数据结构就是【栈桢】。一个方法对应一个栈桢。每一个方法从调用开始到执行结束都对应一个栈桢从入栈到出栈的过程。栈桢中包含了局...

2020-05-10 22:15:15 237

原创 深入理解虚拟机执行子系统——你真的了解类加载过程吗?

一提到类加载机制,现在的人大部分都能回答双亲委派模型、加载的大致过程。是的,大部分人知道的东西一定不是错的,但知识和财富一样,唯有少部分才能真正掌握。开始阅读之前,先统一几点约定:1.类加载的时机...

2020-05-04 01:13:59 260

原创 深入理解虚拟机执行子系统——Class文件的结构

再谈无关性Java语言诞生时所喊的口号是“一次编写,到处运行”(Write Onece,Run Anywhere),足以看见当时的开发者们对冲破平台限制的渴望。Java虚拟机屏蔽了各个平台的差异,使得这个口号成为现实。从Java诞生至今已经有20多年,相比当初它已经强大了很多,以至于我们不得不重新审视它的平台无关性。如今Java虚拟机已经不是专门用于执行Java语言了,一切符合Java虚拟机规范...

2020-04-27 23:45:35 290

原创 深入理解Java垃圾回收——垃圾收集器

《深入理解Java垃圾回收——虚拟机高效回收的背后》讲述了垃圾回收的理论思想,本篇文章来深入了解垃圾回收的实践:垃圾收集器。在讲解垃圾收集器之前必要要统一几点认知:1.用户线程:执行应用程序的用户线程;2.垃圾回收线程:虚拟机为了执行垃圾收集而创建的垃圾回收线程;3.并发:多条垃圾回收线程并发运行,此时的用户线程处于阻塞状态;4.并行:垃圾回收线程和用户线程并行运行,此时的用户线程正常运...

2020-04-25 13:00:04 297

原创 Java进阶硬核整理——(持续更新)

前言针对Java的基础知识, 在网络上已经有很多精辟的总结了. 有时候站在巨人的肩膀上可以事半功倍!因此,这里将整理出我认为很有参考价值的总结链接.这些文章十分适合刚入门Java需要进一步进阶的开发者 or 学习者!以下知识点都相对比较独立. 吃透他们, 将受益无穷!Java序列化与反序列化解析Java反射Java泛型HashMap的原理...

2020-04-20 17:13:03 205

原创 深入理解Java中的对象

Java是一门面向对象的编程语言,在Java应用程序中,每时每刻都有新的对象被创建出来。在语言层面上,创建一个对象仅仅是一个new关键字而已(clone、反序列化不在讨论范围内)。但是在虚拟机层面,创建对象的过程是一幕宏图伟业。大概分为以下几部分:

2020-04-13 22:48:00 222

原创 最实用的Eclipse常用设置

Eclipse 常用设置,你只需要花个10分钟跟着操作一遍,多练习,可以让你在开发过程中熟练使用Eclipse,提高开发效率。 查询查询一个类的继承关系:选中类名,F4查询当前方法在哪里被调用:选中当前方法名,ctrl+shift+g查询某个类:ctrl+shift+T 设置设置配置文件字体:window-preferences-colors and fonts...

2018-08-12 11:29:46 779

空空如也

空空如也

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

TA关注的人

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