自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(670)
  • 资源 (3)
  • 问答 (1)
  • 收藏
  • 关注

转载 自定义Spring Boot自动装配

通常开发人员将通用的逻辑打包到独立JAR文件中,供上层应用使用,不同的运行环境或框架有其独特的SPI机制,作为通用框架的Spring Boot也不例外,当注解@EnableAutoConfiguration激活自动装配后,META/spring.factories资源中声明的@Configuration类随即被装配。从底层来讲,自动配置(auto-configuration)是通过标准的@Configuration类实现的。此外,@Conditional注解用来约束自动配置生效的条件。通常自动配置类需要使

2021-05-08 00:55:07 606

转载 深入理解堆外内存 Metaspace

在之前介绍的分代垃圾回收算法中,我们一直有一个永久代存在,叫 PermGen,内存上它是挨着堆的。为了垃圾回收方便,HotSpot 在永久代上一直是使用老年代的垃圾回收算法。永久代主要存放以下数据:JVM internal representation of classes and their metadataClass staticsInterned strings从 JDK7 开始,JDK 开发者们就有消灭永久代的打算了。有部分数据移到永久代之外了:Symbols => nati

2021-04-24 22:05:10 16118

转载 什么是零拷贝

平时在面试中你肯定会经常碰见的问题就是:RocketMQ为什么快?Kafka为什么快?什么是mmap?这一类的问题都逃不过的一个点就是零拷贝,虽然还有一些其他的原因,但是今天我们的话题主要就是零拷贝。传统IO在开始谈零拷贝之前,首先要对传统的IO方式有一个概念。基于传统的IO方式,底层实际上通过调用read()和write()来实现。通过read()把数据从硬盘读取到内核缓冲区,再复制到用户缓冲区;然后再通过write()写入到socket缓冲区,最后写入网卡设备。整个过程发生了4次用户态和内

2021-04-06 16:39:12 500

原创 SpringBoot自动装配

在使用Spring Framework时,当@Component或@Configuration Class需要被配置时,应用需要借助@Import或@ComponentScan的能力,由于应用依赖JAR存在变化的可能,因此其中的@Component类所在的包路径也随之不确定,如果要实现当前应用所有组件自动装配,则@Import显然是无能为力的,开发人员自然会想到使用@ComponentScan扫描应用默认包路径,理论上默认包及其子包下的所有@Component类均会被@ComponentScan注册为Spr

2021-04-02 15:54:03 5368

原创 最长的回文子串

题目给你一个字符串 s,找到 s 中最长的回文子串。示例示例 1:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。示例 2:输入:s = “cbbd”输出:“bb”示例 3:输入:s = “a”输出:“a”示例 4:输入:s = “ac”输出:“a”实现暴力解法class Solution { public static void main(String[] args) { String res = longe

2021-03-11 23:40:21 299

原创 生成N对括号所有可能的有效括号组合

题目数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]思路核心是必须要先有一个左括号才能给字符串添加括号,且无论何时右括号的个数一定要小于等于左括号的个数。实现import java.util.ArrayList;import java.util.List;class

2021-03-11 22:28:00 2623

转载 Spring是如何解决循环依赖的

1.由同事抛的一个问题开始最近项目组的一个同事遇到了一个问题,问我的意见,一下子引起的我的兴趣,因为这个问题我也是第一次遇到。平时自认为对spring循环依赖问题还是比较了解的,直到遇到这个和后面的几个问题后,重新刷新了我的认识。我们先看看当时出问题的代码片段:@Servicepublicclass TestService1 { @Autowired private TestService2 testService2; @Async public void tes

2021-03-07 15:26:26 686

转载 查找Java程序CPU高负荷步骤

步骤一:找到最耗CPU的进程top -c键入P(大写),进程按照CPU使用率排序步骤二:找到最耗CPU的线程top -Hp pid 显示一个进程的线程运行信息列表键入P(大写),线程按照CPU使用率排序步骤三:将线程PID转化为16进制(应为线程堆栈里,线程id使用16进制表示的)pringf “%x\n” pid步骤四: 查看堆栈,找到线程在干嘛jstack pid | grep ‘16进制的数字’ -c5 --color找到了耗CPU搞的线程对应的线程名称,看到了该线程正在执行的堆栈

2021-03-05 17:05:18 208 1

转载 mysql insert 加锁流程

INSERT sets an exclusive lock on the inserted row. This lock is an index-record lock, not a next-key lock (that is, there is no gap lock) and does not prevent other sessions from inserting into the gap before the inserted row.insert 会对插入成功的行加上排他锁。这个锁不是索引记

2021-03-01 12:14:31 2929

原创 数字金额转中文大写金额

public static String transAmount2Chinese(long amount) { //每4位一组,每一组多一位分隔符splits String[] unit = {"", "拾", "佰", "仟"}; //个、十、百、千、万、十万、百万、千万、亿、十亿、百亿、千亿 、兆、十兆、百兆、千兆、 //京、十京、百京、千京、垓、十垓、百垓、千垓、秭、十秭、百秭、千秭、穰、十穰、百穰、千穰、沟、十沟、百沟... String[] splits =

2021-02-24 00:45:27 1805

原创 偏向锁、轻量级锁、重量级锁解析

Java 对象头在32位虚拟机和64位虚拟机的 Mark Word 所占用的字节大小不一样,32位虚拟机的 Mark Word 和 class Pointer 分别占用 32bits 的字节,而 64位虚拟机的 Mark Word 和 class Pointer 占用了64bits 的字节,下面我们以 32位虚拟机为例,来看一下其 Mark Word 的字节具体是如何分配的32位虚拟机64位虚拟机偏向锁、轻量级锁的状态转化及对象Mark Word的关系偏向锁的获得和撤销流程时序图流程图

2021-02-19 21:39:56 5147 6

转载 Kafka高级应用

除了正常的消息发送和消费, 在使用Kafka的过程中难免会遇到一些其他高级应用类的需求, 比如消费回溯, 这个可以通过原生Kafka提供的Kafka Consumer.seek() 方法来实现, 然而类似延时队列、消息轨迹等应用需求在原生Kafka中就没有提供了。我们在使用其他消息中间件时, 比如Rabbit MQ,使用到了延时队列、消息轨迹的功能, 如果我们将应用直接切换到Kafka中, 那么只能选择舍弃它们。但这也不是绝对的, 我们可以通过一定的手段来扩展Kafka, 本章讲述的就是如何实现这类扩展的高

2021-02-03 16:32:43 2393

转载 Kafka 监控

任何应用功能再强大、性能再优越,如果没有与之匹配的监控,那么一切都是虚无缥缈的。监控不仅可以为应用提供运行时的数据作为依据参考,还可以迅速定位问题,提供预防及告警等功能, 很大程度上增强了整体服务的鲁棒性。目前的Kafka监控产品有很多, 比如Kafka Manager、Kafka Eagle、Kafka Monitor、Kafka Offset Monitor、Kafka Web Console、Burrow等,它们都有各自的优缺点。以Kafka Manager为例, 它提供的监控功能也是相对比较完善的,

2021-01-31 22:17:18 1305

转载 Kafka 应用

1、命令行工具Kafka 中提供了许多命令行工具(位于$KAFKA_HOME/bin 目录下)用于管理集群的变更。脚本名称释义kafka-configs.sh用于配置管理,在4.1.5节和4.3.3节中有所提及kafka-console-consumer.sh用于消费消息,在1.3节和7.3节中有所提及kafka-console-producer.sh用于生产消息,在1.3节中有所提及kafka-consumer-perf-test.sh用于测试消费性能,在

2021-01-31 21:25:37 664

原创 MySQL常用命令

MySQL视图相关创建视图mysql> create view v_t as select * from t where id<10;视图定义中的 WITH CHECK OPTION就是针对于可更新的视图的,即更新的值是否需要检查mysql> alter view v_t as select * from t where id<10 with check option;SHOW TABLES命令把表和视图都显示出来mysql> show tables;若用

2021-01-31 14:06:03 922

转载 【Java基础】Java char 型了解一下

Java 中 char 型,两字节,16位,字面量用单引号扩起来,例如 ‘A’ 是编码值为 65 所对应的字符常量。 ‘A’ 与 “A” 不同,后者是包含一个字符 A 的字符串。所以 char 型有什么特别的地方呢?Talk is cheap, show you my code!public class Demo{ public static void main(String... args){ String str = " "; System.out.print

2021-01-18 14:47:34 3751

转载 RateLimiter 源码分析(Guava 和 Sentinel 实现)

本文主要介绍关于流控的两部分内容。第一部分介绍 Guava 中 RateLimiter 的源码,包括它的两种模式,目前网上大部分文章只分析简单的 SmoothBursty 模式,而没有分析带有预热的 SmoothWarmingUp。第二部分介绍 Sentinel 中流控的实现,本文不要求读者了解 Sentinel,这部分内容和 Sentinel 耦合很低,所以读者不需要有阅读压力。Sentinel 中流控设计是参考 Guava RateLimiter 的,所以阅读第二部分内容,需要有第一部分内容的背景

2021-01-03 18:07:37 811

转载 阿里 Sentinel 源码解析

本文介绍阿里开源的 Sentinel 源码,GitHub: alibaba/Sentinel,基于当前(2019-12)最新的 release 版本 1.7.0。总体来说,Sentinel 的源码比较简单,复杂的部分在于它的模型对于初学者来说不好理解。虽然本文不是很长,最后两节还和主流程无关,但是,本文对于源码分析已经非常细致了。阅读建议:在阅读本文前,你应该至少了解过 Sentinel 是什么,如果使用过 Sentinel 或已经阅读过部分源码那就更好了。另外,本文不涉及到集群流控。由于很多读者也

2021-01-03 17:51:55 698

转载 Semi-join Materialization 子查询优化策略

什么是 Semi-join常规联接中,结果可能会出现重复值,而子查询可以获得无重复的结果。比如需要找出有人口大于 2000 万的城市的国家,如果用普通联接,则可能出现重复结果:select country.* from country join city on country.code=city.country_code and population>20000000;+---------+----------+| code | name |+---------+-------

2021-01-03 17:27:06 446

转载 附录D 对象查询语言(OQL)简介

1 SELECT子句SELECT子句用于确定查询语句需要从堆转储快照中选择什么内容。如果需要显示堆转储快照中的对象,并且浏览这些对象的引用关系,可以使用“*”,这与传统SQL语句中的习惯是一致的,如:SELECT * FROM java.lang.String 1.选择特定的显示列查询也可以选择特定的需要显示的字段,如:SELECT toString(s), s.count, s.value FROM java.lang.String s 查询可以通过“@”符号来使用Java对象的内存属性访

2021-01-03 17:06:17 1665

转载 线程安全与锁优化

1 概述在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和解决问题,被称为面向过程的编程思想。与此相对,面向对象的编程思想则站在现实世界的角度去抽象和解决问题,它把数据和行为都看作对象的一部分,这样可以让程序员能以符合现实世界的思维方式来编写和组织程序。面向对象的编程思想极大地提升了现代软件开发的效率和软件可以达到的规模,但是现实世界与计算机世界之间不可避免地存在

2021-01-03 14:31:06 315

转载 Java内存模型与线程

1 概述多任务处理在现代计算机操作系统中几乎已是一项必备的功能了。在许多场景下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统的速度差距太大,大量的时间都花费在磁盘I/O、网络通信或者数据库访问上。如果不希望处理器在大部分时间里都处于等待其他资源的空闲状态,就必须使用一些手段去把处理器的运算能力“压榨”出来,否则就会造成很大的性能浪费,而让计算机同时处理几项任务则是最容易想到,也被证明是非常有效的“压榨”手段。除了充分利用计算机处

2021-01-02 22:38:02 272

转载 后端编译与优化

1 概述如果我们把字节码看作是程序语言的一种中间表示形式(Intermediate Representation,IR)的话,那编译器无论在何时、在何种状态下把Class文件转换成与本地基础设施(硬件指令集、操作系统)相关的二进制机器码,它都可以视为整个编译过程的后端。如果读者阅读过本书的第2版,可能会发现本章的标题已经从“运行期编译与优化”悄然改成了“后端编译与优化”,这是因为在2012年的Java世界里,虽然提前编译(Ahead Of Time,AOT)早已有所应用,但相对而言,即时编译(Just I

2021-01-01 18:52:22 1418

转载 前端编译与优化

1 概述在Java技术下谈“编译期”而没有具体上下文语境的话,其实是一句很含糊的表述,因为它可能是 指一个前端编译器(叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;也可能是 指Java虚拟机的即时编译器(常称JIT编译器,Just In Time Compiler)运行期把字节码转变成本地机器 码的过程;还可能是指使用静态的提前编译器(常称AOT编译器,Ahead Of Time Compiler)直接把程 序编译成与目标机器指令集相关的二进制代码的过程。下面笔者列举了这

2021-01-01 14:43:46 915

转载 类加载及执行子系统的案例与实战

1 概述在Class文件格式与执行引擎这部分里,用户的程序能直接参与的内容并不太多,Class文件以何种格式存储,类型何时加载、如何连接,以及虚拟机如何执行字节码指令等都是由虚拟机直接控制的行为,用户程序无法对其进行改变。能通过程序进行操作的,主要是字节码生成与类加载器这两部分的功能,但仅仅在如何处理这两点上,就已经出现了许多值得欣赏和借鉴的思路,这些思路后来成为许多常用功能和程序实现的基础。在本章中,我们将看一下前面所学的知识在实际开发之中是如何应用的。2 案例分析在案例分析部分,笔者准备了4个例子

2020-12-31 17:54:33 274

转载 虚拟机字节码执行引擎

1 概述执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。在《Java虚拟机规范》中制定了Java虚拟机字节码执行引擎的概念模型,这个概念模型成为各大发行商的Java虚拟机执行引擎的统一外观(Facade)。在不同的虚拟机实现中,

2020-12-29 00:20:52 355

转载 Java模块化系统

在JDK 9中引入的Java模块化系统(Java Platform Module System,JPMS)是对Java技术的一次重要升级,为了能够实现模块化的关键目标——可配置的封装隔离机制,Java虚拟机对类加载架构也做出了相应的变动调整,才使模块化系统得以顺利地运作。JDK 9的模块不仅仅像之前的JAR包那样只是简单地充当代码的容器,除了代码外,Java的模块定义还包含以下内容:依赖其他模块的列表。导出的包列表,即其他模块可以使用的列表。开放的包列表,即其他模块可反射访问模块的列表。使用的服务

2020-12-28 01:02:19 1100

转载 字节码指令简介

Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode) 以及跟随其后的零至多个代表此操作所需的参数(称为操作数,Operand)构成。由于Java虚拟机采用 面向操作数栈而不是面向寄存器的架构(这两种架构的执行过程、区别和影响将在第8章中探讨),所 以大多数指令都不包含操作数,只有一个操作码,指令参数都存放在操作数栈中。字节码指令集可算是一种具有鲜明特点、优势和劣势均很突出的指令集架构,由于限制了Java虚 拟机操作码的长度为一个字节(即0~255),这意味着指令集

2020-12-27 15:32:26 1721

转载 Class类文件的结构

任何一个Class文件都对应着唯一的一个类或接口的定义信息[1],但是反过来说,类或接口并不一定都得定义在文件里(譬如类或接口也可以动态生成,直接送入类加载器中)。本章中,笔者只是通俗地将任意一个有效的类或接口所应当满足的格式称为“Class文件格式”,实际上它完全不需要以磁盘文件的形式存在。Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用

2020-12-26 17:25:50 669 2

转载 实战:Eclipse运行速度调优

很多Java开发人员都有一种错觉,认为系统调优的工作都是针对服务端应用的,规模越大的系统,就需要越专业的调优运维团队参与。这个观点不能说不对,只是有点狭隘了。上一节中笔者所列举的案例确实大多是服务端运维、调优的例子,但不只服务端需要调优,其他应用类型也是需要的,作为一个普通的Java开发人员,学习到的各种虚拟机的原理和最佳实践方法距离我们并不遥远,开发者身边就有很多场景可以使用上这些知识。下面就通过一个普通程序员日常工作中可以随时接触到的开发工具开始这次实战[1]。1、调优前的程序运行状态笔者使用Ecl

2020-12-25 17:38:42 2289 1

转载 JVM调优案例分析

1、大内存硬件上的程序部署策略这是笔者很久之前处理过的一个案例,但今天仍然具有代表性。一个15万PV/日左右的在线文档类型网站最近更换了硬件系统,服务器的硬件为四路志强处理器、16GB物理内存,操作系统为64位 CentOS 5.4,Resin作为Web服务器。整个服务器暂时没有部署别的应用,所有硬件资源都可以提供给这访问量并不算太大的文档网站使用。软件版本选用的是64位的JDK 5,管理员启用了一个虚拟机实例,使用-Xmx和-Xms参数将Java堆大小固定在12GB。使用一段时间后发现服务器的运行效果十

2020-12-25 16:26:50 1791 2

转载 HotSpot虚拟机插件及工具

HotSpot虚拟机发展了二十余年,现在已经是一套很复杂的软件系统,如果深入挖掘HotSpot的源码,可以发现在HotSpot的研发过程中,开发团队曾经编写(或者收集)过不少虚拟机的插件和辅助工 具,它们存放在HotSpot源码hotspot/src/share/tools目录下,包括(含曾经有过但新版本中已被移除 的):Ideal Graph Visualizer:用于可视化展示C2即时编译器是如何将字节码转化为理想图,然后转化为机器码的。Client Compiler Visualizer[1]:

2020-12-25 14:50:08 759

转载 JDK可视化故障处理工具

JDK中除了附带大量的命令行工具外,还提供了几个功能集成度更高的可视化工具,用户可以使 用这些可视化工具以更加便捷的方式进行进程故障诊断和调试工作。这类工具主要包括JConsole、 JHSDB、VisualVM和JMC四个。其中,JConsole是最古老,早在JDK 5时期就已经存在的虚拟机监控 工具,而JHSDB虽然名义上是JDK 9中才正式提供,但之前已经以sa-jdi.jar包里面的HSDB(可视化工具)和CLHSDB(命令行工具)的形式存在了很长一段时间[1]。它们两个都是JDK的正式成员,随着

2020-12-25 01:53:40 763

原创 查找MySQL查询语句被阻塞阻塞原因

查询长时间不返回,一般碰到这种情况的话,大概率是表t被锁住了。接下来分析原因的时候,一般都是首先执行一下show processlist命令,看看当前语句处于什么状态。然后我们再针对每种状态,去分析它们产生的原因、如何复现,以及如何处理。首先执行一下show processlist命令,看看当前语句处于什么状态。mysql> show processlist;等MDL锁show processlist命令查看State列显示为Waiting for table metadata lock。

2020-12-05 14:05:51 5479

原创 如何解决并发关注下是否为好友

业务需求业务上有这样的需求,A、B两个用户,如果互相关注,则成为好友。设计上是有两张表,一个是like表,一个是friend表,like表有user_id、liker_id两个字段,我设置为复合唯一索引即uk_user_id_liker_id。CREATE TABLE `like` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `liker_id` int(11) NOT NULL, PRIMARY

2020-12-05 00:25:43 557 4

转载 架构师之路19年文章精选120篇

硬核技术:《InnoDB架构,一幅图秒懂!》1.7W+《写缓冲(change buffer),这次彻底懂了》1.9W+《缓冲池(buffer pool),这次彻底懂了》2.6W+《(double write buffer),你居然没听过?》1.3W+《InnoDB到底支不支持哈希索引?》1W+《事务已提交,数据却丢了,为啥!》1.5W+《批量删除数据,常见的大坑!》1.6W+《memcache内核实现细节》1.8W+《微服务架构,脱不开的RPC细节》3.3W+《一次性搞透

2020-12-04 01:59:25 469

原创 常用工具备忘录

把日常经常使用到了工具命令记录在此,持续更新。JDKJDK基础故障处理工具MySQL查看当前事务隔离级别mysql> show variables like ‘transaction_isolation’;提交事务并自动启动下一个事务mysql> commit work and chain查找持续时间超过60s的事务mysql> select * from information_schema.innodb_trx where TIME_TO_SEC(timediff

2020-12-04 01:55:39 423

转载 CompletableFuture -- 如何构建异步应用

什么是Future 接口很多场景下,我们想去获取线程运行的结果,而通常使用execute方法去提交任务是无法获得结果的,这时候我们常常会改用submit方法去提交,以便获得线程运行的结果。而submit方法返回的就是Future,一个未来对象。 使用future.get() 方法去获取线程执行结果,包括如果出现异常,也会随get方法抛出。Future 接口的缺陷当我们使用future.get()方法去取得线程执行结果时,要知道get方法是阻塞的,也就是说为了拿到结果,当主线程执行到get()方法,当

2020-12-01 15:43:54 399

转载 JDK基础故障处理工具

JDK的bin目录中有各种小工具,这些故障处理工具并不单纯是被Oracle公司作为“礼物”附赠给JDK的使用者,根据软件可用性和授 权的不同,可以把它们划分成三类:商业授权工具:主要是JMC(Java Mission Control)及它要使用到的JFR(Java Flight Recorder),JMC这个原本来自于JRockit的运维监控套件从JDK 7 Update 40开始就被集成到OracleJDK 中,JDK 11之前都无须独立下载,但是在商业环境中使用它则是要付费的[1]。正式支持工具:

2020-11-29 17:55:49 6687

原创 构建StateMachine

在上一篇《Spring Statemachine使用入门》中,我们使用过了StateMachineBuilder的内部类Builder创建了一个StateMachine对象,接下来我们具体来分析一下使用StateMachineBuilder.Builder创建状态机的具体过程。StateMachineBuilder只有一个方法builder()并且没有任何成员变量,builder()方法返回一...

2020-11-22 16:56:57 1593

html5帮助文档

很好的html5帮助文档, 值得拥有。

2012-06-14

css2.0cmh文档

内容比较全,讲解比较到位,很适合下载使用

2012-03-19

java编程思想第四版(含源码和课后答案)pdf

java编程思想第四版pdf包括源码和课后答案

2012-03-03

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

TA关注的人

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