自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 单体项目偶遇并发漏洞!短短一夜时间竟让老板蒸发197.83元!

眼下这位正襟危坐的男子,即将成为被告人,由于CV大法用上头了,给系统遗留了并发漏洞,幸亏平台用户量不大,否则老板亏损百万起步……

2023-05-29 16:04:05 292 1

原创 (八)JVM成神路之GC分区篇:G1、ZGC、ShenandoahGC高性能收集器深入剖析

引言   在《GC分代篇》中,我们曾对JVM中的分代GC收集器进行了全面阐述,而在本章中重点则是对JDK后续新版本中研发推出的高性能收集器进行深入剖析,但在开始前,先来看看JDK的发布记录中关于GC体系的改变:2018年9月:JDK11发布,引入Epsilon垃圾回收器,又被称为"No-0p(无操作) "回收器。同时,引入了可伸缩的低延迟垃圾回收器ZGC(Experimental)。2019年3月:JDK12发布,增强G1收集器,实现自动返还未用堆内存给操作系统。同时,引入了低停

2022-03-20 00:45:00 2203 1

原创 (七)JVM成神路之GC分代篇:分代GC器、CMS收集器及YoungGC、FullGC日志剖析

引言在《GC基础篇》中曾谈到过分代以及分区回收的概念,但基础篇更多的是建立在GC的一些算法理论上进行高谈阔论,而本篇则重点会对于分代收集器的实现进行全面详解,其中会涵盖串行收集器、并行收集器、三色标记、SATB算法、GC执行过程、并发标记、CMS收集器等知识,本篇则偏重于分析GC机制的落地实现,也就是垃圾收集器(Garbage Collector)。一、堆空间回顾与GC收集器概述GC覆盖的范围有堆空间与元空间,而主要的作用范围则是堆空间,所以先简单回顾堆空间后,再对于GC中的一些概念进行阐述,有了这些

2022-03-19 15:30:00 1511

原创 (六)JVM成神路之GC基础篇:对象存活判定算法、GC算法、STW、GC种类详解

引言经过前面五个章节的分析后,对于JVM的大部分子系统都已阐述完毕,在本文中则开始对JVM的GC子系统进行全面阐述,GC机制也是JVM的重中之重,调优、监控、面试都逃不开的JVM话题。在前面分析JVM运行时内存区域时,其中程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,伴线程而亡。而运行期间,栈的每个栈帧所需空间大小,其实在编译期就可大致确定,因此这几个区域的内存分配和回收都具备确定性,在这些区域内不需要过多考虑回收的问题,因为所分配的区域会随着线程或方法栈帧的销毁而随之回收。而Java堆空间和元

2022-03-18 00:45:00 1482

原创 (五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析

引言在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。一、Java对象在内存中的布局Java源代码中,使用new关键字创建出的对象实例,我们都知道在运行时会被分配到内存上存储,但分配的时候是直接在内存中“挖”一个对应大小的坑,然后把对象实例丢进去存储吗?其实并不然,Java对象一般在内存中的布局通常由对象头、实例数据、

2022-03-17 11:15:00 311

原创 (四)JVM成神路之深入理解虚拟机运行时数据区与内存溢出、内存泄露剖析

引言前面的文章中重点是对于JVM的子系统进行分析,在之前已经详细的阐述了虚拟机的类加载子系统以及执行引擎子系统,而本篇则准备对于JVM运行时的内存区域以及JVM运行时的内存溢出与内存泄露问题进行全面剖析。一、全面详解JVM运行时内存区域JVM在运行Java程序时,会把自身管理的内存分为若干个不同的数据区域,这些区域各自都有各自的用途,同时,不同的区域也有着不同的生命周期,有些区域随着虚拟机的启动而开辟,随着虚拟机的终止而销毁,有的区域则是在运行过程中不断的创建与销毁。JVM内存区域也被称为JVM运行

2022-03-16 19:45:00 565

原创 (三)JVM成神路之全面详解执行引擎子系统与JIT即时编译原理

引言执行引擎子系统是JVM的重要组成部分之一,在JVM系列的开篇曾提到:JVM是一个架构在平台上的平台,虚拟机是一个相似于“物理机”的概念,与物理机一样,都具备代码执行的能力。但虚拟机与物理机最大的不同在于:物理机的执行引擎是直接建立在处理器、高速缓存、平台指令集与操作系统层面上的,物理机的执行引擎可以直接调用各处资源对代码进行直接执行,而虚拟机则是建立在软件层面上的平台,它的执行引擎则是负责解释编译执行自身定义的指令集代码。同时,也正因Java设计出了JVM虚拟机的结构,从而才使得Java可以不受物理平

2022-03-16 01:00:00 474

原创 (二)JVM成神路之剖析Java类加载子系统、双亲委派机制及线程上下文类加载器

引言上篇《初识Java虚拟机》文章中曾提及到:我们所编写的Java代码经过编译之后,会生成对应的class字节码文件,而在程序启动时会通过类加载子系统将这些字节码文件先装载进内存,然后再交由执行引擎执行。本文中则会对Java虚拟机的类加载机制以及执行引擎进行全面分析。一、初窥类加载机制及加载过程详解每个编写出的.java文件都存储着需执行的程序逻辑,经过Java编译器编译后,会为每个.java文件生成对应的.class字节码文件,.class文件中则记录着Java代码转换之后的虚拟机指令,每个.cla

2022-03-15 00:30:00 384 10

原创 (一)JVM成神路之初识虚拟机 - 探寻Java虚拟机的前世今生之秘

引言JVM(Java Virtual Machine)Java虚拟机的概念大家都不陌生,Java之所以可以做到“一次编译,到处运行”的跨平台性,其根本原因就在于JVM。JVM是建立在操作系统(OS)之上的,Java虚拟机屏蔽了开发人员与操作系统的直接接触,我们在通过Java编写程序时,只需要负责编写Java代码即可,关于具体的执行则会由JVM加载字节码后翻译成机械指令交给OS执行。同时JVM方面的知识,在如今Java内卷日益加重的时代中,也变成了每位Java开发人员必须要掌握的一项技能,求职面试过程中

2022-03-14 14:21:21 2078

原创 (十四)深入并发之线程、进程、纤程、协程、管程与死锁、活锁、锁饥饿详解

引言在之前对于并发编程这个模块的内容已经阐述了很多篇章了,而本章的目的则是为了对前述的内容做个补充,重点会围绕着锁的状态与并行处理的方式进行展开论述。一、进程、线程、纤程、协程、管程概念理解在现在你可能会经常看到进程、线程、纤程、协程、管程、微线程、绿色线程…一大堆xx程的概念,其实这些本质上都是为了满足并行执行、异步执行而出现的一些概念。因为随着如今的科技越来越发达,计算机目前多以多核机器为主,所以之前单线程的串行执行方式注定无法100%程度发挥出硬件该有的性能。同时,为了满足互联网时代中日益渐

2021-12-16 00:45:00 445

原创 (十三)全面理解并发编程之分布式架构下Redis、ZK分布式锁的前世今生

引言在前面的大部分文章中,我们反复围绕着线程安全相关问题在对Java的并发编程进行阐述,但前叙的文章中都是基于单体架构的Java程序进行分析的,而如今单体的程序远不足以满足日益渐增的用户需求,所以一般目前Java程序都是通过多机器、分布式的架构模式进行部署。那么在多部署环境下,之前我们分析的CAS无锁、隐式锁、显式锁等方案是否还有效呢?答案是无效。一、单体架构下的锁迁移分布式架构分析在前面关于Synchronized关键字原理剖析以及AQS与ReetrantLock原理分析两篇文章中,曾得知这两种都是

2021-12-15 15:58:21 2281

原创 并发编程终章:Java并发编程系列总纲

并发编程目录磕磕绊绊近半年时间,在工作之余,前后一共写了十三篇深入Java并发编程系列的文章,由于内容颇多,所以在这里列一个目录方便诸位翻阅。在学习并发编程时,大家都会接触一个关键字:volatile,使用它修饰的成员可以保证多线程之间可见,而想要理解它的实现之前,首先需要先掌握的就是Java的内存模型:JMM。所以volatile与JMM作为了并发系列的开篇:(一)《玩命死磕Java内存模型(JMM)与Volatile关键字底层原理》多线程编程中,注定是会牵扯并发安全问题的,而在Java中

2021-11-07 00:15:00 286

原创 (十二)彻悟并发之JUC分治思想产物-ForkJoin分支合并框架原理剖析下篇

引言在《(十二)彻悟并发之JUC分治思想产物-ForkJoin分支合并框架原理剖析上篇》中,我们曾初步了解了ForkJoin分支合并框架的使用,也分析框架的成员构成以及任务提交和创建工作的原理实现,在本篇则会对框架的任务执行、任务扫描、线程挂起、结果合并以及任务窃取的源码实现进行分析。一、工作线程执行任务/工作窃取实现过程在上篇的最后,从signalWork() -> tryAddWorker() -> createWorker() -> newThread() -> Fork

2021-11-06 09:30:00 175

原创 (十一)彻悟并发之JUC分治思想产物-ForkJoin分支合并框架原理剖析上篇

引言在上篇文章《深入理解并发之Java线程池、工作原理、复用原理及源码分析》中,曾详细谈到了Java的线程池框架。在其中也说到了JDK提供的四种原生线程池以及自定义线程池,而本文则再来详细谈谈JDK1.7中新推出的线程池:ForkJoinPool。但ForkJoinPool的出现并不是为了替代ThreadPoolExecutor,而是作为它的补充,因为在某些场景下,它的性能会比ThreadPoolExecutor更好。在之前的模式中,往往一个任务会分配给一条线程执行,如果有个任务耗时比较长,并且在处理期间

2021-11-05 15:03:48 242

原创 (九)深入并发编程之并发容器:阻塞队列、写时复制容器、锁分段容器原理详谈

引言相信大家在学习JavaSE时都曾接触过容器这一内容,一般Java中的容器可分为四类:Map、List、Queue以及Set容器,而在使用过程中,对于ArrayList、HashMap等这类容器都是经常使用的,但问题在于这些容器在并发环境下都会存在线程安全问题。所以当我们在多线程环境下使用容器时,一般会使用Vector、HashTable来代替之前的ArrayList、HashMap,或者通过如下几个Collections提供的方法来将容器转换线程安全的:// 将一个List转换为线程安全的List

2021-10-27 07:00:00 320

原创 (八)深入并发之Runnable、Callable、FutureTask及CompletableFuture原理分析

引言关于Runnable、Callable接口大家可能在最开始学习Java多线程编程时,都曾学习过一个概念:在Java中创建多线程的方式有三种:继承Thread类、实现Runnable接口以及实现Callable接口。但是实则不然,真正创建多线程的方式只有一种:继承Thread类,因为只有new Thread().start()这种方式才能真正的映射一条OS的内核线程执行,而关于实现Runnable接口以及实现Callable接口创建出的Runnable、Callable对象在我看来只能姑且被称为“多线程

2021-10-26 10:00:00 787

原创 (七)全面剖析Java并发编程之线程变量副本ThreadLocal原理分析

引言在之前的文章:彻底理解Java并发编程之Synchronized关键字实现原理剖析中我们曾初次谈到线程安全问题引发的"三要素":多线程、共享资源/临界资源、非原子性操作,简而言之:在同一时刻,多条线程同时对临界资源进行非原子性操作则有可能产生线程安全问题。而如果想要解决线程安全问题,我们只需要破坏掉三要素中的任意条件即可,如下:①破坏多线程条件:同一时刻,一条线程对共享资源进行非原子性操作,不会产生线程安全问题②破坏共享资源条件:同一时刻多条线程对局部资源进行非原子性操作,也不会产生线程安全问题

2021-10-23 07:30:00 733

原创 (六)手撕并发编程之基于Semaphore与CountDownLatch分析AQS共享模式实现

引言在上篇文章深入剖析并发之AQS独占锁&重入锁(ReetrantLock)及Condition实现原理中我们曾基于ReetrantLock锁分析了AQS独占模式的实现原理,本章则准备从Semaphore信号量的角度出发一探AQS共享模式的具体实现。共享模式与独占模式区别在于:共享模式下允许多条线程同时获取锁资源,而在之前分析的独占模式中,在同一时刻只允许一条线程持有锁资源。一、快速认识Semaphore信号量及实战Semaphore信号量是java.util.concurrent(JUC)包

2021-10-22 20:30:00 178

原创 (五)深入剖析并发之AQS独占锁&重入锁ReetrantLock及Condition实现原理

引言在我们前面的文章《深入理解Java并发编程之无锁CAS机制》中我们曾提到的CAS机制如果说是整个Java并发编程基础的话,那么本章跟大家所讲述的AQS则是整个Java JUC的核心。不过在学习AQS之前需要对于CAS机制有一定的知识储备,因为CAS在ReetrantLock及AQS中的实现随处可见。一、JUC中的Lock锁接口在我们并发编程的文章一开始,我们都是在围绕着线程安全问题叙述它的解决方案,在前面的文章中我们曾提到过CAS无锁机制、synchronized关键字等多种解决方案,在其中CAS

2021-10-21 23:30:00 307

原创 (四)深入理解Java并发编程之无锁CAS机制、魔法类Unsafe、原子包Atomic

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2021-10-21 06:30:00 333

原创 (三)死磕并发之深入Hotspot源码剖析Synchronized关键字实现

引言关于源码分析如果不是功底特别深厚的小伙伴可能需要用心的去细心咀嚼,千万不要抱着看一边就能懂的心态学习,不然最终也没有任何作用。如果只是想要研究Synchronized关键字原理那么请观看我的上一篇文章:彻底理解Java并发编程之Synchronized关键字实现原理剖析。五、Hotspot源码深度解读Synchronized关键字原理从 monitorenter和 monitorexit这两个指令来开始阅读源码,JVM将字节码加载到内存以后,会对这两个指令进行解释执行, monitorenter,

2020-06-22 22:19:39 911

原创 (二)彻底理解Java并发编程之Synchronized关键字实现原理剖析

引言Synchronized关键字(互斥锁)原理,一线大厂不变的面试题,同时也是理解Java并发编程必不可少的一环!其中覆盖的知识面很多,需要理解的点也很多,本文是以相关书籍和结合自己的个人理解从基础的应用范围到底层深入剖析的方式进行阐述,如果错误或疑问欢迎各位看官评论区留言纠正,谢谢!一、Synchronized应用方式及锁类型众所周知,在项目开发过程中使用多线程的效果就是一个字:快!多线程编程能够去给我们的程序带来很大的性能收益,同时也能够去把机器的性能发挥到极致。而当现在的时代进步发展,机器的硬

2020-06-20 14:19:28 390

原创 (一)玩命死磕Java内存模型(JMM)与Volatile关键字底层原理

引言本篇文章结合我个人对Java内存模型的理解以及相关书籍资料为前提全面剖析JMM内存模型,本文的书写思路先阐述JVM内存模型、硬件与OS(操作系统)内存区域架构、Java多线程原理以及Java内存模型JMM之间的串联关系之后再对Java内存模型进行进一步剖析,因为大部分小伙伴在描述Java内存模型JMM时总是和JVM内存模型的概念相互混淆,那么本文的目的就是帮助各位小伙伴彻底理解JMM内存模型...

2020-04-26 22:19:53 647 1

原创 高并发大流量情况下带来的海量数据分库分表的正确姿势

注意!!!不要为了分库分表而分库分表!!!引入SOA架构中的一句话:架构不是一蹶而起的,而是慢慢演进的一、为什么需要分库分表?请求数太高:在高并发情况下,大量请求落入数据库,最终会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service层来看就是,可用数据库连接少甚至无连接可用。接下来面临的就是并发量、吞吐量、连接异常、崩溃、宕机;数据查询慢:...

2020-04-02 16:21:29 2028 2

原创 (十)深入理解Java并发编程之ThreadPool线程池、工作原理、复用原理及源码分析

一、序言一般在开发过程中,一个功能是运行时长太久了,一般是通过什么方式去优化的?多线程,对于一个业务方法而言,如果其中的调用链太长势必会引起程序运行时间延长,导致整个系统吞吐来量下降,而我们使用多线程方式来对该方法的调用链进行优化,对于一些耦合度不是特别高的调用关系可以直接通过多线程来走异步的方式进行处理,大大的缩短了程序的运行时长,但是如果我们的多线程创建方式是通过 new Thread()...

2020-03-04 16:37:00 186

原创 Java8新特性详解(精编-史上最全版)

一、Lambda表达式在JDK8之前,一个方法能接受的参数都是变量,例如: object.method(Object o)那么,如果需要传入一个动作呢?比如回调。那么你可能会想到匿名内部类。例如:匿名内部类是需要依赖接口的,所以需要先定义个接口@FunctionalInterface public interface PersonCallback { void callback...

2020-02-22 15:39:52 1454

原创 单体架构SSM之深入理解SpringMVC工作原理,像大牛一样手写SpringMVC

一、什么是SpringMVC?SpringMVC是Spring的一个基于MVC三层架构模式的Web应用框架,通过把Model,View,Controller分离,把较为复杂的web应用分成逻辑清晰的几部分,是为了简化开发,减少出错。还是为了组内开发人员之间的配合。总之就是一种分层工作的办法。拥有spring的特性,例如依赖注入。其实简单的来说就是为Java程序提供一个“五星级酒店”,把请求看做是...

2020-02-21 14:15:07 694

原创 框架底层的那些不为人知的密码之Java反射机制

一、反射的概叙什么是Java的反射机制?反射是Java的特征之一,是一种间接操作目标对象的机制,核心是JVM在运行的时候才动态加载类,并且对于任意一个类,都能够知道这个类的所有属性和方法,调用方法/访问属性,不需要提前在编译期知道运行的对象是谁,他允许运行中的Java程序获取类的信息,并且可以操作类或对象内部属性。程序中对象的类型一般都是在编译期就确定下来的,而当我们的程序在运行时,可能需要动...

2020-02-18 19:18:41 211

空空如也

空空如也

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

TA关注的人

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