自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

余笙的博客

记录开发中的点滴

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

原创 7、Spring事务配置下篇

对事务的一些常用参数详情说明,包含传播行为、隔离级别、超时时间、回滚规则、只读事务等,以及事务失效场景分析

2023-03-29 10:22:44 348 1

原创 6、Spring事务配置上篇

主要包含事务核心API,编程式事务,声明式事务的实现

2023-03-28 23:53:21 356

原创 5、基于注解的AOP配置

注解方式实现AOP功能

2023-02-11 23:36:11 1183

原创 4、基于XML的AOP配置

AOP相关的一些概念,以及通过XML方式实现AOP细节说明

2023-02-02 10:41:57 243

原创 3、基于注解的IoC装配与依赖注入

基于注解方式的IoC装配与依赖项注入,包含XML方式开启注解支持;@Configuration注解定义配置类,替换xml配置文件中标签;@ComponentScan注解用于扫描包上的注解将组件加载到IoC容器中;以及一些常见的组件注册注解、属性赋值注解、自动装配注解的使用说明

2023-01-03 23:05:13 470

原创 2、基于XML的依赖注入详细配置

依赖注入详细配置

2022-12-09 16:17:02 1356

原创 1、Spring简介与基于XML的IoC装配

Spring官网将交给Spring管理的对象被称为Bean,Bean对象存放的地方被称为IoC容器,或者Bean工厂将Bean的信息配置.xml文件里可以说是IoC的其中一个内容,在容器实例化对象的时候主动的将被调用者(或者说它的依赖对象)注入给调用对象。也可以理解为:应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源因此DI也称为控制反转(Inversion of Control、IoC)属性说明value设置参数列表参数对应的值,用于设定基本数据类型和String类型的数据index。

2022-12-09 15:26:56 535

原创 十二、Java中的各种锁

对于synchronized而言,也是一种非公平锁同一线程采用循环的方式去尝试获取锁对于ReentrantReadWriteLock其读锁是共享锁,写锁是独占锁保持写操作的可见性锁饥饿问题。

2022-09-20 00:35:10 363

原创 十一、AbstractQueuedSynchronizer源码分析

AbstractQueuedSynchronizer(抽象队列同步器),来自于JDK1.5,位于JUC包下,简称AQS;AQS作为一个抽象类,是构建JUC包中的锁或者其它同步组件的底层基础框架及JUC体系的基石。

2022-09-07 00:30:52 233

原创 十、ThreadLocal

JDK1.2提供,位于java.lang包,ThreadLocal可以提供线程内的局部变量,这种变量在线程的生命周期内起作用,ThreadLocal又叫做线程本地变量或线程本地存储。

2022-08-22 22:29:33 434

原创 九、CompletableFuture异步编排

在JDK1.5之后提供了一个多线程的新的处理接口Callable,该接口需要与Future接口整合在一起,而后再进行最终的异步操作,提升了多线程的处理性能。

2022-08-22 22:23:56 218

原创 八、线程池

在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其他更多资源。在Java中,虚拟机将视图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗费资源的对象的创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些“池化资源”技术产生的原因。

2022-08-22 22:12:03 1165

原创 七、阻塞队列与源码分析(下)

DelayQueue是一个支持延时获取元素的使用优先级队列实现的无界阻塞队列,队列中的元素必须实现Delayed接口和Comparable接口,也就是说DelayQueue里面的元素必须有compareTo()和getDelay()方法存在

2022-08-22 22:01:47 204

原创 六、阻塞队列与源码分析(上)

用于保存一组元素,不过在存取元素的时候必须遵循先进先出原则。队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO——First In First Out)的线性表。

2022-08-22 21:58:09 214

原创 五、同步计数器及源码

CountDownLatch是一个同步辅助类,直译就是倒计数(CountDown)门闩(Latch)。倒计数不用说,门闩的意思就是阻止执行。在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数初始化CountDownLatch。由于调用了countDown()方法,所以在当前计数到达零之前,await()方法会一直受阻塞。之后会释放所有等待的线程,await()的所有后续调用都将立即返回。

2022-08-22 21:51:22 746

原创 四、LockSupport与线程中断

interrupt底层调用Unsafe中的native代码线程首先要获得并持有锁,必须在synchronized或lock中。

2022-08-22 21:45:50 351

原创 三、CAS原理与原子类

这个过程是原子的Unsafe类存在于sun.misc包中CAS是靠硬件实现的从而在硬件层面提升效率,最底层还是交给硬件来保证原子性和可见性减少乐观锁的重试次数/*** CPU核数,用来决定cells(槽数组)的最大长度,cells扩容时会使用到/*** 槽数组,大小为2的幂,2,4,8,16...等/*** 基数,在两种情况下会使用* 1、没有遇到并发竞争时,直接使用base累加数值,通过CAS更新。...

2022-08-22 21:39:09 207

原创 二、Java内存模型与volatile

虽然CPU的发展频率不断地得到提升,但受制于制造工艺以及成本的限制,计算机的内存反倒在访问速度上没有多大的提升,因此CPU的处理速度和内存的访问速度之间的差距越来越大JMM决定一个线程对共享变量的写入何时对另其他线程可见通过这个概念来阐述操作之间的内存可见性如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,并且第一个操作的执行顺序排在第二个操作之前不保证原子性volatile。

2022-08-22 21:24:19 200

原创 一、Synchronized详解与锁升级

对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)Mark Word被设计成一个有着动态定义的数据结构,以便在极小的空间内存储尽量多的数据,根据对象的状态复用自己的存储空间,也就是说在运行期间MarkWord里存储的数据会随着锁标志位的变化而变化无锁9、重量级锁/*** 验证当一个对象计算过hashcode时,它就无法进入到偏向锁状态,* 跳过偏向锁,直接升级为轻量级锁。...

2022-08-22 21:01:59 673

原创 三、SpringBoot整合RabbitMQ

一、SpringBoot整合RabbitMQ1、环境准备1、由于在上一篇中的创建项目是SpringBoot的,直接修改RabbitMQ依赖即可,删除掉之前使用的RabbitMQ依赖<!--RabbitMQ依赖--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifac

2022-04-09 14:30:21 3171

原创 二、RabbitMQ进阶

一、消息可靠性之消息应答1、概述1、消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成了部分突然就挂掉了。RabbitMQ一旦向消费者传递了一条消息,便立即将该消息标记为删除。在这种情况下,突然有个消费者挂掉了,将会丢失找正在处理的消息,以及后续发送给该消费者的消息,因为它无法接受到。2、消息应答:为了保证消息在发送过程中不丢失,RabbitMQ引入消息应答机制;消费者在接收到消息并且处理该消息之后,告诉RabbitMQ它已经处理了,RabbitMQ可以把该消息删除了。

2022-04-09 14:20:51 2150

原创 二十一、JVM可视化监控工具

一、概述1、命令行工具的缺陷1、使用命令行工具或组合能获取目标Java应用性能相关的基础信息,但存在以下缺陷:无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等。需要登录到目标Java应用所在的服务器上,使用不方便。分析数据通过终端输出,结果展示不直观。2、图形化诊断工具1、JDK自带的工具jconsole:JDK自带的可视化监视工具,查看Java应用程序的运行概况、监控堆信息、永久区(元空间)使用情况、类加载情况等。在JDK的bin目录下

2022-02-28 16:08:24 2790

原创 二十、JVM命令行监控工具

一、概述1、导致出现性能问题的因素1、线程控制2、磁盘读写3、数据库访问4、网络I/O5、垃圾收集2、为什么需要调优1、防止出现OOM《关于OOM可以参考》2、解决OOM3、减少Full GC出现的频率3、性能优化的步骤1、性能监控一种以非强行或者入侵方式收集或查看应用运营性能数据的操作。监控通常是指一种在生产、质量评估或者开发环境下实施的带有预防或主动性的操作。当应用出现性能问题却没有足够多的线索时,首先需要进行性能监控,再进行性能分析。通常发现的

2022-02-28 15:11:28 600

原创 十九、ClassLoader与双亲委派机制的补充

一、概述1、说明本篇是对《类加载子系统》的补充。2、ClassLoader的作用ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化等操作。因此,ClassLoader在整个装载阶段,只能影响到类的加载,而无法通过ClassLoader去改变类的链接和初始化行为。

2022-01-05 14:53:04 430

原创 十八、类加载过程详细说明

一、前言1、本篇是对《类加载子系统》的补充。2、在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。二、加载阶段(Loading)1、对加载的理解1、加载(Loading)阶段是整个类加载(Class Loading)过程中的一个阶段。2、加载就是将Java类的字节码文件加载到机器内存中,并在内存中构建出Java类的原型——类模板对象。3、类模板对象其实就是Java类在JVM内存中的一个快照,JVM将从字节码文件中解析出的常

2022-01-02 16:32:43 771

原创 十七、字节码指令

一、字节码指令概述1、概述1、Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行命令。2、Java虚拟机的指令由1个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的0至多个代表此操作所需参数(称为操作数,Operand)而构成。由于Java虚拟机采用面向操作数栈而不是寄存器的结构,所以大多数的指令都不包含操作数,只有一个操作码,指令惨数都存放在操作数栈中。3、字节码指令集可算是一种具有鲜明特点、优势和劣势均很突出的指令集架构,由于限制了Java虚拟机

2021-12-13 23:29:45 2061

原创 十六、Class文件结构下篇

一、Class文件结构之方法表集合1、概述1、methods:指向常量池索引集合,它完整描述了每个方法的签名。在字节码文件中,每一个method_info项都对应着一个类或者接口中的方法信息。比如方法的访问修饰符(public、private或protected),方法的返回值类型以及方法的参数信息等。2、methods表只描述当前类或接口中声明的方,不包括从父类或父接口继承的方法。3、methods表有可能会出现由编译器自动添加的方法,最典型的便是编译器产生的方法信息(比如:类(接口)初始化方法

2021-11-21 20:39:45 752

原创 十五、Class文件结构上篇

一、Java虚拟机概述1、Java虚拟机跨语言的平台1、Java 虚拟机不和包括Java在内的任何语言绑定,它只与"Class文件"这种特定的二进制文件格式所关联。无论使用何种语言进行软件开发,只要将源文件编译为正确的Class文件,那么这种语言就可以在Java虚拟机上执行。可以说,统一而强大的Class文件结构,就是Java虚拟机的基石、桥梁。所有的JVM全部遵守Java虚拟机规范,也就是说所有的JVM环境都是一样的,这样一来字节码文件可以在各种JVM上运行。2、想要让一个Java程序正确地运行

2021-11-20 23:22:53 2001 7

原创 十四、垃圾回收器下篇

一、CMS回收器(低延迟)1、CMS回收器概述1、CMS(Concurrent Mark Sweep)收集器是HosSpot虚拟机中第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程同时工作。2、CMS收集器的关注点是尽可能缩短垃圾收集时用户线程的停顿时间。停顿时间越短(低延迟)就越适合与用户交互的程序,良好的响应速度能提升用户体验。3、目前很大一部分的Java应用集中在互联网网站或者基于浏览器的B/S系统的服务端上,这类应用通常都会较为 关注服务的响应速度,希望系统停顿时间尽可

2021-10-28 18:08:07 181

原创 十三、垃圾回收器上篇

一、GC分类与性能指标1、垃圾回收器概述1、垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。2、由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。3、从不同角度分析垃圾收集器,可以将GC分为不同的类型。4、垃圾收集器分类:按线程数分(垃圾回收线程数),可以分为串行垃圾回收器和并行垃圾回收器。按照工作模式分,可以分为并发式垃圾回收器和独占式垃圾回收器。按碎片处理方式分,可分为压缩式垃圾回收器和非压缩式垃圾回收器。

2021-10-12 23:50:36 194

原创 十二、垃圾回收的一些概念

一、System.gc()的理解1、System.gc()方法概述1、在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。2、调用System.gc()无法保证对垃圾收集器的调用(不能确保立即生效)。3、一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则太过麻烦了。2、尝试手动触发GCpublic class SystemGCTest { pu

2021-10-07 16:15:26 2109

原创 十一、垃圾回收概述与相关算法

一、垃圾回收概述1、前言1、Java和C++语言的区别,就在于垃圾收集技术和内存动态分配上,C没有垃圾收集技术,需要手动收集。垃圾收集机制是Java的招牌能力,极大的提高了开发效率。2、什么是垃圾(Garbage)1、垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。2、如果不及时对内存中的垃圾进行清理,那么这些垃圾对象所占用的内存空间会一直保留到应用程序的结束,被保留的空间无法被其他对象使用,甚至可能导致内存溢出。3、为什么需要GC1、对于高级语言来说,一

2021-10-02 17:12:10 360

原创 十、StringTable

一、String的基本特性1、String的特性1、String:字符串,使用一对""引起来表示。字面量的定义方式:String s1 = "hello";类的构造定义方式:String s2 = new String("hello");2、String声明为final的,不可被继承。3、String实现了Serializable接口:表示字符串是支持序列化的。4、实现了Comparable接口:表示字符串可以比较大小。5、String在JDK8及之前内部定义了final ch

2021-09-23 18:12:24 170

原创 九、执行引擎

一、执行引擎概述1、执行引擎概述1、执行引擎是Java虚拟机核心的组成部分之一。2、“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执 行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。3、执行引擎位置:属于JVM的下层,里面包含:解释器、即时编译器、垃圾回收器。4、JVM的主要任务是负责装载字节码到其内部,但字

2021-09-20 23:33:18 341 2

原创 八、探秘HotSpot虚拟机对象与直接内存

一、对象的创建1、创建对象的几种方式new:最常见的方式、单例类中调用getInstance的静态类方法,XXXFactory的静态方法。Class的newInstance方法:反射的方式,在JDK9中被标记为过时的方法,因为只能调用空参的构造方法,权限必须是public。Constructor的newInstance(xxx):反射的方式,可以调用空参、有参的构造器,任意权限。clone():不调用任何构造器,当前类需要实现Cloneable接口,实现clone()方法。

2021-09-12 23:53:34 302

原创 七、方法区

一、方法区的理解1、栈、堆、方法区的交互关系从内存结构上看:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zf0Cfbym-1631460810730)(images\img7\1.png)]从线程共享与否的角度上看:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v85SoF3C-1631460810735)(images\img7\2.png)]对象的访问定位:1、Person类的.class信息存放在元空间或方法区(运行时常

2021-09-12 23:48:21 181

原创 六、Java堆

一、堆的核心概述1、概述1、堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的。2、一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。3、Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。4、《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。5、所有的线程共享Java堆,在这里还可以划分线程私有的

2021-09-12 23:31:13 1604

原创 五、本地方法接口和本地方法栈

一、本地方法接口1、本地方法解释简单地讲,一个Native Method是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern “C” 告知C++编译器去调用一个C的函数。“A native method is a Java method whose implementation is provided by non-jav

2021-09-06 14:29:41 153

原创 四、虚拟机栈

一、虚拟机栈概述1、虚拟机栈出现的背景由于跨平台性的设计,Java的指令都是根据栈来设计的。不同的平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。2、内存中的堆与栈栈是运行时的单位,而堆是存储的单位。栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,放哪里3、Java虚拟机栈Java虚拟机栈(Java Virtual Machine S

2021-09-06 14:04:19 180

原创 三、运行时数据区域概述

一、运行时数据区1、概述运行时数据区:它是在类加载完成后的阶段当我们通过前面的:类的加载 -> 验证 -> 准备 -> 解析 -> 初始化,这几个阶段完成后,就会用到执行引擎对类进行使用,同时执行引擎将会使用到运行时数据区2、运行时数据区完整图内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机

2021-08-31 16:15:08 501

空空如也

空空如也

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

TA关注的人

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