- 博客(49)
- 资源 (1)
- 收藏
- 关注
原创 设计模式之禅--适配器模式
1.适配器模式的定义将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。2.适配器模式类比图:A、B两个图框代表已经塑模成型的物体A和物体B,那现在要求把A和B安装在一起使用,如何安装?两者的接口不一致,是不可能安装在一起使用的,那怎么办?引入一个物体C.其中的物体C就是我们说的适配器,它在中间起到了角色转换的作用,把原有的长条形接口转换了三角形接口引入物体C后,C适应了物体A的接口,同时也适应了物体B的接口,然后三者就可以组合成一
2020-09-04 18:02:03
225
原创 5.深入理解kafka:核心设计与实践原理
深入客户端分区分配策略Kafka提供了消费者客户端参数partition.assignment.strategy来设置消费者与订阅主题之间的分区分配策略。默认情况下,此参数的值为org.apache.kafka.clients.consumer.RangeAssignor,即采用RangeAssignor分配策略。除此之外,Kafka还提供了另外两种分配策略:RoundRobinAssignor 和 StickyAssignor。消费者客户端参数 partition.assignment.strat
2020-06-11 10:12:01
1239
原创 4.深入理解kafka:核心设计与实战原理
日志存储文件目录布局Kafka 中的消息是以主题为基本单位进行归类的,各个主题在逻辑上相互独立。每个主题又可以分为一个或多个分区,分区的数量可以在主题创建的时候指定,也可以在之后修改。每条消息在发送的时候会根据分区规则被追加到指定的分区中,分区中的每条消息都会被分配一个唯一的序列号,也就是通常所说的偏移量(offset),具有4个分区的主题的逻辑结构见图1-2。如果分区规则设置得合理,那么所有的消息可以均匀地分布到不同的分区中,这样就可以实现水平扩展。不考虑多副本的情况,一个分区对应一个日志(Log
2020-06-08 15:34:01
627
原创 3.深入理解kafka:核心设计与实践原理
主题与分区主题的管理主题的管理包括创建主题、查看主题信息、修改主题和删除主题等操作。主题的管理并非只有使用 kafka-topics.sh 脚本这一种方式,我们还可以通过KafkaAdminClient 的方式实现创建主题如果broker端配置参数auto.create.topics.enable设置为true(默认值就是true),那么当生产者向一个尚未创建的主题发送消息时,会自动创建一个分区数为num.partitions (默认值为1)、副本因子为default.replication
2020-06-05 14:10:10
678
原创 2深入理解kafka:核心设计与实践原理
消费者消费者与消费组1.每个消费者都有一个对应的消费组,消息被发布到主题后,只会投递到订阅它的每一个消费组中的一个消费者如上图所示:某个主题有4个分区,和两个消费组,A组有四个消费组,b组有2个消费者,,按照kafka的默认规则,最后分配结果是,A组每个消费者分配到一个分区,B组每个消费者分配到两个分区,每个消费者只能消费所分配到的分区中的消息。.换言之,每个分区只能被一个消费组的消费者消费2.消费组内的消费者个数变化时所对应的分区分配的演变:消费者与消费组这种模型可以让
2020-06-04 15:46:26
723
原创 1.深入理解Apache dubbo与实战
高性能RPC通信框架1.为了解决单机应用的问题以及性能,并发等问题,面向服务架构SOA出现了.SOA单一进程的应用做了拆分,形成对外提供服务的组件,每个组件通过网络协议对外提供服务.协议可以是TCP也可以是HTTP.SOA具有以下特点:①明确的协议:通过协议通信②明确的接口:对外提供接口,服务复用③合作方式的改变:可以更细化的分工与合作④通信方式:JSON通信2.早期的SOA常见的SOA实现方式有两种:WebService和ESB,WebService使用Http或http.
2020-05-15 11:06:57
2384
原创 深入理解java虚拟机------全书总结
1.java是有java虚拟机来控制着对象的存亡,而C或C++对象的存亡是由程序员控制的2.运行时数据区域:程序计数器:它可以看作是当前线程执行的字节码的行号指示器.java虚拟机是多线程处理的,为了在切换线程时线程能够恢复到正确的位置,所以这个计数器是私有的,每条线程需要一个独立的计数器.它们之间互不影响虚拟机栈java虚拟机栈也是线程私有的,生命周期同线程.j...
2020-05-08 09:49:38
301
原创 redis深度历险:核心原理与应用全书总结
1.redis的类型有string,list,hash,set,zset2.list类似java的linkedlist,内部是链表不是数组,这意味着插入删除操作非常快,查询相对比较慢Redis 的列表结构常用来做异步队列使用。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理hash (字典)Redis 的字典相当于...
2020-04-23 10:40:42
606
原创 微信小程序开发
1.project.config.json配置项目的环境2.app.wxss配置整个项目的样式,可以被所有页面使用3.app.json:配置整个项目的配置信息,如路径,标题(必须满足json格式的,并且使用双引号 在json里面不能写注释的 )4.app.js:控制整个项目的逻辑处理,还有一些生命周期的方法5.页面的配置,在page文件夹下面index :配置所有...
2020-03-30 22:37:52
302
原创 jvm命令
1.ps -ef | grep java2.jstat -heap pid 查看jvm堆内存占用情况,伊甸园,新生代,老年代等3.jstack pid 查看
2020-03-26 15:13:08
115
原创 1.深入理解kafka:核心设计和实践原理
1.快速入门使用kafka提供的脚本工具linux上安装java,zookeeper,kafka,启动zookeeper(zkServer.sh staart),再启动kafka(bin/kafka-server-start.sh config/server.properties) 创建topic (bin/kafka-topics.sh --create --zookeeeper lo...
2020-03-24 17:44:24
1062
原创 1.spring实战
1.spring为了降低java开发的复杂性,采取了4种关键策略:基于pojo的轻量级和最小侵入性编程 通过依赖注入和面向接口实现松耦合 基于切面和惯例进行声明式编程 通过切面和模板减少样板式样板式代码2.如果一个对象只通过接口而不是具体的实现或初始化过程来表明依赖关系,name这种依赖就是能够在对象本身毫不知情的情况下,用不同的具体实现进行替换public class aa i...
2020-03-23 07:10:38
167
原创 Redis 深度历险: 核心原理和应用实践2
1.应用 9:大海捞针 —— Scan在平时线上 Redis 维护工作中,有时候需要从 Redis 实例成千上万的 key 中找出特定前缀的 key 列表来手动处理数据,可能是修改它的值,也可能是删除 key。这里就有一个问题,如何从海量的 key 中找出满足特定前缀的 key 列表来Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key...
2020-03-12 13:20:46
396
原创 Redis 深度历险: 核心原理和应用实践3
Sentinel 基本使用集群 1:李代桃僵 —— Sentinel目前我们讲的 Redis 还只是主从方案,最终一致性。读者们可思考过,如果主节点凌晨3 点突发宕机怎么办?就坐等运维从床上爬起来,然后手工进行从主切换,再通知所有的程序把地址统统改一遍重新上线么?毫无疑问,这样的人工运维效率太低,事故发生时估计得至少 1 个小时才能缓过来。如果是一个大型公司,这样的事故足以上新闻了...
2020-03-10 20:02:25
587
原创 Redis 深度历险: 核心原理和应用实践
1.Redis 可以做什么?Redis 的业务应用范围非常广泛,让我们以掘金技术社区(juejin.im)的帖子模块为实例,梳理一下,Redis 可以用在哪些地方?1、记录帖子的点赞数、评论数和点击数 (hash)。 2、记录用户的帖子 ID 列表 (排序),便于快速显示用户的帖子列表 (zset)。 3、记录帖子的标题、摘要、作者和封面信息,用于列表页展示 (hash)。 ...
2020-03-02 11:09:32
2307
原创 9.实战java高并发程序设计(全书总结)
1.了解同步(Synchronous)异步(Asynchronous)的区别同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,2.并发(Concurrency)和并行(Parallelism)的区别并行的多个任务是真的同时执行,而对于并发来说,这个过程只是交替的,一会儿执行任务A,一会儿执行任务B,系统...
2020-02-26 20:37:49
854
原创 8实战java高并发程序设计---并行程序调试
8.1 准备实验样本8.2 正式起航首先,我们需要理解ArrayList的工作方式。在ArrayList初始化时,默认会分配10个数组空间。当数组空间消耗完毕后,ArrayList就会进行自动扩容。在每次add()函数时,系统总要事先检查一下内部空间是否满足所需的大小,如果不满足,就会扩容,否则就正常添加元素。多线程共同访问ArrayList的问题在于:在ArrayList容量快用...
2020-02-26 17:34:28
201
原创 6实战java高并发程序设计---Java 8/9/10与并发
2014年,Oracle发布了新版本Java 8。对于Java来说,这显然是一个具有里程碑意义的版本。它最主要的改进是增加了函数式编程的功能。就目前来说,Java最令人头痛的问题,也是受到最多质疑的地方,应该就是Java烦琐的语法。这样我们不得不花费大量的代码行数,来实现一些司空见惯的功能,以至于Java程序总是冗长的。但是,这一切将在Java 8的函数式编程中得到缓解。严格来说,函数式编程与...
2020-02-23 12:53:42
351
原创 5实战java高并发程序设计--并行模式与算法
由于并行程序设计比串行程序设计复杂得多,因此我强烈建议大家了解一些常见的设计方法。就好像练习武术,一招一式都是要经过学习的。如果自己胡乱打,效果不见得好。前人会总结一些武术套路,对于初学者来说,不需要发挥自己的想象力,只要按照武术套路出拳就可以了。等练到了一定的高度,就不必拘泥于套路了。这些武术套路和招数,对应到软件开发中来就是设计模式。在这一章中,我将重点向大家介绍一些有关并行的设计模式及算法。...
2020-02-21 19:43:43
519
原创 4实战java高并发程序设计--4.锁的优化及注意事项
锁是最常用的同步方法之一。在高并发的环境下,激烈的锁竞争会导致程序的性能下降,因此我们有必要讨论一些有关锁的性能问题,以及一些注意事项,比如避免死锁、减小锁粒度、锁分离等。对于单任务或者单线程的应用而言,其主要资源消耗都花在任务本身。它既不需要维护并行数据结构间的一致性状态,也不需要为线程的切换和调度花费时间。但对于多线程应用来说,系统除了处理功能需求外,还需要额外维护多线程环境的特有信息,如...
2020-02-17 14:55:22
296
原创 3.实战java高并发程序设计--JDK并发包---3.4 使用JMH进行性能测试
3.4.1 什么是JMHJMH(Java Microbenchmark Harness)是一个在OpenJDK项目中发布的,专门用于性能测试的框架,其精度可以到达毫秒级。通过JMH可以对多个方法的性能进行定量分析。比如,当要知道执行一个函数需要多少时间,或者当对一个算法有多种不同实现时,需要选取性能最好的那个。3.4.2 Hello JMH要想使用JMH,首先需要得到JMH的jar包,...
2020-02-17 13:39:08
339
原创 3.实战java高并发程序设计--JDK并发包---3.3不要重复发明轮子:JDK的并发容器(工具类)
除了提供诸如同步控制、线程池等基本工具外,为了提高开发人员的效率,JDK还为大家准备了一大批好用的容器类,可以大大减少开发工作量。大家应该都听说过一种说法,所谓程序就是“算法+数据结构”,这些容器类就是为大家准备好的线程数据结构。你可以在里面找到链表、HashMap、队列等。当然,它们都是线程安全的。在这里,我也打算花一些篇幅为大家介绍一下这些工具类。这些容器类的封装都是非常完善并且“平易近人...
2020-02-16 17:39:54
240
原创 3.实战java高并发程序设计--JDK并发包---3.1
3.1 多线程的团队协作:同步控制同步控制是并发程序必不可少的重要手段。之前介绍的关键字synchronized就是一种最简单的控制方法,它决定了一个线程是否可以访问临界区资源。同时,Object.wait()方法和Object.notify()方法起到了线程等待和通知的作用。这些工具对于实现复杂的多线程协作起到了重要的作用。下面我们首先将介绍关键字synchronized、Object.wa...
2020-02-14 14:53:01
221
原创 2.实战java高并发程序设计--java并行程序基础
2.1 有关线程你必须知道的事进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。用一句简单的话来说,你在Windows中看到的后缀为.exe的文件都...
2020-02-12 21:00:18
324
原创 1.实战java高并发程序设计--走入并行世界
1.2.1 同步(Synchronous)和异步(Asynchronous)同步和异步通常用来形容一次方法调用。同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中“真实”地执行。整个过程,不会阻碍调用者的工作。图1.4显示了同步方法调用和异步方法调用的...
2020-02-12 15:14:41
229
原创 13深入理解java虚拟机--第五部分高效并发----线程安全与锁优化
13.2 线程安全按照线程安全的“安全程度”由强至弱来排序,我们[插图]可以将Java语言中各种操作共享的数据分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。1.不可变在Java语言中(特指JDK 1.5以后,即Java内存模型被修正之后的Java语言),不可变(Immutable)的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的...
2020-02-09 21:46:53
346
原创 12深入理解java虚拟机--第五部分高效并发----java内存模型与线程
12.1 概述除了充分利用计算机处理器的能力外,一个服务端同时对多个客户端提供服务则是另一个更具体的并发应用场景。衡量一个服务性能的高低好坏,每秒事务处理数(Transactions PerSecond,TPS)是最重要的指标之一,它代表着一秒内服务端平均能响应的请求总数,而TPS值与程序的并发能力又有非常密切的关系。对于计算量相同的任务,程序线程并发协调得越有条不紊,效率自然就会越高;反之,...
2020-02-09 09:26:58
260
原创 11.深入理解java虚拟机--第三部分程序编译与代码优化----晚期运行期优化
11.1 概述在部分的商用虚拟机(Sun HotSpot、IBM J9)中,Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code)。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编...
2020-02-04 17:09:18
410
原创 10.深入理解java虚拟机--第三部分程序编译与代码优化----早期编译优化
10.1 概述Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler)把字节码转变成机器码的过程;还可能是指使用静态提前编译器(AOT编译器,Ahead Of Time Compiler)...
2020-02-02 21:05:11
454
原创 9.深入理解java虚拟机--第三部分虚拟机执行子系统----类加载及执行子系统的案例与实战
9.2.1 Tomcat:正统的类加载器架构主流的Java Web服务器,如Tomcat、Jetty、WebLogic、WebSphere或其他笔者没有列举的服务器,都实现了自己定义的类加载器(一般都不止一个)。因为一个功能健全的Web服务器,要解决如下几个问题:[插图]部署在同一个服务器上的两个Web应用程序所使用的Java类库可以实现相互隔离。这是最基本的需求,两个不同的应用程序可能会...
2020-02-01 15:55:17
401
原创 8.深入理解java虚拟机--第三部分虚拟机执行子系统----虚拟机字节码执行引擎
8.1 概述执行引擎是Java虚拟机最核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。在Java虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个...
2020-01-28 15:42:46
332
原创 7.深入理解java虚拟机--第三部分虚拟机执行子系统----虚拟机类加载机制
代码编译的结果是从本地机器码转为字节码的,是存储格式发展的一小步,却是编程语言发展的一大步.7.1 概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制与那些在编译时需要进行连接工作的语言不同,在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令...
2020-01-28 15:20:36
411
原创 6.深入理解java虚拟机--第三部分虚拟机执行子系统----类文件结构
6.1概述记得在第一节计算机程序课上我的老师就讲过:“计算机只认识0和1,所以我们写的程序需要经编译器翻译成由0和1构成的二进制格式才能由计算机执行”。10多年时间过去了,今天的计算机仍然只能识别0和1,但由于最近10年内虚拟机以及大量建立在虚拟机之上的程序语言如雨后春笋般出现并蓬勃发展,将我们编写的程序编译成二进制本地机器码(Native Code)已不再是唯一的选择,越来越多的程序语言选择...
2020-01-26 15:15:26
287
原创 5.深入理解java虚拟机--第二部分--- 调优案例分析与实战
5.1概述上文介绍了处理Java虚拟机内存问题的知识与工具,在处理实际项目的问题时,除了知识与工具外,经验同样是一个很重要的因素。因此本章将与读者分享几个比较有代表性的实际案例。考虑到虚拟机故障处理和调优主要面向各类服务端应用,而大部分Java程序员较少有机会直接接触生产环境的服务器,因此本章还准备了一个所有开发人员都能够进行“亲身实战”的练习,希望通过实践使读者获得故障处理和调优的经验。...
2020-01-24 09:00:17
332
原创 4.深入理解java虚拟机--第二部分--- 虚拟机性能监控与故障处理工具
4.1概述给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等。经常使用适当的虚拟机监控和分析的工具可以加快我们分析数据、定位解决问题的速度,但在学习工具前,也应当意识到工具永远都是知识技能的一层包装,没有...
2020-01-18 22:27:57
226
1
原创 3.深入理解java虚拟机--第二部分--- 垃圾收集器与内存分配策略
3.1概述哪些内存需要回收?[插图]什么时候回收?[插图]如何回收?3.2对象已死了吗?在堆中存放在几乎所有的java对象的实例,垃圾回收器在回收前,第一件事就是确定哪些对象是活的哪些对象已经死了3.2.1引用计数算法常用的是引用及计数算法:即给对象添加一个计数器,每当有地方引用它,计数器就加1,当引用失效,计数器就减一,任何时候计数器为0 的对象就是不可再用的对象,就是垃圾回...
2020-01-09 09:27:40
333
原创 2.深入理解java虚拟机--第二部分---java内存区域与内存溢出异常
目录2.java内存区域与溢出异常2.2运行时数据区域2.3Hotspot虚拟机对象探秘2.4 实战:OutOfMemoryError异常2.java内存区域与溢出异常2.1java与c或c++不同,c或c++的程序开发人员管理着内存,控制对象的生命周期.而java对象的存亡则是由java虚拟机自动的管理着.所谓着墙外的人想进来,墙内的人想出去java一旦出现内存溢...
2020-01-08 10:08:38
170
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人