Java原生网络编程 编程中的Socket是什么?Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,其实就是一个门面模式。TCP用主机的 IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)。短连接建立连接,发送报文,拆除连接 (http1.0)(web服务器要服务大量客户,维护太多连接很累,慢慢转移长连接)长连接传送完并不拆除,多用于点对点操作频繁...
网络协议 计算机网络是什么?利用通信线路将地理上分散的、具有独立功 能的计算机系统和通信设备按不同的形式连 接起来,以功能完善的网络软件及协议实现 资源共享和信息传递的系统。主要网络有哪些?1、局域网 2、城域网 3、广域网 (覆盖范围) …分类计算机网络发展概史1、诞生阶段,单个计算机为中心的远程联机系统2、ARPANET,多个主机通过通信线路互联起来3、开放性的标准化体系结构,OSI(Open System Interconnection Reference Model )开放式系统互联通信参考模
进程间通信机制Binder binder 是什么?进程间通信机制也是一个驱动Binder.java --> 实现 Ibinder — 跨进程的能力什么时候用到多进程?自己创建的进程:webVIew 视频播放、音乐、大图浏览、推送系统服务:打电话,闹钟等等多进程优点在哪里?内存 : 一个app ,6G,8G,16G (使用更多)风险隔离 : 每一个进程,单独的一个appLinux进程间通信机制有哪些?管道、信号量、socket 、共享内存等等Android为什么要增加Binder?Bind
Handler 数据通信会带来什么开发中的问题?线程间如何通讯Handler通信实现的方案实际上是内存共享的方案为什么线程间不会干扰加了锁内存管理设计思路优秀为什么 wait/notify用武之地不大因为handler已经将需要这部分功能进行了Linux层的封装源于生活高于生活handler: 地下 - 地上《 消息管理机制:消息-》事物java main()jvm(一个应用挂掉不影响其他的应用)功能机:FATAL error,所有的代码,都是handlerlancher (app):zygote
Android虚拟机与ClassLoader类加载 JVM与DalvikAndroid应用程序运行在Dalvik/ART虚拟机,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。Dalvik虚拟机实则也算是一个Java虚拟机,只不过它执行的不是class文件,而是dex文件。Dalvik虚拟机与Java虚拟机共享有差不多的特性,差别在于两者执行的指令集是不一样的,前者的指令集是基本寄存器的,而后者的指令集是基于堆栈的。基于栈的虚拟机对于基于栈的虚拟机来说,每一个运行时的线程,都有一个独立的栈。栈中记录了方法调用的历史,每有一次方法调用,栈中
垃圾回收机制 分代收集理论1.绝大部分的对象都是朝生夕死 —新生代2.对象熬过多次垃圾回收,越难回收 —老年代应该这两类对象分开cms 才会单独收集老年代其他很多时候收集老年代是Full GC(新生代、老年代、方法区)复制算法(Copying)特点:实现简单、运行高效内存复制、没有内存碎片利用率只有一半Eden区的来源:Appel式回收提高空间利用率和空间分配担保...
对象与垃圾回收机制 一般的对象狭义的对象类加载:把class加载到内存中去检查 有没有加载进来 等等检查遇到new 第一步是检查 能不能在 常量池方法区的常量池定位到类的符号引用检查加载成功后 分配内存分配内存有两种方式,两种方式划分内存:指针碰撞、空闲链表指针指向最后一个空间,只能在堆空间很规整的办事(指针碰撞) ,垃圾回收后就不规整了零散的不规整的怎么办空闲的和占用的交替的话用不了指针碰撞 所以用空闲链表。堆空间的规整程度决定的用两种方式中的哪个垃圾回收器带有整理(压缩)功能带整理功能的就会使得内存
JVM内存管理剖析 一.JVM与操作系统的关系1.Java Virtual MachineJVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。2.翻译Java 程序不一样,使用 javac 编译成 .class 文件之后,还需要使用 Java 命令去主动执行它,操作系统并不认识这些 .class 文件。所以JVM就是一个翻译。从图中可以看到,有了 JVM 这个抽象层之后,
RxJava原理与自定义操作符-----自定义RxView操作符 自定义操作符写一个防抖操作符public class RxView { private final static String TAG = RxView.class.getSimpleName(); // 我们自己的操作符 == 函数 public static Observable<Object> clicks(View view) { return new ViewClickObservable(view); } }pub
RxJava原理与自定义操作符-----线程切换原理 subscribeOn 给上面代码分配线程 .subscribeOn( Schedulers.io() // 耗时读取的异步 )先分析Schedulers.io(): @NonNull public static Scheduler io() { return RxJavaPlugins.onIoScheduler(IO); }
RxJava模式与原理-----map变换操作符原理 map示意图: // ObseravbleCreate 自定义source传递进去了 == source Observable.create( // 自定义source new ObservableOnSubscribe<String>() { @Override public void subscribe(Obse
RxJava模式与原理-----标准观察者与RxJava观察者 模式标准的观察者设计模式一个被观察者,多个观察者绿色区域是被观察者红色区域是观察者被观察者的抽象(抽象类或者接口)…蓝色区域 把观察者丢给被观察者被观察者会有容器,把被观察者丢到容器里面I/System.out: 更新了消息:消息:以后Android程序员必须要学习Kotlin A 收到了推送消息:消息:以后Android程序员必须要学习Kotlin B 收到了推送消息:消息:以后Android程序员必须要学习Kotlin C 收到了推送消息:消息:以后And
RxJava之doOnNext运用 完成需求异步线程------UI线程--------异步线程-------UI线程 频繁切换// 请求接口 APIpublic interface IRequestNetwor { // 请求注册 功能 todo 耗时操作 ---> OkHttp public io.reactivex.Observable<RegisterResponse> registerAction(@Body RegisterRequest registerRequest);
RxJava配合Retrofit,RxJava之防抖与网络嵌套 RxJava配合Retrofit:Retrofit请求服务器(通过okhttp)拿到响应码给RxJava,RxJava处理回来的数据,Retrofit是典型的封装框架Retrofit是一个封装框架,Retrofit不是网络请求框架防抖自动化脚本一秒点button百次只响应一次(不抖动)RxBinding 防抖...
synchronized的实现原理 synchronized在底层是如何实现加锁的呢?使用monitorenter和monitorexit指令实现的 //count进行累加 public void incCount(){ synchronized (this){ count = count + 1;//count++; } }synchronized关键字包围的同步块,查看.class public void incCount(); descriptor
JMM(JAVA Memory Model) Java内存模型 和 volatile JMM基础-计算机原理计算 a+bCPU读取一次内存 100ns,读取a,b花费200nsCPU计算只用0.6ns执行a+b绝大部分的时间是在等待读取内存所以引入了高速缓存(一级、二级、三级)多核CPU共享L3L1速度最快 容量最小为了提高运行速度 引入了cache为了充分利用cache就提出了JMMJava内存模型(JMM)工作内存,主内存,两个抽象概念工作内存:包括cpu内部的寄存器,高速缓存,还包括主内存(RAM)的一部分,很小一部分在主内存主内存:也有小部分可能在寄存
AQS(AbstractQueuedSynchronizer)抽象队列同步器 AQS(AbstractQueuedSynchronizer)抽象队列同步器AQS是并发编程包里面的一个抽象类实现的子类有哪些,基于AQS实现了,线程池里面用到了,显示锁用到了,读写锁用到了,信号量用到了…JDK并发里面的同步组件的一个基础的构件,用来构建同步组件...
线程池原理 1.使用线程池的好处(为什么使用线程池)1.减少资源消耗Thread线程,是操作系统的资源,创建和销毁是要有资源消耗的,如果有线程池事先准备好一批线程,创建线程和销毁线程的资源就没有了2.使用线程池缩短任务的执行时间。有一个新的任务就new 一个线程,那么时间消耗为:New Thread() T1:线程的创建时间,T2:任务的执行时间 ,T3:线程的销毁时间准备好一堆的线程准备好 就不需要T1 T33.线程是稀缺而昂贵的资源,因为线程创建出来消耗CPU,消耗内存(一定消耗内存),线程执行太多,
阻塞队列 阻塞队列有两种阻塞队列是空的,拿的时候拿不到,阻塞了队列是满的,放的时候放不进,阻塞了阻塞队列在JDK里面有一个专门的接口BlockingQueue并不是所有的方法都是阻塞的方法插入元素和拿取元素成对出现的两种操作非阻塞类的方法add()插入元素,往满的队列插入时元素时插不进会抛出异常remove()拿取元素,从空的队列拿元素时拿不出来会抛出异常非阻塞类的方法offer()插入元素,往满的队列插入时元素时插不进会返回falsepoll()拿取元素,从空的队列拿元素时拿不出来会返回nu