模型:         反应器模式做法是:汽车是乘客访问的主体(Reactor),乘客上车后,到售票员(acceptor)处登记,之后乘客便可以休息睡觉去了,当到达乘客所要到达的目的地后,售票员将其唤醒即可.         反应器模式与观察者模式在某些方面极为相似:当一个主体发生改变时,所有依属体都得到通知.不过,观察者模式与单个事件源关联,而反应器模式则与多个事件源关联. JDK中模式原型复现: NIO有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketcha…
背景 项目中我们会遇到这种情况:在几个方法中增加同样的代码,这些代码是与业务无关的,而且以后有可能因为考虑不周或需求变动再或者是其它原因,我们须要对他们进行逐一进行修改.举个详细的样例,比方程序中的日志控制.事务控制等,这些功能是与业务无关的,但却须要将它们与我们的逻辑混在一起.达到一些特殊的需求. 这种情况往往代码都是同样的,能够抽离出来,为了复用,我们能够将这些同样的代码单独封装成的方法,以供其它须要的地方调用,这样对于以后的改动就做到了仅仅改动一处的效果,达到了程序的复用.但另外一个问题便…
前提概要 Java调式.热部署.JVM背后的支持者Java Agent: 各个 Java IDE 的调试功能,例如 eclipse.IntelliJ : 热部署功能,例如 JRebel.XRebel.spring-loaded: 各种线上诊断工具,例如 Btrace.Greys,还有阿里的 Arthas: 各种性能分析工具,例如 Visual VM.JConsole 等: Agent的介绍 Java Agent 直译过来叫做 Java 代理,还有另一种称呼叫做 Java 探针.首先说 Java…
前提概要 Java的class字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令.这个过程是Java虚拟机做的,这个过程也叫编译.是更深层次的编译. 在编译原理中,把源代码翻译成机器指令,一般要经过以下几个重要步骤: 根据完成任务不同,可以将编译器的组成部分划分为前端(Front End)与后端(Back End). 前端编译主要指与源语言有关但与目标机无关的部分,包括词法分析.语法分析.语义分析与中间代码生成. 后端编译主要指与目标机有关的部分,包括代码优化和目标代码生成等…
前言 在目前众多编程语言中,Java 语言的表现还是抢眼,不论是企业级服务端开发,还是 Andorid 客户端开发,都是作为开发语言的首选,甚至在大数据开发领域,Java 语言也能占有一席之地,如Hadoop,Spark,Flink 大数据等.而作为已经诞生 24 年的 Java 相比其他语言来说,编写起来略显得冗长和复杂,而为了能极大提升 Java 开发的效率和代码简洁性,一个 Java 库 Lombok 就这样诞生了. 首先我们还是看下 Lombok 官方的描述: Project Lombo…
  类加载的生命周期:  加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载       加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 卸载 这6个阶段顺序是确定的,klass的加载过程一定会按照这个顺序执行.为了支持java的运行时绑定,解析阶段在某些情况下会在初始化之后才进行. 类的初始化阶段 对于加载这个阶段是跟具体的虚拟机实现有关,对于整个类加载阶段最重要的就是初始化这个阶段. JVM执行…
基础参数系类(内存分配) -server:一定要作为第一个参数,在多个CPU时性能佳 -Xmn:young generation的heap大小,一般设置为Xmx的3.4分之一-Xms:初始Heap大小,使用的最小内存,cpu性能高时此值应设的大一些-Xmx:Javaheap最大值,使用的最大内存 (上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半.)默认为1/64 和 1/4-XX:PermSize:设定内存的永久保存区域-XX:MaxPermSize:…
1.JVM-堆快照(Snapshot) 1.1 输出方式-获取hprof文件 启动参数配置OOM时触发打印堆快照 (1)tomcat启动方式添加参数 (添加环境变量) export JAVA_OPTS=  -XX:+HeapDumpOnOutOfMemoryError (表明进行统计相关heapDump文件再OOM的时候) -XX:HeapDumpPath=/export/Domains/rcsv-fm.wd.local/server1/logs/gc.hprof(表明会导出生产的HeapDum…
前提概要 在java8以前,我们使用java的多线程编程,一般是通过Runnable中的run方法来完成,这种方式,有个很明显的缺点,就是,没有返回值.这时候,大家可能会去尝试使用Callable中的call方法,然后用Future返回结果,如下: public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Fut…
延时队列前提 定时关闭空闲连接:服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之. 定时清除额外缓存:缓存中的对象,超过了空闲时间,需要从缓存中移出. 实现任务超时处理:在网络协议滑动窗口请求应答式交互时,处理超时未响应的请求. 应用在session超时管理:网络应答通讯协议的请求超时处理. 痛点方案机制 一种比较暴力的办法就是,使用一个后台线程,遍历所有对象,挨个检查.这种笨笨的办法简单好用,但是对象数量过多时,可能存在性能问题,检查间隔时间不好设置,间隔时间过大,影响精确度,多小则存…