自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

r09er的博客

严于律己,宽以待人

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

原创 深入拆解Tomcat&Jetty(七)

回顾一下Tomcat的启动步骤1.安装JDK,配置环境变量2.下载Tomcat并解压3.执行tomcat/bin目录下的start.sh执行脚本后的流程image1.Tomcat本质上还是一个Java程序,因此startup.sh脚本会启动一个JVM来运行Tomcat的启动类BootStrap其实Tomcat和我们自己平时写的代码并没有本质上的...

2020-04-04 20:30:07 400

原创 深入拆解Tomcat&Jetty(六)

回顾Tomcat处理请求下图是对于Tomcat处理请求内部的流转过程.也描述了Tomcat组件的静态关系.image如果让一个系统能够对外提供服务,需要创建,组装并启动这些组件,在停止的时候,需要释放资源,销毁组件,这个过程都是动态的,所以Tomcat需要动态管理这些组件的生命周期.Tomcat的LifeCycle接口在Tomcat的启动过程中,每个组件都...

2020-04-04 17:20:15 163

原创 深入拆解Tomcat&Jetty(五)

在上文的学习中,已经了解了Tomcat通过连接器(Connector)和容器(Container)对请求进行解析和处理,其中连接器负责对外,容器则是内部处理.容器的层次结构在Tomcat中,容器(Container)的作用就是用来装载Servlet.而Tomcat设计了4种有层级关系的容器|Container | Engine | Host ...

2020-04-04 17:19:38 433

原创 深入拆解Tomcat&Jetty(四)

Tomcat总体架构处理Socket连接,负责网络字节流与Request和Response对象的转化加载和管理Servlet,以及具体处理Request请求因此Tomcat设计了两个核心组件连接器(Connector)和容器(Container)来分别完成这两件事.连接器负责对外交流,容器负责内部处理连接器和容器可以说是Tomcat架构里最重要的两部分.Tomca...

2020-04-04 17:19:08 352

原创 深入拆解Tomcat&Jetty(三)

Servlet规范和Servlet容器由HTTP请求过程可以知道,HTTP服务器收到请求后,需要调用服务端程序进行处理,所谓的服务端程序就是开发人员编写的Java类,一般来说不同的请求需要由不同的Java类进行处理,而HTTP并不知道要调用哪个Java类的哪个方法,所以就有了Servlet接口.虽然有了Servlet接口,将具体实现交由业务方处理,但是对于特定的请求,HTTP服...

2020-04-04 17:18:48 1255

原创 深入拆解Tomcat&Jetty(二)

HTTP协议必知必会Tomcat和Jetty本身就是一个HTTP服务器+Servlet容器,所以了解HTTP协议是必要前提.HTTP的本质HTTP(Hyper Text Transper Protocol)超文本传输协议,是浏览器与服务器之间数据传输协议.是基于TCP/IP协议的应用层协议,用于数据传递(HTML文件,图片,查询结果等).HTTP协议不涉及数据包(Packe...

2020-04-04 17:17:31 817

原创 深入拆解Tomcat&Jetty(一)

本系列是学习Tomcat教程的学习记录.Web容器随着互联网的发展,静态页面不能满足我们的需求,需要动态地获取结果.而Sun公司就推出了Servlet技术,Servlet可以简单理解为运行在服务端的Java程序,但是Servlet并没有main方法,所以需要一个容器对Servlet进行实例化并调用它.Tomcat和Jetty就是一个可以运行Servlet的容器,为了方便使用,也...

2020-04-04 17:15:52 962 1

原创 Redis-Sorted-Set底层数据结构

面试被问到了SortedSet(ZSet)的底层数据结构..只记得是跳表.然而并不了解底层实现.所以本文是对于SortedSet的学习记录Sortedset底层存储结构sortedset同时会由两种数据结构支持,ziplist和skiplist.只有同时满足如下条件是,使用的是ziplist,其他时候则是使用skiplist有序集合保存的元素数量小于128个有序集合保...

2020-04-02 12:01:10 4705 1

原创 JVM(七)内存空间

JVM内存空间JVM规范在程序运行期间定义了不同的数据区域.有一些区域跟随JVM的创建销毁.而有些区域则是线程独有的,线程独有的区域会跟随线程的创建与销毁.在不同版本和不同厂商的JVM版本中,都会有较大差异.本文基于JDK8,HotSpot虚拟机进行的总结JVM规范内的运行时数据区域程序计数器(The pc Register)JVM支持多线程,每个线程都有自己的程序计数器.当线程执行中...

2020-03-30 11:39:36 235

原创 JVM(九)JVM常用参数-不定时更新

JVM参数官方JDK8虚拟机参数主要分为6类6大类参数参数描述-Xmx5m堆内存最大5m-Xms5m堆内存初始化为5m-Xmn10m设置年轻代最大为10m-Xss256k线程堆栈大小256k,等同于-XX:ThreadStackSize=256k,这个参数会影响到虚拟机栈的,即方法栈的深度.设置太小可能会导致程序运行时...

2020-03-25 18:14:38 151

原创 JVM(八)-垃圾回收机制与垃圾收集器

JVM垃圾回收(GC)模型垃圾判断算法GC算法垃圾收集器的实现和选择垃圾判断算法引用计数法(Reference Couting)算法逻辑给对象添加一个引用计数器,当一个地方引用它,计数器+1,当引用失效,计数器-1.任何时刻计算器对象为0的对象就是不能再被使用的.算法弊端无法解决循环依赖问题.即A依赖于B,B也依赖于A.根搜索算法(GC Roots Trac...

2020-03-25 18:06:59 201

原创 JVM(七)JVM内存空间

JVM内存空间在JVM运行期间,会将内存划分为不同的区域在不同版本和不同厂商的JVM版本中,都会有较大差异.本文基于JDK8,HotSpot虚拟机进行的总结虚拟机栈(Stack)线程独有的内存空间,每个方法在执行时候会形成一个栈帧,用于存在这个方法的局部变量,操作数栈,动态链接,方法返回等信息.程序计数器(Program counter)线程独有,描述的是JVM执行过...

2020-03-24 15:35:31 97

原创 JVM(五)类的初始化

类的初始化类的初始化步骤假如类还未被加载和连接,那就先进行加载和连接假如类存在直接父类,并且这个父类还未被初始化,那就先初始化父类假如类中存在初始化语句,那就一次执行初始化语句类的初始化时机7种主动使用和被动使用,会触发类的初始化当初始化类的时候,要求父类都已经被初始化,但是这条规则不适用于接口(interface)初始化一个类时,并不会先初始化它所实现的接口...

2020-03-24 14:41:35 87

原创 JVM(四)类的连接

类的验证类被加载后,就进入连接阶段.连接就是将已经读入到内存的类的二进制数据合并到虚拟机运行时环境中.类验证的内容即使每个虚拟机实现都不同,但是大都会围绕以下几点进行类文件的结构检查语义检查字节码验证二进制兼容性验证类的准备在准备阶段,Java虚拟机为类的静态变量分配内存,并设置默认的初始值类的解析将间接引用转化为直接引用Java代码中的对象引用转化为...

2020-03-24 14:41:08 147

原创 SpringDataElasticSearch(一)

SpringDataElasticsearchSpringDataElasticsearch是SpringData模块的一个子模块,是对ES原生API的二次封装.由于SpringData版本与ES版本有相关的依赖性.所以集成会有坑.以此记录SpringBoot,SpringData,ES各个版本的支持情况本文编写时候ES最新版已经是7.6.1,但是SpringData最...

2020-03-20 16:48:10 149

原创 JVM(三)类加载器

类的加载类的加载是指将类的.class文件中二进制数据读入到内存中,然后将其放在运行时数据区的方法区内,然后在内存中创建爱你一个java.lang.Class对象规范并没有说明Class对象应该存放在哪,HotSpot虚拟机将其放在方法区中,用来封装类在方法区内的数据结构加载.class文件的方式从本地系统中直接加载从网络下载.calss文件从zip,jar等归档...

2020-03-20 16:46:24 82

原创 SpringDataCache踩坑记

SpringDataCache配合Redis使用缓存.完整配置在最后目的:使用注解形式优雅地序列化数据到redis中,并且数据都是可读的json格式为了达到以上目的,在SpringCache的使用过程中,需要自定义Redis的Serializer和Jackson的ObjectMapper,而且非常多坑.由于项目中使用了Java版本为JDK8,并且整个项目中关于时间的操作类全都是LocalD...

2020-03-19 10:34:49 1008

原创 JVM(二)类的主动使用与被动使用

对类的使用方式主动使用被动使用所有Java虚拟机实现必须在每个类或接口被Java程序首次主动使用时才初始化主动使用才进行初始化第一次主动使用才进行初始化,之后就不再初始化只有当程序访问的静态变量或静态方法确实在当前类或当前接口中定义时,才可认为是对类或接口的主动使用主动使用创建类的实例new Object()访问某个类或接口的静态变量,或者对该静...

2020-03-18 17:03:07 196

原创 JVM(一)类加载阶段分解

类加载器深入解析与阶段分解类加载阶段在Java代码中,类型的加载,连接与初始化过程都是在程序运行期间完成提供了更大的灵活性,增加了更多的可能性加载将已存在的磁盘的类的class文件加载到内存中连接对字节码的处理,验证,校验类与类之间的符号引用转为直接引用初始化对于静态变量进行赋值JVM规范对类加载的阶段进行了约束,但是具体情况需要根据运行时的...

2020-03-18 16:57:37 83

原创 Redis实现不可靠发布/订阅功能

Redis的发布/订阅模型Redis 通过 PUBLISH 、 SUBSCRIBE 等命令实现了订阅与发布模式, 这个功能提供两种信息机制, 分别是订阅/发布到频道和订阅/发布到模式, 本文讨论订阅/发布到频道的实现该种模型类似于RocketMQ中广播模式,消费者订阅topic如图展示了发布消息到channel1后,各个client都会接收到messageim...

2020-03-18 16:51:32 4803 3

原创 SpringCloud系列-Nacos注册中心

通过源码启动Nacos单机模式Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。在官网上提供了源码编译和发行包两种启动方式,但是在学习过程中又想要将源码下载下来,通过IDEA导入源码的方式启动Nacos.默认情况下Nacos又是cluster模式启动,所以需要修改JVM参数完整流程如下1.下载Nacos源码git clone https://g...

2020-01-14 21:25:42 112 1

原创 SpringBoot2.x中WebFlux/SpringMVC全局处理异常

默认的全局异常类:DefaultErrorWebExceptionHandler在SpringBoot中,默认的全局异常处理类是DefaultErrorWebExceptionHandler,会根据请求头中的Accept参数返回视图或者数据(JSON).SpringBoot1.x中使用的是DefaultErrorViewResolver从WebFlux的DefaultE...

2018-08-28 22:32:31 359

原创 详解Android打包上传使用AAR

最近在做基础功能和架构搭建,所以会将基础功能进行封装,并提供一份远程依赖.在使用过程中踩了很多坑.特地进行记录不想看分析和流程的可以直接点击查看,重点关注工程的三个gradle文件和相关注释,MainActivity有引用库的类示例示例代码在Android中使用第三方的库和自己的库,无论是远程依赖还是本地依赖,通常会选择JAR和AAR的形式.而AAR相比JAR包可以包含资源文件...

2018-04-28 23:24:22 242

原创 重识Java多态

今天面试被问到了Java多态的知识点面试官: 了解多态吗,说一说你对多态的理解我:balabala..面试官:知道多态是如何实现的吗我:涉及到了我的知识盲区...赶紧回去拿起Thinking In Java看一遍多态的章节..作为面向对象中的一个重要特征,多态的原理必须要掌握.多态:多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来,多态不但能...

2018-03-24 23:40:48 61

原创 HashMap分析小结

HashMap是Java使用频率很高的容器对象,内部使用了很多优化算法,源码非常值得学习.关于HashMap非线程安全HashTable对put和get使用了synchronized关键字,线程安全,但是已经被废弃,ConcurrentHashMap是推荐使用的线程安全,高并发Map实现key-value存储key和value都可以为null,多个为null的k...

2018-02-07 21:21:04 87

原创 动态加载so库解决方案

背景项目中集成了腾讯直播等一些第三方sdk,其中部分sdk又包含so库,而且体积非常大,(只集成了arm-v7a的so库apk体积都增加了近8M),然而引入的这部分功能不是产品必须功能,所以考虑将so库文件进行动态下发。关于动态加载SO文件动态加载SO文件其实很简单,就两个方法,在调用需要so库的API之前,通过System.load()方法动态加载so库,再调用APIso...

2017-10-08 16:38:41 832

原创 设计模式-策略模式Strategy

动机在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,会使对象变得异常复杂.在运行时根据需要透明地改变对象的算法,将算法与对象本身解耦定义定义一系列算法,把他们一个个封装起来,使它们可以相互替换,该模式使得算法可独立于使用它的客户程序而变化image.png要点Strategy 及其子类为组件提供一系列可重用的...

2017-10-04 16:52:38 75

原创 设计模式-模板方法

模版方法的动机在软件构建过程中,有某一个功能,通常有稳定的整体结构,但是各个子步骤却又很多改变的需求,又或者由于固有的原因(框架与应用间的关系)而无法和任务的整体结构同时实现如何在确定稳定操作结构的前提下,灵活的应对各个子步骤的变化或者晚期实现需求.模版模式的定义定义一个操作中的算法的骨架(稳定),将一些步骤和方法(变化)延迟到子类,Template Method使得子...

2017-10-04 16:51:22 42

原创 Android-Jenkins+Gradle+Git自动化打包最佳实践

JenkinsSampleJekins+Gradle最佳实践Jenkins是一款开源的持续集成工具,可用于工程自动化测试和打包。支持Web,iOS,Android,Monkey测试等。Jenkins官网本文是Jenkins+Gradle打包apk的最佳示例,鉴于网上的各种教程存在的问题和坑,所以记录一下搭建过程和使用时候存在的坑。由于gradle的相关配置比较复杂,可定制...

2017-09-23 14:54:49 283 1

原创 设计模式-比具体模式更重要的准则

重构获得模式 Refactoring to Patterns面向对象设计模式是"好的面向对象设计",而好的设计指的是可以满足"应对变化",提高复用现代软件设计的特点是"需求的频繁变化",设计模式是在"寻找变化点",然后在变化点应用设计模式,从而更好地应对需求的变化.什么时候,什么地点应用设计模式比"理解设计模式结构本身"更为重要.除非非常有经验,否则设计模式都应该通过...

2017-09-16 16:10:37 49

原创 RxJava2+Retrofit+MVP高仿猫眼电影(7.9.1)

项目初衷一直以来看到很多开源项目都是什么MaterialDesign(后面简称MD),但是真的是这样吗,个人觉得这些项目只是为了MD而MD,用几个控件就说自己的是MD风格,写了几个XML就觉得把MD的控件用熟了,如果是这样,我宁愿不用!对于真正是MD的App我只在Google市场和一些真正优秀的开源项目看到过,至于国内的目前我只看到了B站.为什么不参照一些设计和交互都不错的应用...

2017-07-01 18:08:06 235

原创 ButterKnife跨module使用

Android开发中大部分都会存在多module的情况,但是butterKnife默认只支持在同一个module下的注解,在library是无法使用的,但是很多情况下我们可能有一个公共的lib,用于提供给其他module公共的utils和抽出的base类,那这种情况下,该如何使用butterKnife为不同的module提供注解功能呢。使用步骤1.需要2个以上的module,...

2017-04-26 10:23:23 192

原创 RxJava2+Retrofit2单文件下载监听进度封装

RxJava2和Retrofit2用的越来越多,最近也在封装一个通用的网络请求库,其中就包括了单文件下载的方法,所以这里进行记录。文末附带Demo由于网上很多的方法都是使用拦截器进行进度的监听,个人觉得使用起来非常复杂和,所以取了个巧,在文件写入到硬盘的时候对文件读写进行监听,就解决了retrofit2下载文件没有进度监听的问题。先上封装之后的使用代码,使用简单,直接回调下载之...

2017-04-20 17:20:22 173

原创 Android与Js通信之JsBridge再封装

文末有demo工程和相关lib,附带aarAndroid与Js通信的文章已经太多,而且都写的非常详细,这里只针对使用JsBridge的库进行二次封装使用进行介绍,使用简单。为什么使用JsBridge?Android 调用 Js 的方法 - Android 没法拿到返回值Android调用Js方法时,需要手写完整的Js脚本和参数,出错几率大Js无法知道调用Android...

2017-04-19 15:10:32 321

原创 RxJava2+Retrofit2单文件上传监听进度封装(服务端代码+客户端代码)

最近折腾了一下文件上传的方法,网上虽然有不少封装好的,但是基于RxJava2+Retrofit 带上传进度的还没有找到好的解决方法,所以自己就去踩了一下坑。(大部分和RxJava1的方法是一样的)。主要思路:继承okHttp3的RequestBody方法,在"写入"的方法监听数据传递的字节长度,当上传的上传的字节长度和文件总大小一致,则上传完成。(没有耐心看实现过程的直接到git...

2017-03-21 18:00:23 196

原创 取消Activity跳转与返回默认动画

1.在styles文件添加如下内容<style name="noAnimation"> <item name="android:activityOpenEnterAnimation">@null</item> <item name="android:activityOpenExitAnimation">@null...

2017-02-09 15:53:45 124

原创 EventBus在Fragment中使用的注意事项

EventBus是目前比较流行的模块通信库,在使用中还是有一些地方需要注意简单回顾一下EventBus最基本的使用步骤1.注册EventBus.getDefault().register(obj);2.处理方法@Subscribe(threadMode = ThreadMode.MAIN)public void onEvent(Event event) { //处理...

2017-02-08 16:54:46 611

原创 猫眼电影下拉刷新效果实现

无入侵的猫眼下拉刷新,无需重写RecyclerView,像SwipeRefreshLayout一样使用简单最近在做一个高仿的猫眼App,观察猫眼电影App的下拉刷新后,发现其中还是有小细节的,所以决定自己动手撸了一个猫眼下拉刷新(其实是网上实在没有找到可以抄的代码。。),结合SuperRefreshLayout加上自定义的一个刷新头部达到了猫眼App的下拉刷新效果先上图...

2017-02-08 00:17:14 201

空空如也

空空如也

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

TA关注的人

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