文章目录
前端三剑客:
1.HTML
2.CSS
3.JS
JQuery
1.根据id获取元素:jQuery (“#id”)
2.赋值:jQuery (“#id”).val(“值);
3.设置属性:jQuery(“#id”).attr(“str”,"");
4.去空:trim();
5.Ajax请求:Jquery.getJSON(”后端API地址“, {参数},function(data){…})
Tomcat:发布应用程序
8.5.X->servlet3.1
9.X
bin:启动和停止
logs:查看日志----->tail -f
webapps:war/jar存放在根路径
conf:配置文件目录 servlet.xml可以修改tomcat端口号
查询Java程序列表:ps -ef|
HTTP
HTTP状态码(重要)
请求端:request
1.首行(方法类型 URL 版本号)
2.header
3.空行:标识着header的结束
4.body:当是get请求时body是空
响应端:response
1.首行(版本号 状态码 状态码描述信息)
2.header
3.空行:标识着header的结束
4.body
Maven:构建和打包Java项目的工具
作用:
可以管理所有的外部引用
可以打包项目
可以把项目发布到中央仓库
谷歌---->安卓默认Gradle(新型的打包工具)
Maven和Gradle的不同?
1.Gradle实现是依赖脚本的,而Maven依赖pom.xml
2.Gradle比Maven的更加简洁
3.Gradle性能比Maven高(Gradle使用的是增量式的构建方式)
4.Gradle灵活性更高
Servlet
Servlet路由创建:
1.web.xml—>一组路由
2.@WebServlet (“url”)
Servlet生命周期
1.调用init方法(执行1次)
2.执行service
3.执行销毁destory方法(执行1次)
getSessoin()尝试获取session,获取不到不会创建session【权限效验】
getSessoin(true)尝试获取session,获取不到则创建一个session【登录场景】
session和cookie不同?
1.cookie保存在客户端,session保存在服务器端
2.默认情况下session的实现是依赖sessionId,而sessionId是存储在cookie,如果禁止使用cookie那么整个session机制也不能使用。
3.cookie有大小限制,为了防止网络传输中的负担,一般最大值未4K
4.cookie在本地容易被串改,而session在服务端
网络
OSI
应用层:将标准的数据转化成程序需要的格式
表示层:将设备数据格式转化成标准的格式
会话层:用来管理通讯双方之间的会话
传输层:保证通讯双方的数据能够正常传输
网络层:地址的管理和路由选择
数据链路层:保证相邻结点间的数据传递
物理层:将数字信号转换成光电信号
TCP/IP
应用层 :HTTP(80),FTP(21),SSH(22),TELNET(23),DNS(53)
传输层(TCP/UDP)
网络层
数据链路层
数据传输的5要素
1.源地址IP
2.源地址端口号
3.目的地IP
4.目的地端口号
5.协议类型
IP:32位
MAC:48位 JF-XX
UDP
1.无连接
2.不可靠
3.面向数据报
无发送缓冲区,有接收缓冲区
UDP经典使用场景:DNS,NFS
TCP
16位窗口大小指的是接口缓冲区的大小
*TCP十大特性
1.确认应答(保障稳定性最关键的措施)
2.超时重传
策略:a)动态发送重传频率,每次重发的时间间隔是上一次的一倍
b)当重试一定次数之后就会停止重传
连接管理
3次握手:为了验证客户端和服务端的收发能力
4次挥手
服务端什么情况会有大量的TIME_WAIT?
服务器端没有正常的进行关闭
4.滑动窗口
快重传。
5.流量控制
接收缓冲区
当接收缓冲区大小为0时,停止消息发送,启动一个检测包来定时检测接收缓冲区剩余空间大小。
6.拥塞控制:慢启动
7.延迟应答(提升性能)
策略:
a)每隔一定次数延迟应答一次
b)每隔一定时间延迟一次
注意事项:延迟应答(200ms)的时间不能超过超时重传的时间(500ms)
8.捎带应答
能够实现3次挥手的机制
9.面向数据流
沾包/半包
解决方案:
1.使用固定大小的传输包(造成不必要的网络开销)
2.使用结束符来明确消息边界
10.TCP异常处理
没有缓冲时间的异常:断电,断网【TCP健康检测机制】
有缓冲时间的异常:关机(和正常关闭相同)
网络层
内网网段:
10.,前八位是网络号,共16777216个地址
172.16到173.31,前12位是网络号,共1048576个地址
192.168..前16位是网络号,共65.,536个地址包含在这个范围中的,都成为私有IP,
其余的则称为全局IP(或公网IP);
MTU:最大网络传输大小
MTU:1500-8-10=1472(UDP)
当输入一个url之后会发生什么?
1.效验url的正确性
2.检测本地的缓存
3.访问DNS服务器
4.建立TCP连接,三次握手的过程
5.浏览器会将参数和请求信息发送给服务器端
6.服务器得到请求的参数信息再进行业务处理
7.服务器将结果返回给客户端
8.浏览器拿到响应的信息之后,通过浏览器的执行引擎,解析结果并且展示用户
9TCP4次挥手
并发和并行
并行:多个任务在多个CPU下,同时执行就叫并行
并发:多个任务采用时间轮询的方式进行
进程和线程不同?
1.进程是系统分配资源的最小单位,线程是系统调度的最小单位
2.一个进程中至少要包含一个线程,线程是附议进程存在的,而进程的实际执行单位是线程
3.进程之间不能共享资源,而线程之间可以共享资源
现场的3种创建方式
a)继续Thread类,实现入run方法
b)实现Runnable重写run方法
c)实现Callable重写call方法
现场的构造函数:
1.定义线程的名称
2.定义线程的分组
3.定义线程的任务
线程的常用属性
1.定义优先级(默认5)1-10
2.设置线程名称
3.定义线程类型(守护线程,用户线程)
线程的常用方法
1.start /run
2.sleep–>TIMED_WAITING
3.join
4.线程通讯wait/notify/notifyAll
注意事项:
a)wait要配合synchronized使用
b)wait和synchronized必须要保证是一个对象
LookSupport park /unpark
线程终止:
a)使用全局变量
b)使用interrupted()终止线程
c)stop【已过时】
实例方法:isInterrupted()—不会重置interrupted的结果
静态方法:Interrupted()----重置interrupted的结果
线程安全问题:
1.CPU抢占式执行
2.非原子性
3.多个线程同时修改同一个变量
4.指令重排序
5.内存可见性
线程安全解决方案:
1.加锁synchronized/Lock-------->volatile:解决内存可见性问题,禁止指令重排序
2.ThreadLocal
synchronized和Lock的区别?
1.synchronized JVM提供的锁的解决方案。
2.synchronized和Lock修饰的范围不同,Lock只能修饰代码块
3.synchronized无需手动加锁和释放锁,而Lock需要
4.synchronized是非公平锁,而Lock既可以是公平锁也可以是非公平锁
synchronized实现原理?
Java层面来说,他就是将所信息存放在对象头种,当使用synchronized修饰代码的时候会在编译之后在代码的前面和后面加上监视器锁,在操作系统层面,他是使用互斥锁实现的。
synchronized执行流程?/synchronized锁优化
无锁----->偏向锁----->轻量级锁----->重量级锁 (JDK1.6)
Lock()一定要放在try之前
在finally中必须执行释放锁的操作
死锁
1.互斥条件
2.请求拥有条件
3.不可剥夺条件
4.环路等待条件
思索解决方案:
按序请求锁来破坏环路等待条件
死锁怎么排除有什么工具?
jconsole/vm/jmc
线程池
1.线程数量和任务数量可控。
2.线程池可以友好的拒绝任务
3.复用线程
4.线程池拥有更多功能,比如执行定时任务
线程池的7种创建方式:
1.第一种:创建固定个数的线程池(任务数取向无限大,建议谨慎使用)
2.创建带缓存的线程池(根据任务的数量生成对应的线程数,适用于短期大量任务)
3.创建可以执行定时任务的线程池
scheduleAtFixedRate 和cheduleWithFixedDelay的区别:
4.创建单个执行定时任务的线程池
5.创建单个线程的线程池
a:频繁的创建和消耗;
b:更好的分配和执行任务,并且可以将任务存放到任务队列
6.根据当前工作环境(CPU核心数,任务量)创建一个异步线程池 JDK1.8
7.ThreadPoolExecutor------7大参数
ThreadPoolExecutor7大参数
1,核心线程数
2,最大线程数
3,最大存活时间
4,存活时间的单位
5,任务队列
6,现场工厂(优先级,命名规则…)
7,拒绝策略
ThreadPoolExecutor执行流程
拒绝策略
JDK提供了4种
1.默认拒绝策略,不执行
2.使用调用的线程来执行任务
3.放弃任务
4.放弃最老的任务
ThreadLocal使用的时候必须要进行remove(脏读,内存溢出)
如果使用ThreadLocal默认情况下子线程是得不到父线程的数据
ThreadLocal原理?
Thread–>ThreadLocal---->ThreadLocalMap---->Entry[]—>Entry(key,value)
ThreadLocal哈希处理