线程

http协议版本和MPM工作模式

允我心安 提交于 2020-03-07 17:23:04
协议版本 http/0.9 1991,原型版本,功能简陋,只有一个命令GET。GET /index.html ,服务器只能回应HTML格式字符串,不能回应别的格式 http/1.0 1996年5月,支持cache, MIME, method 每个TCP连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接 引入了POST命令和HEAD命令 头信息是 ASCII 码,后面数据可为任何格式。服务器回应时会告诉客户端,数据是什么格式,即Content-Type字段的作用。这些数据类型总称为MIME 多用途互联网邮件扩展,每个值包括一级类型和二级类型,预定义的类型,也可自定义类型, 常见Content-Type值:text/xml image/jpeg audio/mp3 http/1.1 1997年1月,引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。对于同一个域名,大多数浏览器允许同时建立6个持久连接引入了管道机制,即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率 新增方法:PUT、PATCH、OPTIONS、DELETE 同一个TCP连接里,所有的数据通信是按次序进行的。服务器只能顺序处理回应

《面试必问之jvm与性能优化》(二)

烂漫一生 提交于 2020-03-07 17:16:12
1. 说说各个区域的作用? 1、运行时数据区域 运行时数据区域包括方法区、虚拟机栈、本地方法栈、堆、程序计数器。其中方法区和堆是所有线程共享的数据区,其他的是线程隔离的数据区。 1.1、程序计数器 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器,确定下一条需要执行的字节码指令。java的多线程是通 过线程轮流切换并分配处理器执行时间的方式来实现的,在任何确定的一个时刻,一个处理器只会执行一条线程中的指令。为了线程切换之后能恢复到正确的执行位 置,每个线程都需要有一个独立的程序计数器,各个线程之间的计数器互不影响。如果线程正在执行的是一个java方法,则计数器记录的是正在执行的虚拟机字 节码指令的地址,如果正在执行的是native方法,则计数器值为空。 1.2、java虚拟机栈 java虚拟机栈也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是java方法执行的内存模型:每个方法被执行的时候都会创建一个栈帧用 于存在局部变量表、操作栈、动态链接、方法出口等信息。通过所说的栈是局部变量表,即与对象内存分配关系最密切的内存区域。局部变量表的内存空间在编译期 间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是确定的,在运行期不会改变。 java虚拟机栈有两种异常:如果线程请求的栈深度大于虚拟机所允许的深度

Java语言程序设计-第10版notes

半城伤御伤魂 提交于 2020-03-07 16:59:59
第1章 计算机、程序和Java概述 部分章节小结 1、编程错误可以分为三类:语法错误、运行时错误和逻辑错误。编译器报告的错误称为语法错误或者编译错误;运行时错误指引起程序非正常结束的错误;而当一个程序没有按照预期的方式执行时,产生逻辑错误 。 第2章 基本程序设计 部分章节小结 1、拓宽类型不需要显式转换,缩窄类型必须显式完成。 123456 int i=9;double d=i;//缩窄类型转换double d=9.0;int i=(int)d; 2、计算机科学中,1970年1月1日午夜零点为UNIX时间戳。 第3章 选择 部分章节小结 1、除开赋值操作符的所有二元操作符都是左结合的,赋值操作符是右结合的。(此处的结合指的是结合律) 123456 //以下两个表达等价a-b+c-d((a-b)+c)-d//以下两个表达等价a=b+=c=5a=(b+=(c=5)) 第4章 数学函数、字符和字符串 部分章节小结 1、字符 ‘ ‘ 、t、 f、 r 和 n 都称为空白字符。 2、字符可以基于它们的Unicode码使用关系操作符进行比较。 第6章 方法 部分章节小结 1、程序模块化和可重用性是软件工程的中心目标之一。 2、方法可以重载,这意味着两个方法可以拥有相同的方法名,只要它们的参数列表不同即可。 3、方法抽象是把方法的应用和实现分离,用户可以在不知道方法是如何实现的情况下使用方法

iOS面试题--Runloop篇

左心房为你撑大大i 提交于 2020-03-07 16:11:16
1.Runloop 和线程的关系? 一个线程对应一个 Runloop。 主线程的默认就有了 Runloop。 子线程的 Runloop 以懒加载的形式创建。 Runloop 存储在一个全局的可变字典里,线程是 key ,Runloop 是 value。 2.RunLoop的运行模式 RunLoop的运行模式共有5种,RunLoop只会运行在一个模式下,要切换模式,就要暂停当前模式,重写启动一个运行模式 - kCFRunLoopDefaultMode, App的默认运行模式,通常主线程是在这个运行模式下运行 - UITrackingRunLoopMode, 跟踪用户交互事件(用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他Mode影响) - kCFRunLoopCommonModes, 伪模式,不是一种真正的运行模式 - UIInitializationRunLoopMode:在刚启动App时第进入的第一个Mode,启动完成后就不再使用 - GSEventReceiveRunLoopMode:接受系统内部事件,通常用不到 3.runloop内部逻辑? 实际上 RunLoop 就是这样一个函数,其内部是一个 do-while 循环。当你调用 CFRunLoopRun() 时,线程就会一直停留在这个循环里;直到超时或被手动停止,该函数才会返回。 内部逻辑: 通知

JVM深入解析

有些话、适合烂在心里 提交于 2020-03-07 14:37:23
Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图: 1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。 2、虚拟机栈:虚拟机栈是Java执行方法的内存模型。每个方法被执行的时候,都会创建一个栈帧,把栈帧压人栈,当方法正常返回或者抛出未捕获的异常时,栈帧就会出栈。 (1)栈帧:栈帧存储方法的相关信息,包含局部变量数表、返回值、操作数栈、动态链接 a、局部变量表:包含了方法执行过程中的所有变量。局部变量数组所需要的空间在编译期间完成分配,在方法运行期间不会改变局部变量数组的大小。 b、返回值:如果有返回值的话,压入调用者栈帧中的操作数栈中,并且把PC的值指向 方法调用指令 后面的一条指令地址。 c、操作数栈:操作变量的内存模型。操作数栈的最大深度在编译的时候已经确定(写入方法区code属性的max_stacks项中)。操作数栈的的元素可以是任意Java类型,包括long和double,32位数据占用栈空间为1,64位数据占用2。方法刚开始执行的时候,栈是空的,当方法执行过程中,各种字节码指令往栈中存取数据。 d、动态链接

Java String StringBuilder StringBuffer 区别

守給你的承諾、 提交于 2020-03-07 14:00:39
1. 三者区别 速度 StringBuilder > StringBuffer > String StringBuilder 线程是不安全的,StringBuffer、String 线程是安全的 1.1 为什么存在速度快慢 String 为字符串常量,一旦创建控件不可能变更。 而 StringBuilder 和 StringBuffer 均为字符串变量,而不进行创建和回收的操作,所以速度要比String快很多。 1.2 为什么说 StringBuffer 线程是安全的 如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法都带有synchronized关键字,所以可以保证线程是安全的, 1.3 为什么说 StringBuilder 线程是不安全的 但 StringBuilder 的append方法中没有synchronized关键字,所以不能保证线程安全。 实际上,StringBuilder 是 StringBuffer 的简化版,在单线程操作中效率更高。 2. 使用说明 2.1 示例 2.1.1 String 示例 字符串自定义 String str = "字符串" ; 2.1.2 StringBuffer 示例 StringBuffer 的创建 /*StringBuffer 的内部实现采用字符数组,默认数组的长度为16

JVM垃圾回收机制

久未见 提交于 2020-03-07 13:55:32
问题引入:     谈谈JVM垃圾回收机制 怎样判断一个对象是否是垃圾? 判断是否是垃圾有两种方式,(1)引用计数法,无法解决循环引用问题,Java不使用,Python使用              (2)可达性分析,以GC Root为根进行可达性遍历,无法被遍历到的判定为垃圾 ps :什么是GC Root根 ?虚拟机栈中的局部变量表,方法区中的静态变量引用的对象,方法区中常量引用的对象,本地方法栈中引用的对象(native) 典型垃圾回收算法 :(1)标记清除算法 :先标记垃圾,再清除。会产生内存碎片,效率也不太高           (2)复制算法:不会产生内存碎片,但将内存缩小到原来的一半,占用空间。性能取决于存活对象的多少,如果存活对象很多,很费时           (3)标记整理算法:先标记,再清除,再整理内存。比较耗时。           (4)分代收集算法:当前商业虚拟机的垃圾收集都采用“分代收集”算法,根据对象存活周期的不同将内存分为几块。一般是把java对分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中每次垃圾收集时都有大量对象死去,只有少量对象存活,所以就采用复制算法,只需要付出少了存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对他进行分配担保,就要使用“标记-清除”或“标记-整理”算法

JVM垃圾回收

时间秒杀一切 提交于 2020-03-07 11:16:17
一.简介 最近又复习下jvm相关内容,理解下思想,吸收下前辈经验,本文jdk 1.7/1.8 二.引用计数法与可达性分析 垃圾回收,便是将已经分配出去的的,但却不再使用的内存回收回来,以便能够再次分配。在Java虚拟机的语境下,垃圾指的是死亡对象所占据的堆空间。这里便涉及了一个关键问题:如何辨别一个对象死亡。 2.1 引用计数法 给个对象添加引用计数器,每当有一个地方引用它,计数器值就加1;当引用失效时,计数器值就减一;任何时刻计数器为0的对象就是不再被使用。 引用计数法有个重大的漏洞,无法处理循环引用的对象。 public class ReferenceCountingGC { public Object instance = null; private static final int _1MB = 1024*1024; //占内存 private byte[] bigSize = new byte[2 *_1MB]; public static void testGC(){ ReferenceCountingGC objA = new ReferenceCountingGC(); ReferenceCountingGC objB = new ReferenceCountingGC(); objA.instance = objB; objB.instance = objA;

线程生命周期

妖精的绣舞 提交于 2020-03-07 11:00:22
当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。 在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞 (Blocked)和死亡(Dead)5 种状态。尤其是当线程启动以后,它不可能一直"霸占"着 CPU 独自 运行,所以 CPU 需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换 1.新建状态(NEW ) 当程序使用 new 关键字创建了一个线程之后,该线程就处于新建状态,此时仅由 JVM 为其分配 内存,并初始化其成员变量的值 2. 就绪状态(RUNNABLE ): 当线程对象调用了 start()方法之后,该线程处于就绪状态。Java 虚拟机会为其创建方法调用栈和 程序计数器,等待调度运行。 3. 运行状 态(RUNNING ): 如果处于就绪状态的线程获得了 CPU,开始执行 run()方法的线程执行体,则该线程处于运行状 态。 4. 阻塞状态(BLOCKED ): 阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice,暂时停止运行。 直到线程进入可运行(runnable)状态,才有机会再次获得 cpu timeslice 转到运行(running)状 态。阻塞的情况分三种: 等待阻塞 ( o.wait-> 等待对列 ) : 运行(running

java虚拟机

為{幸葍}努か 提交于 2020-03-07 10:54:21
1.java虚拟机的生命周期 当启动一个java程序时,一个虚拟机实例也就生成了,当该程序关闭退出,这个虚拟机实例也就随之消亡。 java虚拟机内部有两种线程 ,守护线程和非守护线程,守护线程是执行垃圾收集的线程,而java程序中的初始线程-就是开始于main()方法的那个,是非守护线程。当该程序中的所有非守护线程都终止时,虚拟机实例将自动退出。 2.java虚拟机的体系结构 类装载子系统,执行引擎,运行时数据区 (方法区,堆,java栈,pc寄存器,本地方法栈)。每个java虚拟机实例都有一个方法区以及一个堆,它是所有线程共享的。当虚拟机装载一个class文件时,它会从这个class文件包含的二进制数据中解析类型信息,然后把类型信息放到方法区中,堆里面放的是对象。 当一个新线程被创建时,它将得到它自己的pc寄存器(程序计数器)以及一个java栈,pc寄存器的值总是指示下一条将被执行的指令,而它的java栈则总是存储该线程中java方法的调用状态(包括局部变量,被调用时传进来的参数,它的返回值,以及运算的中间结果)。 3.类装载器子系统 java虚拟机有两种类装载器 :启动类装载器和用户自定义类装载器, 4.方法区   类的类型信息,类型的常量池,字段信息,方法信息,除了常量以外的所有类变量,一个到类classLoader的引用,一个到class类的引用    a。常量池