自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 资源 (7)
  • 问答 (1)
  • 收藏
  • 关注

原创 spirng源码阅读日记3--spring aop

这里主要以xml配置为例解析aop代理的具体生成过程。aop是对目标对象的某个方法编入我们自定义的通知功能代码,这主要是通过代理(jdk or cglib)来实现的。那么这个代理对象什么时候生成的呢?其实就是在创建bean时,初始化完成后,进行后置处理得到的。(AbstractAutowireCapableBeanFactory 579行 exposedObject = initializeBea...

2018-06-05 14:55:18 261

原创 spirng源码阅读日记2--spring ioc

以ClassPathXmlApplicationContext的构造函数为入口点。(ClassPathXmlApplicationContext继承图见上一日记)public ClassPathXmlApplicationContext(      String[] configLocations, boolean refresh, @Nullable ApplicationContext par...

2018-05-09 17:59:15 302

原创 spirng源码阅读日记1--spring基本对象的继承线

在使用经典(非web)模式的spring时,我们往往从一个applicationContext的实例来作为整个spring应用的入口,applicationContext作为应用上下文,既承担着加载配置文件的责任,又必须对外提供接口访问内部ioc容器中的对象。因此我们从applicationContext开始理清它的继承线,它的整个继承图如下:整个继承图中我们只需要关注两个比较重要的继承线:   ...

2018-05-07 22:33:04 342

原创 通过零拷贝实现高效的数据传输

(翻译自:https://www.ibm.com/developerworks/linux/library/j-zerocopy/)(这里的零拷贝指的是可以不需要cpu参与的拷贝)许多web应用提供大量的静态内容服务,这意味着服务器要从硬盘读取内容并将完全相同的内容写到response的socket中。此活动过程看起来只要少量的cpu活动,但它的效率非常低下:操作系统内核从硬盘读取数据,然后将这些...

2018-05-07 20:04:59 2320

原创 thrift

自己实现简单rpc:实现原理:客户端和服务端建立socket链接,客户端使用jdk代理,将要调用的方法的类名,方法名,方法参数类型,方法参数通过socket输出流发送到server端,server端获取使用输入流读取这些内容,调用相关的实现类的方法,再将结果写入socket,客户端就获得了远程调用方法结果。client/*** Created by wanshenghua on 2018/3/30...

2018-03-31 18:11:21 245

原创 mysql锁详解

Mysql的默认存储引擎是InnoDB,因此这里主要讨论InnoDB

2017-10-08 12:53:30 683

原创 mysql四种事务隔离级别以及mvcc并发访问控制

Mysql是一个高性能支持并发访问的开源数据库,支持多种事务隔离级别以解决脏读,幻读等现象。分别介绍如下:1.未提交读:         在该级别下,即使事务中的修改没有被提交,其他事务仍然可以访问到这条被修改的记录,也就是说,不同事务之间的修改是相互可见的,这也就称为脏读。什么是脏读,脏读就是无效数据的读取。比如事务T1将值a修改为2,此时事务T2读取到a值为2,此时如果T1撤销了对a的

2017-10-07 22:59:15 543

原创 线程池源码剖析(创建,复用,超时处理)

在jdk1.5后,官方为我们实现了线程池ThreadPoolExecutor,通过该线程池,我们可以一次性的预先执行代价高昂的线程分配,而且所有分配的线程都是可重用的。下面我们将会根据Executors.newFixedThreadPool为切入口分析以下线程池的创建过程和线程池的线程分配问题。当我们执行Executors.newFixedThreadPool时,我们一直跟进构造这个方法的内部

2017-08-27 18:06:14 727 2

原创 阻塞队列

首先我们来看这样一个应用场景。假如现在有一个系统有两端,一端负责发送指令(比如扣款指令,放款指令),一端负责接受指令并执行相应的操作。这两个功能应该作为两个单独的线程在后台一直执行,以便及时的发送和处理消息。为了达到这个目的,我们必须设置两个一直轮循的线程,和一个用来存储发送端发送的指令的队列。假如现在消费者线程由于要执行完相应的指令操作(比如扣款,放款等)导致从队列中消费数据的速度远小于生产端发

2017-08-26 23:43:57 510

原创 Dockerfile详解

Dockerfile是用来构建镜像的标准文件。在Dockerfile中按照docker官方给出的Dockerfile规范编写相应的命令,然后在运行docker build 命令就可以由用户自己构建一个docker镜像。下面对一些主要命令做出一些解释。(查看完成命令建议直接上官方网址:https://docs.docker.com/engine/reference/builder/)FROM:

2017-08-20 16:31:34 556

原创 快速理解docker

Docker是一个开源的容器引擎,也是当前大火的微服务的一种实现方案。docker能够将一个应用程序或者说app的全部运行环境打包进一个容器中。而容器是可以根据镜像批量生产的。也就是说,通过docker,开发者只需要将需要的应用以及依赖包全部按照docker规范编写dockerfile文件,就能制作出一个专属镜像,通过这个镜像,不管是在windows,还是linux上,都可义实例化一个完全一样的容

2017-08-19 15:20:39 702

原创 volatile关键字详解(从缓存一致性谈起)

在讲解volatile关键字之前,我们先来看看操作系统中缓存一致性的概念。众所周知,cpu的运行速度是远高于主存的读写速度的,在运行过程中,为了交换数据,cpu必须频繁的进行数据的读写操作,主存读写速度慢造成了cpu运行的吞吐量减少。为了解决这一问题,现在的机器都会在添加一层高速缓存(其实不止一层,有多层).以后每次cpu进行读写操作时,都直接和高速缓存交互,之后在讲高速缓存中的数据回刷到主存

2017-07-14 10:51:06 4565 4

原创 类加载过程详解

类加载总共有三个阶段:加载 -> 连接(验证 -> 准备 -> 解析) -> 初始化。java虚拟机规范并没有对何时适合进行加载操作进行详细的规定。但对于初始化阶段,虚拟机严格规定了5中情况下会开始初始化操作(那么加载,连接操作必然会先进行):1.遇到new, getstatic, putstatic 或者invokestatic.  这三条指令分别对应使用new关键字实例化一个对象,读取

2017-06-30 13:52:41 449 2

原创 决策树

决策树是机器学习中最基本的一种分类算法,主要用来根据训练数据集的特质来一步步往下划分,直到所有特质(属性)都已经使用完毕或者已得到的划分数据集中的数据全部为同一类型的数据。首先我们来看看信息熵和信息增益的定义:信息:其中p(xi)是当前在数据集中选择分类为xi的数据集的概率信息熵:信息熵表示数据集中数据类别的混乱程度,信息熵越小,表示这个数据集的数据纯度越高,反之就是越

2017-06-21 15:35:27 515

原创 spark调度流程源码剖析

Spark作为一个优秀的分布式集群内存计算框架,提供了简单接口和丰富的rdd算子供开发者调用。spark的运行速度之所以如此之快,一方面是因为它基于内存,另一方面是因为它对job,state,task的划分并根据算子的shuffle过程将同一端的多个算子操作直接执行一条pipeline,减少了不必要的中间过程的存储消耗。根据官网的spark调度流程,我们看到如下图:这张图非常简洁,大概

2017-06-05 15:28:59 404

原创 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 8862

原创 ApplicationMaster,ResourceManager和NodeManager通信过程

ApplicationMaster与ResourceManager和NodeManager的交互:      rpc交互: 1.与ResourceManager交互,ApplicationMaster可获得计算所需的资源               2.与NodeManager交互,ApplicationMaster可启动计算任务并监控它的生命周期1.ApplicationMast

2017-05-22 09:39:49 7062 1

原创 Rdd,DataFrame和DataSet的区别

这三个都是分布式数据集。但有一点不同,Rdd可以存放用户自定义的数据对象,DataFrame只能存放Row类型的数据和一些Schema信息,而DataSet既可以存放用户自定义的数据类型,又可以存放一些该数据类型的Schema信息。可以说,DataSet结合了Rdd和DataFrame的优点。Rdd提供了强大的算子操作,但是对于一些结构化数据类型的信息查询并不方便,比如如果我们要查

2017-05-16 21:33:03 760

原创 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 2971

原创 hadoop MapReduce模型的shuffle过程

shuffle是MapReduce编程模型的核心。它主要指从maptask输出key/value到reducetask接受输入这段过程。这段过程也被称为“神奇发生的地方”,是mapreduce能顺利进行的保障。它的官方描述图如下:先来分析map端的操作:在这图种,map端的input来自本机存储的block种的数据。每执行一次map函数式,会传入偏移量和一行block中的数据,经过

2017-04-28 11:24:57 890

原创 jvm堆内存分代

jvm堆内存中,大概可分为新生代,老年代,永久代(以前可以看作是方法区),由于现在的jvm已经去永久代了,所以实质上只有前两种1.新生代 : 新生代又分为eden区域和两个survivor区域。默认大小比例为8:1. 大部分新生成的对象都直接分配在eden中,如果在新生代中执行一次gc,eden中    未被回收的对象就会进入survivor区域中,同时对象的年龄+1,经过多次gc后,如果

2017-04-15 15:40:22 604

原创 jvm的GC机制和四大引用类别

首先讲讲gc机制。很多人在面试中被问到jvm的gc机制,都会自然而然地回答为引用计数法。在我们一些常见的虚拟机中,比如python的虚拟机,的确是采用引用计数法来标记垃圾对象的,但在主流的jvm中,采用的是另一机制,可达性分析。可达性分析将所有对象及其引用关系看作一个图结构,从某个节点(GCroot节点)到某个节点是联通的,我们就说这个对象是活的,反之,就是需要被回收的对象。根据深入理解jvm

2017-04-14 20:46:16 1098

原创 jvm内存模型浅析

首先要说明的是,jvm的结构相当复杂且不同的jvm还有不同的实现,我这里仅仅是根据相关书籍做个简单的分析。要了解java中对象和变量(静态变量,实例变量,局部变量)究竟在哪里进行创建以及内存分配,就必须先大概了解一下jvm的内存模型。如图:程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。由于每个线程执行

2017-03-03 16:20:56 373

原创 桥接模式(合成/聚合+单一职责的体现)

假设现在有这么一个请求:创建多个不同的窗口系统,如临时会话窗口(transientWindow)和图标窗口(iconWindow)以及其他各种类型窗口,同时这些窗口的要在linux和unix以及window上都能创建。这是一个典型的多种变化结合在一起的例子。很多人一开始会使用继承来解决这个问题,如下:public

2017-02-28 08:24:58 518

原创 饿汉式和懒汉式(单例模式详解)

单例的目的是保证某个类仅有一个实例。当有某些类创建对象内存开销较大时可以考虑使用该模式。单例模式又分为饿汉式和懒汉式。下面分别说明:1.饿汉式。顾名思义,该模式在类被加载时就会实例化一个对象。具体代码如下:public class Person {//饿汉式单例private static Person person = new Person();private Person(

2017-02-25 14:37:14 8512

原创 迭代器模式

迭代器模式几乎在所有面向对象语言中都大量存在,且被很多语言支持,如java,c#等已经内部支持(也就是foreach)。迭代器模式可以为不同的集合对象提供统一的遍历接口,而不用关心集合的内部结构。遍历集合对象时,优先使用迭代器模式,能让代码更具可移植性和重用性。下面时具体代码(代码只是粗糙实现)://声明一个集合接口public interface Collection {publi

2017-02-24 15:04:17 385

TCP-IP详解

非扫描版,详细解说tcp-ip协议

2017-05-22

spark Mllib机器学习实践

详细解说spark中Mllib库的实用

2017-05-14

hadoop技术内幕

非扫描版,完整介绍hadoop生态圈中yarn的工作原理,以及和spark,storm的整合

2017-05-14

spark快速大数据分析

高清非扫描版,十分实用

2017-05-14

LL(1)文法分析过程模拟

完整版LL(1)分析过程模拟课程设计报告

2017-05-07

重构,改善既有代码设计

chm格式方便查看

2017-04-15

深入理解jvm虚拟机(非扫描版)

该资源是纯电子版,非扫描版,学习使用非常方便

2017-04-15

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

TA关注的人

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