- 博客(26)
- 资源 (7)
- 问答 (1)
- 收藏
- 关注
原创 spirng源码阅读日记3--spring aop
这里主要以xml配置为例解析aop代理的具体生成过程。aop是对目标对象的某个方法编入我们自定义的通知功能代码,这主要是通过代理(jdk or cglib)来实现的。那么这个代理对象什么时候生成的呢?其实就是在创建bean时,初始化完成后,进行后置处理得到的。(AbstractAutowireCapableBeanFactory 579行 exposedObject = initializeBea...
2018-06-05 14:55:18
303
原创 spirng源码阅读日记2--spring ioc
以ClassPathXmlApplicationContext的构造函数为入口点。(ClassPathXmlApplicationContext继承图见上一日记)public ClassPathXmlApplicationContext( String[] configLocations, boolean refresh, @Nullable ApplicationContext par...
2018-05-09 17:59:15
377
原创 spirng源码阅读日记1--spring基本对象的继承线
在使用经典(非web)模式的spring时,我们往往从一个applicationContext的实例来作为整个spring应用的入口,applicationContext作为应用上下文,既承担着加载配置文件的责任,又必须对外提供接口访问内部ioc容器中的对象。因此我们从applicationContext开始理清它的继承线,它的整个继承图如下:整个继承图中我们只需要关注两个比较重要的继承线: ...
2018-05-07 22:33:04
391
原创 通过零拷贝实现高效的数据传输
(翻译自:https://www.ibm.com/developerworks/linux/library/j-zerocopy/)(这里的零拷贝指的是可以不需要cpu参与的拷贝)许多web应用提供大量的静态内容服务,这意味着服务器要从硬盘读取内容并将完全相同的内容写到response的socket中。此活动过程看起来只要少量的cpu活动,但它的效率非常低下:操作系统内核从硬盘读取数据,然后将这些...
2018-05-07 20:04:59
2421
原创 thrift
自己实现简单rpc:实现原理:客户端和服务端建立socket链接,客户端使用jdk代理,将要调用的方法的类名,方法名,方法参数类型,方法参数通过socket输出流发送到server端,server端获取使用输入流读取这些内容,调用相关的实现类的方法,再将结果写入socket,客户端就获得了远程调用方法结果。client/*** Created by wanshenghua on 2018/3/30...
2018-03-31 18:11:21
279
原创 mysql四种事务隔离级别以及mvcc并发访问控制
Mysql是一个高性能支持并发访问的开源数据库,支持多种事务隔离级别以解决脏读,幻读等现象。分别介绍如下:1.未提交读: 在该级别下,即使事务中的修改没有被提交,其他事务仍然可以访问到这条被修改的记录,也就是说,不同事务之间的修改是相互可见的,这也就称为脏读。什么是脏读,脏读就是无效数据的读取。比如事务T1将值a修改为2,此时事务T2读取到a值为2,此时如果T1撤销了对a的
2017-10-07 22:59:15
589
原创 线程池源码剖析(创建,复用,超时处理)
在jdk1.5后,官方为我们实现了线程池ThreadPoolExecutor,通过该线程池,我们可以一次性的预先执行代价高昂的线程分配,而且所有分配的线程都是可重用的。下面我们将会根据Executors.newFixedThreadPool为切入口分析以下线程池的创建过程和线程池的线程分配问题。当我们执行Executors.newFixedThreadPool时,我们一直跟进构造这个方法的内部
2017-08-27 18:06:14
767
原创 阻塞队列
首先我们来看这样一个应用场景。假如现在有一个系统有两端,一端负责发送指令(比如扣款指令,放款指令),一端负责接受指令并执行相应的操作。这两个功能应该作为两个单独的线程在后台一直执行,以便及时的发送和处理消息。为了达到这个目的,我们必须设置两个一直轮循的线程,和一个用来存储发送端发送的指令的队列。假如现在消费者线程由于要执行完相应的指令操作(比如扣款,放款等)导致从队列中消费数据的速度远小于生产端发
2017-08-26 23:43:57
556
原创 Dockerfile详解
Dockerfile是用来构建镜像的标准文件。在Dockerfile中按照docker官方给出的Dockerfile规范编写相应的命令,然后在运行docker build 命令就可以由用户自己构建一个docker镜像。下面对一些主要命令做出一些解释。(查看完成命令建议直接上官方网址:https://docs.docker.com/engine/reference/builder/)FROM:
2017-08-20 16:31:34
614
原创 快速理解docker
Docker是一个开源的容器引擎,也是当前大火的微服务的一种实现方案。docker能够将一个应用程序或者说app的全部运行环境打包进一个容器中。而容器是可以根据镜像批量生产的。也就是说,通过docker,开发者只需要将需要的应用以及依赖包全部按照docker规范编写dockerfile文件,就能制作出一个专属镜像,通过这个镜像,不管是在windows,还是linux上,都可义实例化一个完全一样的容
2017-08-19 15:20:39
744
原创 volatile关键字详解(从缓存一致性谈起)
在讲解volatile关键字之前,我们先来看看操作系统中缓存一致性的概念。众所周知,cpu的运行速度是远高于主存的读写速度的,在运行过程中,为了交换数据,cpu必须频繁的进行数据的读写操作,主存读写速度慢造成了cpu运行的吞吐量减少。为了解决这一问题,现在的机器都会在添加一层高速缓存(其实不止一层,有多层).以后每次cpu进行读写操作时,都直接和高速缓存交互,之后在讲高速缓存中的数据回刷到主存
2017-07-14 10:51:06
4691
3
原创 类加载过程详解
类加载总共有三个阶段:加载 -> 连接(验证 -> 准备 -> 解析) -> 初始化。java虚拟机规范并没有对何时适合进行加载操作进行详细的规定。但对于初始化阶段,虚拟机严格规定了5中情况下会开始初始化操作(那么加载,连接操作必然会先进行):1.遇到new, getstatic, putstatic 或者invokestatic. 这三条指令分别对应使用new关键字实例化一个对象,读取
2017-06-30 13:52:41
485
原创 决策树
决策树是机器学习中最基本的一种分类算法,主要用来根据训练数据集的特质来一步步往下划分,直到所有特质(属性)都已经使用完毕或者已得到的划分数据集中的数据全部为同一类型的数据。首先我们来看看信息熵和信息增益的定义:信息:其中p(xi)是当前在数据集中选择分类为xi的数据集的概率信息熵:信息熵表示数据集中数据类别的混乱程度,信息熵越小,表示这个数据集的数据纯度越高,反之就是越
2017-06-21 15:35:27
583
原创 spark调度流程源码剖析
Spark作为一个优秀的分布式集群内存计算框架,提供了简单接口和丰富的rdd算子供开发者调用。spark的运行速度之所以如此之快,一方面是因为它基于内存,另一方面是因为它对job,state,task的划分并根据算子的shuffle过程将同一端的多个算子操作直接执行一条pipeline,减少了不必要的中间过程的存储消耗。根据官网的spark调度流程,我们看到如下图:这张图非常简洁,大概
2017-06-05 15:28:59
450
原创 Spark Client和Cluster两种运行模式的工作流程
1.client mode: In client mode, the driver is launched in the same process as the client that submits the application..也就是说在Client模式下,Driver进程会在当前客户端启动,客户端进程一直存在直到应用程序运行结束。该模式下的工作流程图主要如下:工作流程
2017-05-22 16:28:00
8922
原创 ApplicationMaster,ResourceManager和NodeManager通信过程
ApplicationMaster与ResourceManager和NodeManager的交互: rpc交互: 1.与ResourceManager交互,ApplicationMaster可获得计算所需的资源 2.与NodeManager交互,ApplicationMaster可启动计算任务并监控它的生命周期1.ApplicationMast
2017-05-22 09:39:49
7192
1
原创 Rdd,DataFrame和DataSet的区别
这三个都是分布式数据集。但有一点不同,Rdd可以存放用户自定义的数据对象,DataFrame只能存放Row类型的数据和一些Schema信息,而DataSet既可以存放用户自定义的数据类型,又可以存放一些该数据类型的Schema信息。可以说,DataSet结合了Rdd和DataFrame的优点。Rdd提供了强大的算子操作,但是对于一些结构化数据类型的信息查询并不方便,比如如果我们要查
2017-05-16 21:33:03
826
原创 spark on yarn:Container is running beyond physical memory limits
在虚拟机中安装好hadoop和spark后。执行start-all.sh(hadoop命令)来开启hdfs和yarn服务。服务开启成功后,为了测试spark on yarn的可执行性,输入命令:./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client ./exa
2017-05-11 17:00:55
3037
原创 hadoop MapReduce模型的shuffle过程
shuffle是MapReduce编程模型的核心。它主要指从maptask输出key/value到reducetask接受输入这段过程。这段过程也被称为“神奇发生的地方”,是mapreduce能顺利进行的保障。它的官方描述图如下:先来分析map端的操作:在这图种,map端的input来自本机存储的block种的数据。每执行一次map函数式,会传入偏移量和一行block中的数据,经过
2017-04-28 11:24:57
946
原创 jvm堆内存分代
jvm堆内存中,大概可分为新生代,老年代,永久代(以前可以看作是方法区),由于现在的jvm已经去永久代了,所以实质上只有前两种1.新生代 : 新生代又分为eden区域和两个survivor区域。默认大小比例为8:1. 大部分新生成的对象都直接分配在eden中,如果在新生代中执行一次gc,eden中 未被回收的对象就会进入survivor区域中,同时对象的年龄+1,经过多次gc后,如果
2017-04-15 15:40:22
645
原创 jvm的GC机制和四大引用类别
首先讲讲gc机制。很多人在面试中被问到jvm的gc机制,都会自然而然地回答为引用计数法。在我们一些常见的虚拟机中,比如python的虚拟机,的确是采用引用计数法来标记垃圾对象的,但在主流的jvm中,采用的是另一机制,可达性分析。可达性分析将所有对象及其引用关系看作一个图结构,从某个节点(GCroot节点)到某个节点是联通的,我们就说这个对象是活的,反之,就是需要被回收的对象。根据深入理解jvm
2017-04-14 20:46:16
1149
原创 jvm内存模型浅析
首先要说明的是,jvm的结构相当复杂且不同的jvm还有不同的实现,我这里仅仅是根据相关书籍做个简单的分析。要了解java中对象和变量(静态变量,实例变量,局部变量)究竟在哪里进行创建以及内存分配,就必须先大概了解一下jvm的内存模型。如图:程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。由于每个线程执行
2017-03-03 16:20:56
420
原创 桥接模式(合成/聚合+单一职责的体现)
假设现在有这么一个请求:创建多个不同的窗口系统,如临时会话窗口(transientWindow)和图标窗口(iconWindow)以及其他各种类型窗口,同时这些窗口的要在linux和unix以及window上都能创建。这是一个典型的多种变化结合在一起的例子。很多人一开始会使用继承来解决这个问题,如下:public
2017-02-28 08:24:58
583
原创 饿汉式和懒汉式(单例模式详解)
单例的目的是保证某个类仅有一个实例。当有某些类创建对象内存开销较大时可以考虑使用该模式。单例模式又分为饿汉式和懒汉式。下面分别说明:1.饿汉式。顾名思义,该模式在类被加载时就会实例化一个对象。具体代码如下:public class Person {//饿汉式单例private static Person person = new Person();private Person(
2017-02-25 14:37:14
8581
原创 迭代器模式
迭代器模式几乎在所有面向对象语言中都大量存在,且被很多语言支持,如java,c#等已经内部支持(也就是foreach)。迭代器模式可以为不同的集合对象提供统一的遍历接口,而不用关心集合的内部结构。遍历集合对象时,优先使用迭代器模式,能让代码更具可移植性和重用性。下面时具体代码(代码只是粗糙实现)://声明一个集合接口public interface Collection {publi
2017-02-24 15:04:17
417
消除if-else分支结构的问题
2017-02-27
TA创建的收藏夹 TA关注的收藏夹
TA关注的人