自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 资源 (1)
  • 收藏
  • 关注

原创 java各集合的时间复杂度

文章目录 前言数组 Array数组列表 ArrayList链接列表 LinkedList双链接列表 Doubly-Linked List栈 Stack队列 Queue/Deque/Circular Queue二叉搜索树 Binary Search Tree红黑树 Red-Black Tree堆 Heap/PriorityQue...

2020-10-20 23:40:52 718 3

原创 Kafka为什么快,吞吐量大

学无止境,加油!Kafka是大数据领域无处不在的消息中间件,目前广泛使用在企业内部的实时数据管道,并帮助企业构建自己的流计算应用程序。Kafka虽然是基于磁盘做的数据存储,但却具有高性能、高吞吐、低延时的特点,其吞吐量动辄几万、几十上百万。但是很多使用过Kafka的人,经常会被问到这样一个问题,Kafka为什么速度快,吞吐量大;大部分被问的人都是一下子就懵了,或者是只知道一些简单的点,本文就简单的介绍一下Kafka为什么吞吐量大,速度快。一、顺序读写众所周知Kafka是将消息记录持久化到本地磁盘中

2020-10-19 00:32:29 611

原创 mysql为什么不推荐使用uuid作为主键

前言:在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处?本篇博客我们就来分析这个问题,探讨一下内部的原因。本篇博客的目录一:mysql程序实例二:使用uuid和自增id的索引结构对比三:总结一:mysql和程序实例1.1:要说明这个问题,我们首先来建立三张表,分别是user_auto_key,user_uuid

2020-10-17 17:25:46 1276 2

原创 pgsql的索引种类

索引是增强数据库性能的利器,在检索某些特定行的时候效率会有很大提升,postgresql中索引类型丰富,每种索引有着不同的应用场景,下面简单介绍一下。索引类型与场景BTree  • =, >, >=, <, <=、排序Hash  • =GIN  • 多值类型(数组、全文检索、枚举、网络地址类型):包含、相交  • JSON类型  • 普通类型(通过btree_gin 插件支持):与B-Tree类似  • 字符串(通过pg_trgm 插件支持):模糊查询、相似查询

2020-10-17 16:49:47 1425 1

原创 Dubbo框架原理剖析(通俗易懂)

Java NIO:Buffer、Channel 和 Selector详解(通俗易懂) Dubbo框架原理剖析 文章目录 背景简单介绍核心功能 架构原理节点角色说明调用关系说明 服务发布与引用spring配置声明服务spring解析配置如何暴露服务服务引

2020-10-17 13:17:27 1524 1

原创 HashMap 和 ConcurrentHashMap原理剖析(jdk7/8)

今天发一篇"水文",可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍。本来以为花不了多少时间的,不过最终还是投入了挺多时间来完成这篇文章的。网上关于 HashMap 和 ConcurrentHashMap 的文章确实不少,不过缺斤少两的文章比较多,所以才想自己也写一篇,把细节说清楚说透,尤其像 Java8 中的 ConcurrentHashMap,大部分文章都说不清楚。终归是希望能降低大家学习的成本,不希望大家到处找各种不是很靠谱的文章,看完一篇又一篇,可是还是模模糊糊。阅

2020-10-13 19:56:23 1248

原创 深入理解堆外内存 Metaspace

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

2020-10-13 19:51:13 961

原创 G1 垃圾收集器介绍(通俗易懂)

JVM 内存管理(垃圾收集)文章目录[ JVM 内存管理(垃圾收集)](https://blog.csdn.net/qq_36704549/article/details/109032103)G1 总览G1 工作流程年轻代收集Old GC / 并发标记周期混合垃圾回收周期Full GC简单小结G1 参数配置和最佳实践小结之前根据 Sun 的内存管理白皮书介绍了在 HotSpot JVM 分代算法中的几个垃圾收集器,本文将介绍 G1 垃圾收集器。G1 的主要关注点在于达到可控的停顿时间,在这个基础上尽.

2020-10-13 19:21:38 661

原创 JVM 内存管理(垃圾收集)

关于 JVM 内存管理或者说垃圾收集,大家可能看过很多的文章了,笔者准备给大家总结下。这算是系列的第一篇,接下来一段时间会持续更新。本文主要是翻译《Memory Management in the Java HotSpot Virtual Machine》白皮书的前四章内容,这是 2006 的老文章了,当年发布这篇文章的还是 Sun Microsystems,以后应该会越来越少人记得这家曾经无比伟大的公司了。虽然这个白皮书有点老了,不过那个时候 Sun 在 J2SE 5.0 版本的 HotSpot 虚拟

2020-10-12 17:18:41 685

原创 Java 内存模型和并发

本文的主要目的是让大家对于并发程序中的重排序、内存可见性以及原子性有一定的了解,同时要能准确理解 synchronized、volatile、final 几个关键字的作用。另外,本文还对双重检查形式的单例模式为什么需要使用 volatile 做了深入的解释。并发三问题这节将介绍重排序、内存可见性以及原子性相关的知识,这些也是并发程序为什么难写的原因。1. 重排序请读者先在自己的电脑上运行一下以下程序:public class Test { private static int

2020-10-12 17:15:50 1196

原创 Java 非阻塞 IO 和异步 IO区别(详解)

上一篇文章介绍了 Java NIO 中 Buffer、Channel 和 Selector 的基本操作,主要是一些接口操作,比较简单。本文将介绍非阻塞 IO 和异步 IO,也就是大家耳熟能详的 NIO 和 AIO。很多初学者可能分不清楚异步和非阻塞的区别,只是在各种场合能听到异步非阻塞这个词。本文会先介绍并演示阻塞模式,然后引入非阻塞模式来对阻塞模式进行优化,最后再介绍 JDK7 引入的异步 IO,由于网上关于异步 IO 的介绍相对较少,所以这部分内容我会介绍得具体一些。希望看完本文,读者可以对非阻塞

2020-10-11 17:13:29 1304

原创 Java NIO:Buffer、Channel 和 Selector详解(通俗易懂)

文章目录Bufferposition、limit、capacity初始化 Buffer填充 Buffer提取 Buffer 中的值mark() & reset()rewind() & clear() & compact()ChannelFileChannelSocketChannelServerSocketChannelDatagramChannelSelector小结本文将介绍 Java NIO 中三大组件 Buffer、Channel、Selector 的使用。本来要一起介绍

2020-10-11 17:11:02 1329 5

原创 Netty源码分析(一)(超详细)

本文又是一篇源码分析文章,我是真不太爱写源码分析。因为要花非常多的时间,而且很多地方需要反复组织语言。本文将介绍 Netty,Java 平台上使用最广泛的 NIO 包,它是对 JDK 中的 NIO 实现的一层封装,让我们能更方便地开发 NIO 程序。其实,Netty 不仅仅是 NIO 吧,但是,基本上大家都冲着 NIO 来的。个人感觉国内对于 Netty 的吹嘘是有点过了,主要是很多人靠它吃饭,要么是搞培训的,要么是出书的,恨不得把 Netty 吹上天去,这种现象也是挺不好的,反而使得初学者觉得 Net

2020-10-10 14:10:07 2136

原创 zookeeper的原理和应用

场景一有这样一个场景:系统中有大约100w的用户,每个用户平 均有3个邮箱账号,每隔5分钟,每个邮箱账需要收取100封邮件,最多3亿份邮件需要下载到服务器中(不含附件和正文)。用20台机器划分计算的压力,从 多个不同的网路出口进行访问外网,计算的压力得到缓解,那么每台机器的计算压力也不会很大了。        通过我们的讨论和以往的经验判断在这场景中可以实现并行计算,但我们还期望能对...

2020-10-09 14:57:57 875 1

原创 JAVA+字符串常量池介绍

本文将介绍 HotSpot 中的 String Pool,字符串常量池。相对是一篇比较简单的文章,大家花几分钟就看完了。在 Java 世界中,构造一个 Java 对象是一个相对比较重的活,而且还需要垃圾回收,而缓存池就是为了缓解这个问题的。我们来看下基础类型的包装类的缓存,Integer 默认缓存 -128 ~ 127 区间的值,Long 和 Short 也是缓存了这个区间的值,Byte 只能表示 -127 ~ 128 范围的值,全部缓存了,Character 缓存了 0 ~ 127 的值。Float

2020-10-09 09:06:52 1318 7

原创 线程池源码解读(保证让你受益匪浅系列)

name: java-thread-pooltitle: 深度解读 java 线程池设计思想及源码实现date: 2020-09-25 14:22:29tags:categories: concurrency我相信大家都看过很多的关于线程池的文章,基本上也是面试的时候必问的,如果你在看过很多文章以后,还是一知半解的,那希望这篇文章能让你真正的掌握好 Java 线程池。本文一大重点是源码解析,同时会有少量篇幅介绍线程池设计思想以及作者 Doug Lea 实现过程中的一些巧妙用法。本文还是会一行.

2020-09-29 14:25:57 876

原创 Spring IOC 容器源码解读(保证是你见过最牛的)

name: spring-ioctitle: Spring IOC 容器源码分析date: 2020-05-22 16:25:30tags:categories: open-sourceSpring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器。既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文并不能让你成为 Spring 专家,不过一定有助于大家理解 Spring 的很多概念,帮助大家排查应用中和 Sp.

2020-09-27 15:42:00 767 10

原创 Spring AOP 源码解读(保证是你看过最牛的)

name: spring-aop-sourcetitle: Spring AOP 源码解析date: 2020-03-25 15:03:38tags: spring-aop-sourcecategories:文章目录前言本文使用的调试代码IOC 容器管理 AOP 实例ProxyFactory 详解基于注解的 Spring AOP 源码分析闲聊 InstantiationAwareBeanPostProcessor小结之前写过 IOC 的源码分析,那篇文章真的有点长,看完需要点耐心。很多读者希.

2020-09-27 15:32:00 2371 4

原创 自己总结的面试题

解释不清楚就不解释,直接说怎么用就ok 不要在意问题的本身答案 靠的是你们如何使用 原理的理解锁表什么时候出现同步锁锁的是什么 ***彻底理解Runnable和Thread的区别 没有本质区别就一个接口一个类java基础索引为什么会快加密算法 sha1 hash强散列 (优先级低)1、集合 hashmap原理(https://blog.csdn.net/chenwen...

2020-03-01 11:56:21 817

原创 最通俗易懂的设计模式解读(保证看这一篇就够了)

spring有多种依赖注入的形式,下面介绍spring进行DI的方式:一.目前使用最广泛的 @Autowired:自动装配自动装配,用于替代基于XML配置的自动装配,详见【3.3.3 自动装配】。基于@Autowired的自动装配,默认是根据类型注入,可以用于构造器、字段、方法注入,使用方式如下:java代码:@Autowired(required=true)构造器、字段、方法@A...

2020-02-27 10:50:37 732

原创 JAVA线程池执行逻辑详解

问题:为什么要使用线程池线程在使用过程中遇到的问题:1、线程在Java中是一个对象,也是操作系统的重要资源,线程的创建、销毁需要时间,如果创建时间+销毁时间>执行              任务的时间那就很不合算了2、Java对象占用堆内存,操作系统线程占用系统内存年,根据JVM规范,一个线程默认最大栈大小1M,这个栈空间是             需要从

2020-11-06 08:53:19 129

原创 RocketMQ原理源码解析

本文的内容主要包括:MQ的对比和选型、RocketMQ原理、RocketMQ源码解析、事务消息。 如发现本文中所写有错误或者不准确之处,非常欢迎指出,我会及时调研修正! ps:转载的同学请标出原文链接,尊重别人的劳动成果,谢谢!   Rocketmq性能压测客户端:https://github.com/Force-King/rocketmq-test   一、MQ的对比和选型 目前业界主要的消息中间件有:ActiveMQ、Rabbi...

2020-11-05 22:38:30 51 2

原创 分布式系统中的CAP详解

Eureka服务治理机制与Dubbo服务治理机制的比较 FeatureEurekaZookeeper服务健康检查可配支持(弱)长连接,keepaliveCAPAPCPwatch支持(客户端观察到服务提供者变化)支持 long polling/大部分增量支持自我保护支持-客户端缓存支持-自身集群的监控metrics- Eureka支持健康检查,自我保护等 Zookeeper为CP设计,Eureka为AP设计。作为服务发现产品,可用性优先级较高,一致性的特点并不重要,宁可返回错误的数据,也比不反...

2020-11-05 20:51:48 252

原创 双亲委派(三种类加载器)

java中的类加载器类型以及工作原理。 java中默认的有三种类型加载器。分别是:系统类加载器(应用类加载器)、扩展类加载器、引导类加载器。 上篇博客的例子已经测试了加载器类型是: sun.misc.Launcher$AppClassLoader@f4f44a,这个是系统类加载器。来看一下父类的加载器类型: //测试类加载器 System.out.println("forName形式的加载器--"+testTypeForName.getCl...

2020-11-03 23:33:39 34 1

原创 SpringBoot核心注解解析

1.@SpringBootApplication* 用于Spring主类上最最最核心的注解,自动化配置文件,表示这是一个SpringBoot项目,用于开启SpringBoot的各项能力。 相当于@SpringBootConfigryation、@EnableAutoConfiguration、@ComponentScan三个注解的组合。 2.@EnableAutoConfiguration 允许SpringBoot自动配置注解,开启这个注解之后,Spring...

2020-11-03 22:17:29 56

原创 MYSQL的MVCC弥补事务隔离级别带来的并发性能问题

MVCC(Mutil-Version Concurrency Control),就是多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。在Mysql的InnoDB引擎中就是指在已提交读(READ COMMITTD)和可重复读(REPEATABLE READ)这两种隔离级别下的事务对于SELECT操作会访问版本链中的记录的过程。这就使得别的事务可以修改这条记录,反正每次修改都会在版本链中记录。SELECT可以去版本链中拿记录,这就实现了读-写,写-读的并发执行,

2020-11-03 00:14:12 19

原创 newSql(最先进的sql可同时满足cap)

1、CAP:CAP原理:• Consistency(一致性): 数据一致更新,所有数据变动都是同步的• Availability(可用性): 好的响应性能• Partition tolerance(分区耐受性): 可靠性上面的解释可能显得太过抽象,举例来说在高可用的网站架构中,对于数据基础提出了以下的要求:• 分区耐受性 保证数据可持久存储,在各种情况下都不会出现数据丢失的问题。为了实现数据的持久性,不但需要在写入的时候保证数据能够持久存储,还需要能够将数据备份一个或多个副本,存放在不同的物...

2020-11-03 00:06:06 49

原创 SpringBoot启动原理(超详细)

写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图keepRunning方法)。 本文以调试一个实际的SpringBoot启动程序为例,参考流程中主要类类图,来分析其启动逻辑和自动化配置原理。总览: 上图为[SpringBoot启动结构图](https://www.processon.com/view/link/59812124e4b0

2020-11-01 20:33:19 34

原创 分布式事务发展和阿里的GTS分布式事务框架

通过GTS,可以在公网环境轻松保证分布式系统下的数据一致性。 1 微服务的发展微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇,很多互联网行业巨头、开源社区等都开始了微服务的讨论和实践。Hailo有160个不同服务构成,NetFlix有大约600个服务。国内方面,阿里巴巴、腾讯、360、京东、58同城等很多互联网公司都进行了微服务化实践。当前微服务的开发框架也非常多,比较著名的有Dubbo、Spri...

2020-11-01 19:25:47 119 2

原创 JVM内存模型(通俗易懂)

1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。(3)JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。2.jdk、jre、jvm是什么关系?(1)JRE(Java R

2020-10-30 18:14:32 321

原创 Tomcat服务器启动原理详解(通俗易懂比较简洁)

先说一下tomcat启动的源码在tomcat lib目录里的catalina.jar中,catalina 就是Tomcat服务器使用的Apache实现的servlet容器的 名字 【目录】本文主要讲解Tomcat启动和部署webapp时的原理和过程,以及其使用的配置文件的详解。主要有三大部分:第一部分、Tomcat的简介和启动过程第二部分、Tomcat部署webapp第三部分、Tomcat处理一个http请求的过程 【简介】  Tomcat依赖<CATALIN.

2020-10-30 18:05:28 86

原创 Java多线程及线程状态转换(通俗易懂)

线程:是指进程中的一个执行流程。 线程与进程的区别:每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址空间中工作,这些线程可以共享同一块内存和系统资源。Java实现多线程的方法有两种,一是继承Thread类、二是实现Runnable接口。一、继承Thread类public class ThreadTest extends Thread { @Override public void run() { System.out.println

2020-10-29 23:15:40 66 1

原创 JAVA中锁的详细介绍(少量源码)

Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录: 1. 乐观锁 VS 悲观锁#乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此

2020-10-28 21:20:20 159

原创 Synchronized与ReentrantLock区别总结(通俗易懂)

这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍。 相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统需要在用户态与内核态之间来回切换,代价很高,不过可以通过对锁优化进行改善)。 功能区别: 这两种方式最大区别...

2020-10-28 21:14:37 37

原创 hash冲突的通用解决办法

Hash算法解决冲突的方法一般有以下几种常用的解决方法 1, 开放定址法: 所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入 公式为:fi(key) = (f(key)+di) MOD m (di=1,2,3,……,m-1) ※ 用开放定址法解决冲突的做法是:当冲突发生时,使用某种探测技术在散列表中形成一个探测序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者 碰到一个开放的...

2020-10-28 21:11:10 42

原创 mysql内存优化(详细)

一、内存优化原则将尽量多的内存分配给 MySQL 做缓存,但要给操作系统和其他程序的运行预留足够的内存。myisam 的数据文件读取依赖于操作系统自身的 I/O 缓存,因此,如果有 myisam 表,要预留更多的内存给操作系统做 IO 缓存。排序区,连接区等缓存是分配给每个数据库会话(session)专用的,其默认值的设置要根据最大连接数合理分配,如果设置过大,不但浪费内存资源,而且在并发连接较高时会导致物理内存耗尽。二、myisam 内存优化myisam 存储引擎使用 key buffer.

2020-10-25 18:28:48 119

原创 kafka为什么会出现消息丢失以及解决方案

1.为什么会发生消息丢失和消息重复? 消息发送 Kafka消息发送有两种方式:同步(sync)和异步(async),默认是同步方式,可通过producer.type属性进行配置。Kafka通过配置request.required.acks属性来确认消息的生产: 0—表示不进行消息接收是否成功的确认;1—表示当Leader接收成功...

2020-10-20 21:15:48 807

原创 Hadoop架构和原理介绍

    网上有很多介绍Hadoop安装部署的资料,这篇文章不会向大家介绍Hadoop的安装及部署方法,我会重点向大家介绍Hadoop实现的基本原理,这样当我们今后学习Hadoop生态相关的知识时可以快速入门。        Hadoop是什么    我们首先要知道Hadoop是什么,按照官方的解释,Hadoop是一个由Apache基金会开发的分布式系

2020-10-20 00:08:30 731 2

原创 性能之王HiKariCP和阿里爸爸Druid比较

我们所熟知的C3P0,DBCP,Druid, HiKariCP为我们所常用的数据库连接池,其中C3P0已经很久没有更新了。DBCP更新速度很慢,基本处于不活跃状态,而Druid和HikariCP处于活跃状态的更新中,这就是我们说的二代产品了。HiKariCP字节码精简 :优化代码,直到编译后的字节码最少,这样,CPU缓存可以加载更多的程序代码;优化代理和拦截器 :减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一;自定义数组类型(FastS

2020-10-18 00:04:47 179

转载 分布式集群 redis集群或雪花算法生成唯一id

使用jdk自带的UUID可以实现,但是如果是作为MySQL的主键id会带来一下性能损失:UUID为32位过长,浪费索引空间导致每一个page的容量数减少;另外UUID无序,会造成插入时的page的重构和分裂解决办法:redis集群:雪花算法:...

2020-10-17 17:09:18 1135

定时检测,重启外部服务demo

bat脚本定时执行,符合重启条件时,重新启动外部服务,代码内自动关闭本java程序,适应场景代码重启或关闭远程服务

2018-09-14

空空如也

空空如也

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

TA关注的人 TA的粉丝

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