- 博客(41)
- 收藏
- 关注
翻译 Springboot Feature翻译
shell本节将深入介绍 Spring Boot 的详情,在这里你能了解到你可以会使用或者自定义的关键特性。如果你还没有准备好,你也许需要去阅读 “getting-started.html” 和 “using-spring-boot.html” 章节来打下好的基础。1. SpringApplicationSpringApplication 类提供了一种便捷的方法来引导从 main() 方法启动的 Spring 应用。在很多情况下,你能够委托静态的 SpringApplication.run 方法,就像
2020-09-11 15:22:16 3927
原创 WebSocket技术解析和应用
引言在以前的HTTP协议中,如果我们想实现即时消息推送,使用的方法只有两种:ajax轮询技术:客户端每次在指定间隔的时间发送请求,询问服务器是否有新的数据。long polling长轮询技术:客户端向服务器发送一次请求,然后一直处于pedding阻塞状态,直到服务器返回数据。这两种方法都很简单粗暴,唯一的缺点就是只能建立起HTTP连接,然后被动地接收服务端的数据。要是有成千上万的用户在等待消息推送,突然服务器不堪重负而罢工,这就尴尬了。而WebSocket就是针对这种场景而设计的,伴随着HTT
2020-09-11 15:04:24 251
原创 MySQL整体架构解析
mysql架构首先,开局一张图,看一下mysql结构:表面上看mysql的架构很简单,就是由SQL层和引擎层组成的,但是它们都还有很多的小模块,mysql不仅自带了许多存储引擎,而且它支持第三方插件式引擎,可以根据自己的业务需求使用不同的存储引擎,正如上图中看到的innodb、Myiseam等。我们着重注意SQL层的执行流程:以下是对相关模块的简单介绍:初始化模块:它在mysql服务启动时,对整个系统进行相关的初始化操作,比如内存空间的申请、系统变量的初始化、存储引擎的初始化等。网络交互模
2020-09-11 15:03:32 184
原创 Akka:基于Actor的并发解决方案
Actor模型在面向对象编程中,一个对象可以访问或修改另一个对象的值,在高并发情况下,由于机器性能的瓶颈,当有多个对象对同一竞争资源进行操作时,可能会出现数据错误的问题(即实际读取的数据不是预期数据,而是前面阶段到这一阶段未修改完成的数据)。Actor模型对此进行了修改,它不是直接对对象进行操作,而是通过消息传递的方式与外界进行交互。如图所示:Actor一次只接收处理一个消息,未处理消息会被放入队列等待处理。Actor有几个重要概念:Actor:处理消息并修改内部状态的工作节点。消息:用于在多个
2020-09-11 15:01:57 1037
原创 Redis复习总结
前言本文是自己阅读 Redis 相关文章和数据以及对 Redis 实际操作后的一些总结,旨在对学习过的 Redis 进行总结和复习。由于本人水平有限,在讲述中可能会出现纰漏和错误,希望大家可以指出,一起学习,一起进步。Redis 内置数据类型Redis 内置的数据类型可以分为基本数据类型和高级数据类型。其中基本数据类型便是经常使用的5类:string、list、set、zset、hash。字符串的底层实现是字节,所以可以直接操作字符串的位。比如如果要记录某个人一年的打卡记录,那么不需要创建365
2020-10-22 10:38:57 291
原创 SpringBoot 启动流程解析大全
前言了解 SpirngBoot 的加载流程,可以让我们更好地自定义 SpringBoot 加载流程,并且对自己开发相关架构有一定的借鉴意义。本文旨在从 SpringBoot 的启动类出发,了解 SpringBoot 是怎样完成加载环境、设置上下文、注入 bean 等步骤。由于本人水平有限,分析过程中可能有遗漏和错误,希望大家可以直接指出来,一起学习,一起进步。run不管自己怎么定制 SpringBoot 的启动流程,最后总是通过 run() 方法开始运行的。示例如下:public static v
2020-10-14 10:29:10 252
原创 ConcurrentHashMap分析(二)数据扩容
前言在前面的文章ConcurrentHashMap分析(一)整体结构里,我们通过从 ConcurrentHashMap 的整体结构入手,逐步了解了它的数据结构和各个节点的转换关系。这篇文章将讲述 ConcurrenHashMap 的另一个重点:如何在高并发环境下进行扩容,这对我们了解高并发编程思想很有帮助。由于本人水平有限,分析过程中可能存在纰漏和错误,希望大家可以指出,一起学习,一起进步。思路我们在前文查看 ConcurrenHashMap 中发现有一个字段nextTable,它起到在扩容时充当临
2020-09-25 14:34:27 549
原创 ConcurrentHashMap分析(一)整体结构
前言对于ConcurrentHashMap的分析,网上已经有很多完善的资料,对于它的源码分析对于巩固和提升关于Java并发思想以及Map集合的思考很有帮助。此文是作者自己关于ConcurrentHashMap的分析和总结。由于本人水平有限,分析过程中可能存在纰漏和错误,希望大家可以指出,一起学习,一起进步。对于此次分析希望能达到以下目的:了解ConcurrentHashMap对于并发的优化方法。了解并发措施和Map集合的结合。ConcurrentHashMap结构下面是ConcurrentH
2020-09-23 21:31:42 427
原创 AQS及其衍生物
前言AQS(AbstractQueuedSynchronizer)为组成Java并发包的工具类的核心,我们可以看到它的实现类中有很多我们常用的同步器:那么AQS是怎么定义和管理资源的?同步器是通过怎样的方式从AQS扩展?这是此文需要讨论的内容。由于作者本人水平有限,在分析时可能会出现纰漏和错误,希望大家可以指出,让我们一起学习,一起进步。AQS资源管理在AQS中有一个state字段,其注释The synchronization state意为同步状态,它就是用于表示资源当前状态的。不同的同步器对
2020-09-18 15:45:40 152
原创 java运行时数据区分析
前言此文是我阅读了《深入理解Java虚拟机》和一些其它博客后对于Java运行时数据区的结构组成的一个总结,它阐述了Java 虚拟机的运行时数据区各组成,以及如何通过垃圾回收机制保证内存的可用。由于本人能力的问题,在书写时难免会有错误或纰漏,希望发现的读者可以指出来,以让我进步。运行时数据区JVM 的运行时数据区以俯瞰的角度来看其实并不复杂,主要分为方法区、本地方法栈,虚拟机方法栈、堆、程序计数器,它们的组成如下所示:对于方法区和堆,它们是属于线程共享的,为了提高性能,在堆上会划分出一个小区域在存
2020-09-17 12:54:46 269
原创 我的mysql索引总结
本文是作者在了解学习 MySQL 索引时的知识点的总结,对于里面可能出现的不严谨或者错误的地方,希望大家指出。为什么要用索引某一样东西或机制的诞生必定时有着对它所能实现的功能的需求。MySQL 索引机制便是为了快速定位数据地址,提高数据库性能而出现的。索引起到的作用就好似书上的目录,你可以根据目录定位到自己想要读取的内容的大致地址,当然这里用目录打比方是为了说明索引的作用,实际上索引的实现和目录大相径庭。索引的实现此节将简单阐述索引的实现,并通过举例说明为什么索引能起到快速定位的作用。平衡二叉树
2020-09-14 19:39:07 173
原创 JRE与cglib
在讨论动态代理前,我们先回想一下java的反射机制。因为动态代理是会用到反射的,而且java的反射不仅使用广泛,而且功能强大。反射——JLR当我们使用new关键字创建对象时,虚拟机会先查看对象所属的类是否被加载到内存中,如果没有,就会先通过类的全限定类名来加载,当加载并初始化完成后,再进行对象的创建工作。当一个类文件被类加载器加载到虚拟机中,虚拟机会读取文件信息,并生成一个该类的Class对象。因此,如果我们可以直接操作虚拟机堆中的Class对象,那么就不需要new来创建对象。这种思想就是反射。反射支
2020-09-11 15:12:10 165
原创 Class文件解析实战
java跨平台的实现是基于JVM虚拟机的,编写的java源码,编译后会生成一种.class文件,称为字节码文件。java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行。为了保证Class文件在多个平台的通用性,java官方制定了严格的Class文件格式。了解Class文件结构,有利于我们反编译 .class 文件或在程序编译期间修改字节码做代码注入。Class文件结构概览首先先创建一个java类:public class HelloWorld { private static int
2020-09-11 15:02:37 304
原创 Go语言立地入门
Go语言概述Go语言又名Golang,由谷歌公司开发并推出,它的主要目标是"兼具Python等动态语言的开发速度和C/C++等编译型语言的性能和安全性"。从Go语言的语法中,我们可以看到C/C++、Python等优秀语言的影子,它借鉴了其它主流语言的优势(自动垃圾回收、切片、字典),并实现了自己的特点 (协程开发、动态接口)。Go语言的主要特点有:自带编译器,可进行交叉编译,即在运行 Linux 系统的计算机上开发在 Windows 上运行的应用程序。自动垃圾回收机制 ,使用三色标记和写屏障等机制
2020-06-24 20:20:43 210
原创 javaagent入门指南
第一次见到javaagent时,是偶然了解到Spring的AOP中使用了一个Instrumentation技术,对自己来说是一个新的知识点,所以很好奇,因此查阅相关文档和资料进行学习,在此记录,如有不妥之处,请指正。运行环境:操作系统:Windows10jdk版本:openjdk version 11.0.7概述javaagent顾名思义就是一个java代理,我们知道任何一项java应用的启动都需要有一个入口函数,加载从入口函数开始一直扩散到整个应用。类在jvm中的加载顺序是:加载——&g
2020-06-23 08:24:55 1697
原创 java高并发学习01——进程、线程、协程
1.进程、线程、协程1.1进程伪并行:在单处理器系统中,CPU由一个进程快速切换到另一个进程,使每个进程各运行几十或几百毫秒——严格来说,在某一个瞬间,CPU只能运行一个进程。但在1秒钟内,它可能运行了多个进程,这样就产生了并行的错觉,这种情形就被称为伪并行,以此来区分多出力系统的真正硬件并行。1.1.1进程模型在进程模型中,计算机上所有可运行的软件(包括操作系统),被组织成若干顺序进程,简称为进程。一个进程就是一个正在执行程序的实例,包括程序计数器、寄存器和变量的当前值。从概念上来说,每个进程都有
2020-06-22 08:34:02 369
原创 jdk常用的七种性能监控命令行工具
引言在jdk的开发包里,除了我们常用的java.exe和javac.exe程序外,还有一系列辅助工具,这些工具可以帮助我们更好地分析指定java程序的运行状态,比如jstack.exe、jps.exe、jstate.exe等。下面我们对一些重要的工具进行讲解。注意:在jdk8及以前,工具类的可执行文件的实现都在lib/tools.jar上,但是在jdk9及以后,以前存储在lib中的lib/rt.jar、lib/tools.jar、lib.dt.jar,以及其他各种内部jar文件现在以更高效的格式存储在
2020-06-21 08:40:26 385
原创 彪悍的ZGC
概述jdk11的垃圾收集器为ZGC,又名Z Garbage Collector,它是被用来设计满足以下需求的可扩展、低延迟、多线程、非分代、基于region、支持numa和大页的垃圾收集器:最小的暂停时间(不超过10ms)。暂停时间不会随着堆的改变而变化。支持堆的大小从8MB到16TB不等。注意:jdk11、jdk13只有Linux支持ZGC,jdk14支持macOS、Windows。乍一看ZGC的功能,顿时感觉高大上了。不仅支持TB量级的堆,而且停顿时间不会随着堆的增大而增长。那么我们
2020-06-20 20:08:59 264
原创 Redis6新特性
Redis6新特性之前一直听别人说redis6出了,还实现了多线程,以后面试官问redis是单线程还是多线程这样的问题肯定要涨10个百分点,今天就结合antirez的博客和github文档看看redis到底实现了什么新技能。先看下antirez的概览:许多新的模块API。更好过期算法。SSL支持。ACL支持。新的RESP3协议。客户端缓存。多线程I/O。副本的无盘复制。redis-benchmark支持和redis-cli改进。Systemd 支持重写。redis集群代理的发布。
2020-06-17 14:34:14 5697
原创 对于 idea 的一些处理笔记
日期:2020-05-17使用 idea 执行 java 代码时报错:VMVersionMismatchException具体信息可查看我的问帖:https://www.oschina.net/question/4130051_2316529解决方法:将 idea 使用的 jar 包替换成自己的,删除 idea 的 jbr 文件夹,然后将自己的 jdk 复制到 idea 的根目录下,将名字改为 jbr 就可以了。...
2020-05-17 11:28:42 513
原创 tomcat8优化策略——全部尝试可用
tomcat8 优化tomcat8 的下载安装请自行百度,直接进入正文。注:以下假设建立在你并没有深入了解过 tomcat 的基础上。注:我使用的 tomcat 版本为 8.5.54,使用的 maven 版本为 3.6.1。注:此文参考于:https://blog.51cto.com/14230003/2420282如何查看 tomcat 的配置、状态当你在游览器上输入...
2020-04-26 21:43:36 349
原创 tensorflow 官网的坑处
出处:random_numbers:g1 = tf.random.Generator.from_seed(1)print(g1.normal(shape=[2, 3]))g2 = tf.random.get_global_generator()print(g2.normal(shape=[2, 3]))实际上应该修改为:g1 = tf.random.experimental.Ge...
2020-04-22 21:08:11 1634
原创 tensorflow 的版本介绍
tensotflow 的各版本区别:tensorflow - 支持 CPU 的当前稳定版本tensorflow-gpu - 支持 GPU 的当前稳定版本tf-nightly - 支持 CPU 的最新版(不稳定)tf-nightly-gpu - 支持 GPU 的最新版(不稳定)注意:tf-nightly 中的 nightly 意为 nightly build,即每日构建的意思,最新版...
2020-04-22 20:22:37 1562
原创 Redis学习笔记(二)
——总结自《redis深度历险》**redis是一个单线程程序。**对于处理并发客户端连接,redis使用了非阻塞IO,事件轮询,多路复用。线程IO模型非阻塞IO:非阻塞IO在套接字对象上提供了一个选项Non_Blocking,当这个选项打开时,读写方法不会阻塞,而是能读多少读多少,能写多少写多少。事件轮询:用于解决在非阻塞IO中线程如何得到通知。最简单的事件轮询API是select函数...
2020-03-27 14:21:34 242
原创 Redis学习笔记(一)
Rredis基本数据结构——总结自《redis深度历险》redis的所有数据结构都以唯一的key字符串作为名称,然后通过这个唯一的kkey值来获取相应的value。不同类型的数据结构的差异性就在于value结构不一样。stringredis的字符串是动态字符串,nebula结构的实现类似于ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。当字符串长度小于1MB时,扩容都是加...
2020-03-26 13:01:27 221
原创 netty初探
netty 初探——总结自《netty 实战》netty 的版本是4简单 server channelHandler:@ChannelHandler.Sharable // 标识一个 channelHandler 可以被多个 channel 安全地调用。public class NettyServerHandler extends ChannelInboundHandlerAdapter...
2020-03-11 17:17:05 143
原创 枚举类型
——总结自《java编程思想》关键字enum可以将一组具名的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能。枚举简介基本enum特性:values()返回enum实例的数组,而且保持声明的顺序。ordinal方法返回一个int值,这是每个enum实例在声明时的次序,从0开始。可以使用==来比较enum实例,编译器会自动提供equals和...
2020-02-25 09:17:55 152
原创 注解
——总结自《java编程思想》注解(元数据)为我们在代码中添加信息提供了一张格式化的方式,使我们可以稍后某个时刻非常方便地使用这些数据java中有三个内置注解:@Override,表示当前的方法定义将覆盖超类中的方法。@Deprecated,如果使用了该注解,那么编译器会发出警告信息。@SuppressWarings,关闭不当的编译器警告信息。没有元素的注解称为标记注解。四种元注...
2020-02-24 09:15:22 91
原创 IO系統
——总结自《java编程思想》I/O杂记File既可以代表一个特定文件的名称,又能代表一个目录下一组文件的名称。如果值的是文件集,可以使用list()方法返回一个字符数组File类不仅仅只代表存在的文件或目录,也可以用File对象来创建新的目录或尚不存在的整个目录路径,还可以通过File对象查看文件的特性,如大小、最后修改日期、是否可读等等。编程语言的 I/O 类库中常使用流这个抽象概...
2020-02-24 09:13:51 118
原创 容器
——总结自《java编程思想》数组数组的特殊性效率,数组是效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单线性序列,使得元素访问非常快速。代价就是数组对象的大小被固定,并且在生命周期内不可改变。 虽然ArrayList具有弹性,但是这种弹性变化需要开销,通过创建一个新实例,然后把旧实例中所有的引用移到新实例中,从而实现更多空间的自动分配。因此ArrayList的效率比数组低得...
2020-02-23 08:53:24 110
原创 泛型
——总结自《java编程思想》泛型实现了参数化类型的概念元组:将一组对象直接打包存储于其中一个单一对象。这个容器对象允许读取其中的元素,但是不允许向其中存放新的对象(这个概念也被称为数据传送对象,或信使)泛型只在编译期有效:在编译之后程序会采取去泛型化的措施。java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类...
2020-02-23 08:51:00 284
原创 类型信息
——总结自《java 编程思想》运行时类型信息使得你可以在程序运行时发现和使用类型信息RTTIRTTI(Run-Time Type Identification)翻译过来为运行时类型信息Class:Class对象就是用来创建类的所有"常规" 对象的。所有的类都是对其第一次使用时,动态加载到JVM中的. 当程序创建第一个对类的静态成员引用时,就会加载这个类.这个也证明构造器也是类的静态方法...
2020-02-20 19:26:49 120
原创 进程与线程
——总结自《java编程思想》进程4种主要事件会导致进程的初始化:系统初始化正在运行的程序执行了创建进程的系统调用用户请求创建了一个新的进程一个批处理作业的初始化进程终止的通常原因:正常退出(自愿的)出错退出(自愿的)严重错误(非自愿的)被其它进程杀死(非自愿的)进程状态图:为了实现进程模型,操作系统维护着进程表。每个进程占用一个进程表项。该表项包含了进程状态的...
2020-02-20 19:25:17 128
原创 String杂烩
String对象是不可变的。由于string的只读特性,使得在string的操作上有一定的性能问题。比如对于string的重载操作符"+"的使用会产生一大堆的中间件对象。String str="abc";System.out.println(str);str=str+"de";System.out.println(str);/*如果运行这段代码会发现先输出“abc”,然后又输出“ab...
2020-02-19 16:54:46 161
原创 kafka 消费者
kafka 消费者——总结自《kafka 权威指南》kafka 消费者从属于消费者群组,一个群组里的消费者订阅的是同一个主题,每个消费者接收主题一部分分区的消息。如果群组里的消费者超出主题的分区数量,那么就有一部分消费者会被闲置,不会接收到任何信息。分区的所有权从一个消费者转移到另一个消费者,这种行为成为再均衡。在再均衡期间,消费者无法读取消息,造成整个群组一小段时间的不可用。当分区被重新分...
2020-02-19 16:52:12 308
原创 一切皆对象(3)
持有对象——总结《java 编程思想》collection的构造器可以接受另一个collection用它来将自身初始化,因此可以使用Array.List()为这个构造器产生输入。但是collection.addAll()方法运行起来要快的多。因此构建一个不包含元素的collection,然后调用collection.addAll()这种方法很方便。List将元素维护在特定的序列中。有两种...
2020-02-18 19:10:33 123
原创 kafka 生产者
kafka 生产者创建一个包含目标主题和内容的 ProducerRecord 对象,可指定键或分区,发送前要把对象序列化成字符数组。数据被传给分区器,如果指定了分区就直接把指定的分区返回。如果没有指定分区,分区器就根据 ProducerRecord 对象的键选择一个分区。紧接着这条记录就被添加到一个记录批次里,这个批次里所有的消息会被发送到相同的主题和分区上。如果消息成功写入 kafka...
2020-02-18 19:07:28 236
原创 kafka 简介
kafka 一般被称为"分布式提交日志"或者"分布式流平台",kafka 的数据是按照一定顺序持久化保存的,可以按需读取。此外,kafka 的数据分布在整个系统里,具备数据保障保护和性能伸缩的能力。kafka 数据单元被称为消息,为了提高效率,消息被分批次写入 kafka,批次就是一组消息。kafka 的消息模式可以使用 json 或 xml(虽然易用,可读性好,但是它们缺乏强类型处理能力,不...
2020-02-18 19:05:21 134
原创 一切皆对象(2)
访问控制权限package用于控制构件构建捆绑到一个内聚的类库单元中。访问修饰符会因此受到影响。访问权限控制的等级,从最小到最大权限依次为:public,protected、包访问权限、privatejava可运行程序是一组可以打包并压缩为一个java文档文件(jar)的.class文件。java解释器负责这些文件的查找、装载、解释。类库实际上是一组类文件、其中每个文件都有一个public...
2020-02-17 19:36:08 97
原创 kafka broker 常规配置参数
kafka broker 常规配置 ----总结自《kafka 权威指南》broker.id:broker 的标识符,默认为 0。可设置为任意整数,这个值在 kafka 集群里必须要是唯一的。port:设置监听端口。如果使用 1024 以下的端口,Linux 需要使用 root 权限启动才能启动 kafka。zookeeper.connect:保存 broker...
2020-02-17 19:33:54 737
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人