https://www.nowcoder.com/discuss/363312?type=2&order=1&pos=6&page=1
在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤?
第一步是浏览器对用户输入的网址做初步的格式化检查:
用http还是https?默认是http。
第二步,查找DNS。比如zhihu.com,DNS负责把zhihu.com转化为IP地址。怎么找?DNS能自己查询到的,绝不麻烦别人。先查找自己内存当中的DNS cache,然后再找本地硬盘里的host文件,然后再找DNS服务器。
第三步,建立TCP连接。
客户端:“你好,在家不,有你快递。”
服务端:“在的,是顺丰快递吧,单号12345。”
客户端:“对的。”
第四步、发送HTTP请求
第五步、服务器处理请求
第六步、返回响应结果
在HTTP里,有请求就会有响应,哪怕是错误信息。
第七步、关闭TCP连接
为了避免服务器与客户端双方的资源占用和损耗,当双方没有请求或响应传递时,任意一方都可以发起关闭请求。与创建TCP连接的3次握手类似,关闭TCP连接,需要4次握手。
客户端:“兄弟,我这边没数据要传了,咱关闭连接吧。”
服务端:“收到,我看看我这边有木有数据了。”
服务端:“兄弟,我这边也没数据要传你了,咱可以关闭连接了。”
客户端:“好嘞。”
发送方如何知道接收方究竟有没有收到呢?
继续深度思考,整个握手协议是为了让发送方确保接收方收到信息,那么上图下半部分最后一个步骤ack N+1发送出去后,发送方(客户端)如何知道接收方(服务端)究竟有没有收到呢?握手协议的设计魅力就体现出来了,这里涉及一个2MSL的概念。发送方(客户端)的逻辑是这样思考的,给接收方一个时间,在这个时间段内,假如接收方收不到信息,则接收方肯定会不断发送Fin N信号过来。换言之,如果接收方收到发送方(客户端)的确认信息,则在这个时间段内,发送方(客户端)不会收到接收方重复发过来的Fin N信号。而这个所谓的时间段,就被定义为两倍的MSL(Maximum Segment Lifetime)。
内存溢出
方法区:
存储已被虚拟机加载的类(class)信息 ,如常量,静态变量
堆区:
你可以认为堆就是存放的对象的实例,
(1) 堆溢出
当对象数量达到最大堆的容量限制后就会报这个异常ava.lang.OutOfMemoryError: Java heap space,而且是很常见内存溢出异常情况(java中别的可能不多,但是对象肯定多,万物皆对象)
出现这种情况先分析是内存泄漏还是内存溢出,这两个还是有本质区
别的
内存泄漏:通俗点讲就是原本应该死掉的对象竟然还活着,在占用着内存
内存溢出:里面的对象必须存在,但是堆的最大容量不够放下他们
堆内存溢出 :就要检查某些存在的对象是否生命周期过于长,持有状态时间过长,减少这些来腾出堆的空间
(2)
对于这两个如果出现内存溢出会有两种错误:
StackOverflowError:线程请求的栈的深度大于虚拟机规定的深度(单线程容易触发)
OutOfMemoryError:栈动态扩展,如果扩展时无法申请到足够的内存时抛出(多线程容易触发)
经过实验发现,用单线程栈帕太大(减少栈的深度)或者虚拟机栈容量不够报的都是StackOverflowError,但是多线程的情况下如果荣国栈的容量不够就会报OutOfMemoryError
解决办法:“减少内存”
对于栈的深度虚拟机默认的是1000~2000,对于正常的方法调用完全够了,
对于多线程导致的内存溢出,在不能减少线程或者更换64位虚拟机的情况下可以通过减少最大堆的容量(腾内存空间),减少栈的容量(因为一个线程一个栈,是私有的,所以可以减少每个私有栈的容量大小来创建更多的栈)
多线程安全,线程池相关问题