网络代理
什么是代理,网络代理,代理服务器代理(proxy)很容易理解就是代表处理,在生活中,有些事情就不是本人去完成,找一个人代你去完成,它是你代理人。把你的权利交给你的代理人,一般在这种在法律上比较常见,但是在计算机的世界里还好,经常会出现这种代理的现象,比如就有个设计模式叫代理模式。
在网络上发出请求是客户端,接收请求的是服务器端。请求从客户端到服务器端会通过好多网络。然后到达服务器端,这个时候一般中间会有好多服务器帮你 转发请求,不是客户端直接去链接服务器端,他们就是代理服务器。而网络代理就是帮你转发的请求的过程,那些帮你转发的服务器就是代理服务器。它的工作主要在开放系统互联(OSI)模型的对话层。我上面所描述的代理也就是正向代理。
正向代理正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。
举个栗子:
我是一个用户,我访问不了某网站(facebook)由于GFW(Great Fir ...
浅谈Java垃圾回收与JVM
简介Java与JVM
为什么要有JVM。在程序里,没有一件事情是抽象出来一层解决不了的,如果有那就抽象出两层。
大家都知道,Java是一门跨平台的语言,有那么一个非常经典梗—一次编写,处处异常(一次编写,处处运行)。java是通过JVM实现在不同平台上运行的,无论你是Windows,Linux还是其他什么系统,只要你能装上对应的支持JVM,就可以把代码拿过来直接使用。不需要做任何修改(当你没有自定义或者调用一些特有的Native方法就可以)就可以直接运行。这就归功于JVM的设计,也就是Machine和Code之间抽象Virtual Machine(有所问题都可以通过抽象一个层次来解决);java不用与系统底层直接打交道,而是通过JVM进行内存的分配与回收,多线程的处理等等。
我们都知道高级语言一般分两种,一种是编译型语言,一种是解释型语言。编译型语言就是常用的C、C++,Basic等他们都是编译语言,使用的时候都是先编译成目标文件(也就是.o和.obj文件),然后再去链接相应的类库,的工具库,然后才能运行,(做了一大桌子菜,都做好了,才能开始吃饭;菜就是代码,人就是CPU;也就是 ...
胡扯
最近总是看一些网上的文章,发现现在自媒体或者新媒体包括公众号,发现能写出来有质量的东西越来越少,不知道从何时起我看的文章,发现都是千篇一律的套路,一般就是前面的文章的题目很醒人,都是标题党。进入到文章内部发现都是比较干枯,没有什么可以注意的点,好多东西都是平白的描述。没有任何营养,感觉读完之后没有让人产生思考,完全是快餐式的那种阅读,很快的知道内容,但是并没有告诉你内容背后的含义,你写这篇文章要表明什么意思。另外一种就完全相反就是表达意思很明确上来就是很洗脑的东西。一味的去描述好多不现实的东西,让人感觉不真实。
读书,读一篇文章,读一个帖子。感觉最重要的是一种交流是读者与作者的一种交流,作者首先要把自己想表达的东西描述的清晰客观,而不是一味的去吹捧或者贬低某些东西,而且让人感觉不真实。同时就是作者要把自己的思想或者情感放进去,不能说每个人理解的都一样,但是至少看了以后不能让我感觉和没看一样。(确实有人会说,看文章一定要学到东西吗,那看文章是不是太功利了)但是我想说的是至少作者要和读者有些许共鸣,让读者能感受到作者是在创作,而不是把很多东西拼凑在一起,让人看着迷茫,不 ...
浅析Java ArrayList源码
什么是ArrayListArray是数组,List是线性表两个合起来就是一个数组化的线性表。也就是ArrayList是一个数组实现的列表。所以它有List的很多方法,可以实现List的功能,区别与数组ArrayList是可以自动扩容的。ArrayList的默认大小是10。(这个我也很好奇,为什么不是2的n次方的这种形式,后面有一个解释),每次扩容的时候是1.5倍,也不是两倍。同样ArrayList也是线程不安全的,也是用fast-fail机制。如果使用线程安全的类使用Vector,它使用了锁的同步机制实现了线程安全。但是效率比较低。
ArrayList的继承关系图
ArrayList是如何实现的先看一波ArrayList的定义的变量,从定义的变量中我们能看到,ArrayList的底层是基于一个数组实现的,它的默认大小是10,同时她存放数据的对象是不支持序列化的。
常用的参数变量123456789101112131415161718192021 //ArrayList实现了序列化的Serializable接口,这个是用于序列化的版本号。 private static fin ...
浅析Java HashMap源码
回顾
之前写过一篇关于HashMap的文章,里面介绍了关于HashMap的基本概念,和简单的数据结构,但是并没有对HashMap的源码进行系统的分析。
HashMap主要结构是一个数组,数组的下标是hash值取余之后数,存储key和value的信息。允许key和value是null。HashMap的数组的使用率小于0.75(默认的0.75,也可以设置)。一般默认情况下数组的大小是16,随着数据的添加当HashMap的容量达到threshold(16*0.75=12)时候会扩容(resize),扩容是将原来的数组扩大两倍(HashMap的数组大小一定是2的n次方)。同时HashMap也不是线程安全的,在并发情况下resize可能会出现死锁。
HashMap除了数组之外还有一个是链表,链表是解决解决HashMap的中hashcode取模以后的碰撞问题,正常的hashcode的范围很大,碰撞的几率很小但数组没有那么大的空间,对内存占用太大;要在为hashcode取模,由于取余会导致hashcode碰撞,为避免之前数组的数据被覆盖。HashMap在数组后面添加了列表,来解决这个问题。在JD ...
浅析Java线程池源码
什么是线程池线程池顾名思义,就是有很多线程的一个池子,这里面有多少线程,是要根据你要业务需求来确定;它方便你线程的创建和使用,不需要频繁的创建线程资源使得,线程资源充分的得到利用。所以和数据库链接池类似,线程池的作用就是充分利用资源,提高相应速度,增加系统的吞吐率同时方便管理和监控线程池中线程使用情况,实现对程序的优化。当添加的到线程池中的任务超过它的容量时,会有一部分任务阻塞等待。当等待任务超过阻塞队列大小,线程池会通过相应的调度策略和拒绝策略,对添加到线程池中的线程进行管理。
线程池解决什么问题多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。
假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。
如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。
一个线程池包括以下四个基本组成部分:
1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;
2、工作线程(PoolWorker):线程 ...
树与数据结构
什么是数据结构在计算机科学中,数据结构(英语:data structure)是计算机中存储、组织数据的方式。数据结构可透过程序语言所提供的数据类型、引用及其他操作加以实现。一个设计良好的数据结构,应该在尽可能使用较少的时间与空间资源的前提下,支持各种程序运行。正确的数据结构选择可以提高算法的效率;不同种类的数据结构适合不同种类的应用。常用的数据结构有数组(Array),链表(Linked),队列(Queue),堆(Heap),栈(Stack),树(Tree),图(Graph),散列表(Hash)。
什么是树树(Tree)是一种抽象数据类型(ADT)或是这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树;子树与子节点区别,子节点,指的是一个树上的一个节点,而子树指的是这个节点和包括属于这个节点的所有子节点,只有是叶子 ...