大家好,我是坤哥 网上看到一个很有意思的美团面试题:为什么线程崩溃崩溃不会导致 JVM 崩溃,这个问题我看了不少回答,但发现都没答到根上,所以决定答一答,相信大家看完肯定会有收获,本文分以下几节来探讨...线程崩溃,进程一定会崩溃吗 进程是如何崩溃的-信号机制简介 为什么在 JVM 中线程崩溃不会导致 JVM 进程崩溃 openJDK 源码解析 线程崩溃,进程一定会崩溃吗 一般来说如果线程是因为非法访问内存引起的崩溃...,崩溃 s[] = 'H'; } 访问了进程没有权限访问的地址空间(比如内核空间) // 针对进程的内核空间写入数据,崩溃 *p = ; } 访问了不存在的内存,比如 以上错误都是访问内存时的错误...如代码所示:注册信号处理函数后,当收到 SIGSEGV 信号后,先执行相关的逻辑再退出 另外当进程接收信号之后也可以不定义自己的信号处理函数,而是选择忽略信号,如下 #include ...crash 文件(记录了一些堆栈信息或错误),然后退出 至此我相信大家明白了为什么发生了 StackoverflowError 和 NPE 这两个非法访问内存的错误,JVM 却没有崩溃。
2 运行时栈帧结构 栈帧(Stack Frame) 是用于支持虚拟机方法调用和方法执行的数据结构,它是虚拟机运行时数据区中虚拟机栈(Virtual Machine Stack)的栈元素。...当一个方法执行开始时,这个方法的操作数栈是空的,在方法执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是 出栈/入栈操作。 ? 在概念模型中,一个活动线程中两个栈帧是相互独立的。...但大多数虚拟机实现都会做一些优化处理:让下一个栈帧的部分操作数栈与上一个栈帧的部分局部变量表重叠在一起,这样的好处是方法调用时可以共享一部分数据,而无须进行额外的参数复制传递。...- invokeinterface:调用接口方法,会在运行时在确定一个实现此接口的对象 - invokedynamic:先在运行时动态解析出点限定符所引用的方法,然后再执行该方法,在此之前的4条调用命令的分派逻辑是固化在...4.1 解释执行 Java语言经常被人们定位为 “解释执行”语言,在Java初生的JDK1.0时代,这种定义还比较准确的,但当主流的虚拟机中都包含了即时编译后,Class文件中的代码到底会被解释执行还是编译执行
尾部添加验证是否短缺的尾部(检测错误的帧校验序列)为什么需要添加报头和起始帧呢?...其实他有一个作用是为了观察时钟信号的频率的(为了之后还原 原始数字信号的),之后讲解起始帧当56位的报头数据结束后,开始发送起始帧,起始帧末尾的两位都是1也就是末尾有两段是高电压,和之前的电路不同,因此当识别到这个不同的电路时...有些通信方式采用了这样的设计,但以太网的包结束之后时钟信号也跟着结束了,没有通过这种方式来保持时钟同步,因此需要在每个包的前面加上报头,用来进行时钟同步。」...有些通信方式采用了这样的设计,但以太网的包结束之后时钟信号也跟着结束了,没有通过这种方式来保持时钟同步,因此需要在每个包的前面加上报头,用来进行时钟同步。...fcs末尾校验序列fcs用来检查包传输过程中因噪声导致的波形紊乱、数据错误,它是一串32比特的序列, 是根据包中所有的内容带入一个公式中计算出来的序列。
Java内存模型在1.8之前和1.8之后略有不同,也就是运行时数据区域,请看如下图: 在看图之前先看一下官网的图片: 运行时数据区域 Java1.6: JDK1.8 正如上图所示:Java...但是也是需要其它的运行时内存区域的配合比如程序计数器。 通过方法调用的数据都需要通过Java栈来进行传递,每一次方法调用都会有一个对应的栈帧压入栈中,每一个方法调用结束后都有一个栈帧弹出。...当虚拟机要使用一个类的时候,它需要读取并解析Class文件获取的相关信息,再将信息存入方法区。方法区会存储已被虚拟机加载的类信息、字段信息、方法信息、常量、静态变量、即使编译器编译后的代码缓存等数据。...运行时常量池的功能类似于传统编程语言的符号表,尽管它包含了比常规的符号表更宽泛的数据 既然运行时常量池是方法区的一部分,自然而然也收到内存的限制,当常量池无法申请到内存时也会抛出OutOfMemoryError...这样在一些场景中就能显著的提高性能,避免了Java堆和Native堆之间来回复制数据。 本机直接内存的分配不会受到Java堆的限制,但是既然是内存总会收到系统本机内存以及处理器寻址空间的限制。
Chrome 架构:仅仅打开了 1 个页面,为什么有 4 个进程 线程和进程区别:多线程可以并行处理任务,线程不能单独存在,它是由进程来启动和管理的。一个进程是一个程序的运行实例。...2、线程之间共享进程中的数据。3、当一个进程关闭后,操作系统会回收进程所占用的内存。4、进程之间的内容相互隔离。 单进程 浏览器:1、不稳定。单进程中的插件、渲染线程崩溃导致整个浏览器崩溃。...当分配的调用栈空间被占满时,会引发“堆栈溢出”问题。 块级作用域:var 缺陷以及为什么要引入 let 和 const let、const 申明的变量不会被提升。...; 多路复用的实现:HTTP/2 添加了二进制分帧层,将发送或响应数据经过二进制分帧处理,转化为一个个带有请求 ID 编号的帧,服务器或者浏览器接收到响应帧后,根据相同 ID 帧合并为一条完整信息; 设置请求优先级...,服务器用私钥解密出 pre-master 数据,结合 client-random 和 service-random 生成对称密钥,使用对称密钥传输加密数据; 引入数字证书是为了证明“我就是我”,防止
然而大家在享受cluster模块带来的福祉的同时,不少人也开始好奇 1.为什么我的应用代码中明明有app.listen(port);,但cluter模块在多次fork这份代码时,却没有报端口已被占用?...app.listen(port);,但cluter模块在多次fork这份代码时,却没有报端口已被占用?...目前常见的网络编程模型就是多进程或多线程,根据accpet的位置,分为如下场景 2种场景 (1) 单进程或线程创建socket,并进行listen和accept,接收到连接后创建进程和线程处理连接 (2...) 单进程或线程创建socket,并进行listen,预先创建好多个工作进程或线程accept()在同一个服务器套接字 这两种模型解充分发挥了多核CPU的优势,虽然可以做到线程和CPU核绑定,但都会存在...1.Satan.js提供了程序的退出、杀死等方法,因此它是魔鬼;God.js 负责维护进程的正常运行,当有异常退出时能保证重启,所以它是上帝。作者这么命名,我只能说一句:oh my god。
性能数据如何采集?本文围绕这些问题和你一起探讨。 一、为什么要做前端性能监控 可能你也有过这样的经历: 有用户反馈你的网站很慢,然后你立马紧张地在浏览器上打开用户反馈的网站。...真实用户监控 真实用户监控, 记录的是真实的用户当时访问页面时的真实的数据,在访问结果时把采集到的数据上报到服务器,再经过数据清洗、加工等工作后,在监控平台上呈现监控数据。 3....3)但是FID的计算有其明显的问题,如当使用者在Main Thread闲置时操作,那FID可能就短,若不操作则FID则无法计算。...这个API会在任意时间上报layout-shift的条目,当一个可见元素在两帧之间,改变了它的起始位置(默认的writing mode下指的是top和left属性)。这些元素被当成不稳定元素。...responseEnd 浏览器从服务器收到(或从本地缓存读取)最后一个字节时(如果在此之前HTTP连接已经关闭,则返回关闭时)的时间戳。 domLoading 当前网页DOM结构开始解析时的时间戳。
类加载过程 当一个类加载器接收到一个类加载的任务时,不会立即展开加载,而是将加载任务委托给它的父类加载器去执行,每一层的类都采用相同的方式,直至委托给最顶层的启动类加载器为止。...使用双亲委托机制的好处是:能够有效确保一个类的全局唯一性,当程序中出现多个限定名相同的类时,类加载器在执行加载时,始终只会加载其中的某一个类。...链接 链接阶段要做的是将加载到JVM中的二进制字节流的类数据信息合并到JVM的运行时状态中,经由验证、准备和解析三个阶段。...JVM运行时数据区 JVM在执行Java代码时都会把内存分为几个部分,即数据区来使用,这些区域都拥有自己的用途,并随着JVM进程的启动或者用户线程的启动和结束建立和销毁。 ?...Method Area(Non-Heap) 线程共享 存储 1.类信息 2.常量 3.静态变量 4.方法字节码 VM Stack / Native Method Stack 线程私有 方法在执行时会创建一个栈帧
编译型语言会在编译时报错,而解释型语言确实在解释到某一行时报错。 上面这种属于语法错误,而语法错误之外还要一种语义错误,也就是我们常说的这段代码存在逻辑上的错误。明明没报错,却没有得到预期的结果。...第三个红框是程序在该行时的状态。 上面是Windows下的一些内容,接下来是Linux上的一些内容。 Linux使用pdb进行调试。...w(here) 打印堆栈跟踪,最近一帧在底部。箭头表示当前帧,它决定了大多数命令的上下文。 d(own) [count] 移动当前帧计数(默认的)水平在堆栈跟踪下(到较新的帧)。...u(p) [count] 将当前帧计数(默认的)水平,直至在堆栈跟踪(到旧帧)。...如果省略计数,忽略计数设置为0.当忽略计数为零时,断点变为活动状态。非零时,每次到达断点时都会减少计数,并且不会禁用断点,并且任何关联的条件计算结果为true。
小菜农尽管没啥经验,但为了给导师留下良好的印象便一口爽快的接下需求。...在 WebSocket 中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,进行双向数据传输 在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道...Socket.onmessage 客户端接收服务端数据时触发 error Socket.onerror 通信发生错误时触发 close Socket.onclose 连接关闭时触发 代码如下: 到这里...,websocket 通信便已经实现了,当小菜农刚要准备提交的时候,一个念头兴起,websocket 是导师给我的建议,虽然我已经完成了,但是会不会有更好的方式,能让导师眼前一亮?...stomp 拦截器: 接收客户端消息的地方: 发送消息: 到这里服务端部分的代码便已经实现了~客户端部分也很简单只需要引入两个 js 便可实现 这里为了在客户端接收到消息,必须要先订阅一个目的地
,在标记前添加转义字符(这种方式解决了一部分问题,但同时也带来了一些特殊情况,当数据中包含转义字符时,又必须在转义字符前添加转义字符避免混淆) 特殊情况下传输数据内容: ESC FLAG ESC FLAG...,产生确认 落在窗口外的帧被丢弃 SEQ码和ACK码 因为滑动窗口协议只涉及1个窗口,所以在传输过程中,SEQ码和ACK码的取值只有0和1两种,当SEQ码=1时,表示当前发送的数据为1序列号的帧,当ACK...不是返回2号帧,而是返回错误帧的上一位帧的确认帧,因为1号帧成功被接收,发送方借此可以判断是从2号帧开始需要重传的) 累计确认 在滑动窗口中采用了累计确认的方式来对帧进行确认 也就是说在收到对于5号帧确认时...当序列号等于8时,有足够标记(0,1,2,3,4,5,6,7)但这也是不允许的,因为这会引发新的问题。...我们在返回确认帧时采取了累计确认,当第一个窗口的8个帧全部被顺利接收后,接收方会返回一个确认帧ACK=7,表示已经正常收到7号帧及之前元素,可以继续发送下一窗口了。
当正常访问时,控制器通过packet-out让HTTP请求顺利转发,同时下一条从服务器到PC的反向流表; 当限制访问时,控制器通过: ①提取计算Seq、提取计算Ack、设置bits协议标志位、设置window_size...RST协议字段在我这个项目中,可谓是一个神器,它是一个TCP协议字段,会让通信双方各自强制关闭连接。RST常出现在连接本身出现严重差错、通信对端端口不可达、在已关闭的socket上收到数据等情况。...在这里,我们利用了“连接本身出现严重差错”这一条: 在HTTP响应数据包中,我们给TCP设置一个错误的Ack和一个正确的Seq,使得PC发起HTTP Request的超时重传,此时RYU会再次响应带有错误...,按理说它的TCP Ack应该累积递增,但是却没有,而仍然是我们设定的错误Ack。...通过多网口同时抓包,然后加以细致的分析,从TCP的三次握手、四次挥手,到TCP的Seq、Ack在传信令、数据时的累加机制,再到TCP的bits协议标志位,以及RST 这个连接守护者。
以下总结了一些面试中常问的问题: 1、TCP为什么需要3次握手,4次断开? “三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。...在tcp连接握手时为何ACK是和SYN一起发送,这里ACK却没有和FIN一起发送呢。原因是因为tcp是全双工模式,接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。...原因是因为该ACK确认了新的数据,说明从重复ACK时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态。 5、ARP是地址解析协议,简单语言解释一下工作原理。...(3)当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在...最重要的是帧定界(成帧)、透明传输以及差错检测。 10、网络接口卡(网卡)的功能? (1)进行串行/并行转换。(2)对数据进行缓存。(3)在计算机的操作系统安装设备驱动程序。(4)实现以太网协议。
为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线 数据链路层 CAN总线传输的是CAN帧,CAN的通信帧分成五种,分别为数据帧、远程帧、错误帧、过载帧和帧间隔。...过载帧 当某节点没有做好接收的"准备"时,将发送过载帧,以通知发送节点。 ? 帧间隔 用来隔离数据帧、远程帧与他们前面的帧,错误帧和过载帧前面不加帧间隔。 ?...MCU负责实现对功能电路和CAN控制器的控制:在节点启动时,初始化CAN控制器参数;通过CAN控制器读取和发送CAN帧;在CAN控制器发生中断时,处理CAN控制器的中断异常;根据接收到的数据输出控制信号...例如,我们将帧ID用来表示节点地址,当接收到的帧ID与自身节点ID不通过时,就直接丢弃,否则交给上层处理;发送时,将帧ID设置为接收节点的地址。...只检测模式:SJA1000发送CAN帧时不检查应答位; 只听模式:此模式下SJA1000不会发送错误帧,用于自动检测波特率;SJA1000以不同的波特率接收CAN帧,当收到CAN帧时,表明当前波特率与总线波特率相同
ACK段 当接收节点接收到的帧起始到CRC段都没错误时,它将在ACK段发送一个显性电平,发送节点发送隐性电平,线与结果为显性电平。...过载帧 当某节点没有做好接收的"准备"时,将发送过载帧,以通知发送节点。 帧间隔 用来隔离数据帧、远程帧与他们前面的帧,错误帧和过载帧前面不加帧间隔。...MCU负责实现对功能电路和CAN控制器的控制:在节点启动时,初始化CAN控制器参数;通过CAN控制器读取和发送CAN帧;在CAN控制器发生中断时,处理CAN控制器的中断异常;根据接收到的数据输出控制信号...例如,我们将帧ID用来表示节点地址,当接收到的帧ID与自身节点ID不通过时,就直接丢弃,否则交给上层处理;发送时,将帧ID设置为接收节点的地址。...; 只听模式:此模式下SJA1000不会发送错误帧,用于自动检测波特率;SJA1000以不同的波特率接收CAN帧,当收到CAN帧时,表明当前波特率与总线波特率相同。
我的天,知识点来了! 可能很多同学也知道这个布局是被放到了一个叫做DecorView的父布局里,但是我还是要再说一遍。且看下图。 ? 这个图可能和伙伴们在书上或者网上常见的不太一样,为什么不太一样呢?...如图,当帧率小于刷新率时,比如图中的30FPS < 60HZ,就会出现相邻两帧看到的是同一个画面,这就造成了卡顿。...这使得HWComposer在需要时才产生Vsync信号(比如当屏幕上的内容需要改变时),不需要时进入睡眠状态(比如当屏幕上的内容保持不变时,此时屏幕每次刷新都是显示缓冲区里没发生变化的内容)。...同时当收到一个Vsync信号时,第N帧开始绘制。等再收到一个Vsync信号时,第N帧才被SurfaceFlinger合成。而需要显示到屏幕上,需要等都第三个Vsync信号。这是比较低效率。...在UI线程中进行复杂的数据处理。我说的是比如数据的加密、解密、编码等等。这些操作都需要进行复杂运算,特别是在数据比较复杂的时候。
当ACK=0时,确认号无效 TCP规定,在连接建立后所有传送的报文段都必须把ACK置1 同步SYN 在连接建立时用来同步序号 当SYN=1而ACK=0时,表明这是一个连接请求报文段。...断开过程 客户端无数据发送时,请求关闭连接,我好了,我想断开连接了(FIN=1)我的序号是u(u就是之前传送过的所有数据的最后一个字节的序号+1) 此时客户端转变为FIN-WAIT-1状态 服务器收到客户端的消息后...所以当客户端请求断开时,并不能立即断开,还需要等待服务器那边处理妥当,再来通知你的确是可以断开了 消息发出来谁知道别人收没收到,所以还需要一个确认 为什么还需要等待2MSL?...当适配器收到有差错的帧时,就把这个帧直接丢弃而不必通知计算机。 当适配器收到正确的帧时,它就使用中断来通知该计算机,并交付协议栈中的网络层。...当 FCS 一致,即确认数据没有错误时,接下来需要检查 MAC 头部中的接收方 MAC 地址,如果是发给自己的,就缓存下来,通知操作系统进行处理 路由器此时的处理是丢掉MAC头部,然后解析IP数据报信息
当传送IP数据包发生错误。比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这 也就是为什么说建立在IP层以上的协议是可能做到安全的原因。...为什么要三次握手? 为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。...ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次...为什么要等待2MSL? MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间。...但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。 慢开始算法: 当主机开始发送数据时,如果立即所大量数据字节注入到网络,那么就有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。
工作原理 对于发送端: 每收到一个确认帧,发送窗口就向前滑动一个帧的距离 当发送窗口内无可发送的帧时(即窗口内的帧全部是已发送但未收到确认的帧),发送方就会停止发送,直到收到接收方发送的确认帧使窗口移动...对于接收端:当收到数据帧后,将窗口向前移动一个位置,并发回确认帧,若收到的数据帧落在接收窗口之外,则一律丢弃。 ?...滑动窗口 协议的重要特性 只有接收窗口向前滑动、接收方发送了确认帧时,发送窗口才有可能(只有发送方收到确认帧才是一定)向前滑动 停止-等待协议、后退N帧协议 & 选择重传协议只是在发送窗口大小和接收窗口大小上有所差别...当接收窗口的大小为1时,可保证帧有序接收。...即 出错重传 当接收方来不及接收收到的数据时,可通知发送方降低发送数据的效率:即 速度匹配 针对上述2个问题,分别采用的解决方案是:自动重传协议 和 流量控制 & 拥塞控制协议 解决方案1:自动重传请求协议
当光盘有划痕时,整张盘都无法播放,就是因为那时的视频做了增量压缩,而且关键帧太少,导致关键帧损坏时,后面的增量帧全部无法播放了。 压缩分为无损压缩和有损压缩。...当光盘有划痕时,整张盘都无法播放,就是因为那时的视频做了增量压缩,而且关键帧太少,导致关键帧损坏时,后面的增量帧全部无法播放了。...由于它是32位整数,所以最多可以处理232也就是4.2GB的飞行中报文。像上图中,当1G-2G这些报文在网络中飞行时间过长时,就会与5G-6G报文重叠,引发错误。...当R1、R2中的TCP全速使用各自带宽时,就会引发R3丢包。拥塞控制就是解决丢包问题的。 自1982年TCP诞生起,就在使用传统的拥塞控制算法,它是发现丢包后再刹车减速,效果很不好。为什么呢?...你可以观察下图,路由器中会有缓冲队列,当队列为空时,ping的时延最短;当队列将满时,ping的时延很大,但还未发生丢包;当队列已满时,丢包才会发生。 所以,当队列出现积压时,丢包没有发生。
领取专属 10元无门槛券
手把手带您无忧上云