首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

美团一面:为什么线程崩溃崩溃不会导致 JVM 崩溃

大家好,是坤哥 网上看到一个很有意思的美团面试题:为什么线程崩溃崩溃不会导致 JVM 崩溃,这个问题看了不少回答,发现都没答到根上,所以决定答一答,相信大家看完肯定会有收获,本文分以下几节来探讨...线程崩溃,进程一定会崩溃吗 进程是如何崩溃的-信号机制简介 为什么 JVM 中线程崩溃不会导致 JVM 进程崩溃 openJDK 源码解析 线程崩溃,进程一定会崩溃吗 一般来说如果线程是因为非法访问内存引起的崩溃...,崩溃 s[] = 'H'; } 访问了进程没有权限访问的地址空间(比如内核空间) // 针对进程的内核空间写入数据,崩溃 *p = ; } 访问了不存在的内存,比如 以上错误都是访问内存错误...如代码所示:注册信号处理函数后,收到 SIGSEGV 信号后,先执行相关的逻辑再退出 另外进程接收信号之后也可以不定义自己的信号处理函数,而是选择忽略信号,如下 #include ...crash 文件(记录了一些堆栈信息或错误),然后退出 至此相信大家明白了为什么发生了 StackoverflowError 和 NPE 这两个非法访问内存的错误,JVM 却没有崩溃。

2K20

深入理解JVM虚拟机5:虚拟机字节码执行引擎

2 运行时结构 栈(Stack Frame) 是用于支持虚拟机方法调用和方法执行的数据结构,它是虚拟机运行时数据区中虚拟机栈(Virtual Machine Stack)的栈元素。...一个方法执行开始,这个方法的操作数栈是空的,方法执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是 出栈/入栈操作。 ? 概念模型中,一个活动线程中两个栈是相互独立的。...大多数虚拟机实现都会做一些优化处理:让下一个栈的部分操作数栈与上一个栈的部分局部变量表重叠在一起,这样的好处是方法调用时可以共享一部分数据,而无须进行额外的参数复制传递。...- invokeinterface:调用接口方法,会在运行时确定一个实现此接口的对象 - invokedynamic:先在运行时动态解析出点限定符所引用的方法,然后再执行该方法,在此之前的4条调用命令的分派逻辑是固化...4.1 解释执行 Java语言经常被人们定位为 “解释执行”语言,Java初生的JDK1.0代,这种定义还比较准确的,主流的虚拟机中都包含了即时编译后,Class文件中的代码到底会被解释执行还是编译执行

53910
您找到你想要的搜索结果了吗?
是的
没有找到

计算机网络:网卡如何进行组装Frame

尾部添加验证是否短缺的尾部(检测错误校验序列)为什么需要添加报头和起始呢?...其实他有一个作用是为了观察时钟信号的频率的(为了之后还原 原始数字信号的),之后讲解起始56位的报头数据结束后,开始发送起始,起始末尾的两位都是1也就是末尾有两段是高电压,和之前的电路不同,因此识别到这个不同的电路...有些通信方式采用了这样的设计,以太网的包结束之后时钟信号也跟着结束了,没有通过这种方式来保持时钟同步,因此需要在每个包的前面加上报头,用来进行时钟同步。」...有些通信方式采用了这样的设计,以太网的包结束之后时钟信号也跟着结束了,没有通过这种方式来保持时钟同步,因此需要在每个包的前面加上报头,用来进行时钟同步。...fcs末尾校验序列fcs用来检查包传输过程中因噪声导致的波形紊乱、数据错误它是一串32比特的序列, 是根据包中所有的内容带入一个公式中计算出来的序列。

23740

一问带你彻底了解JVM-Java内存区域详解

Java内存模型1.8之前和1.8之后略有不同,也就是运行时数据区域,请看如下图: 在看图之前先看一下官网的图片: ​ 运行时数据区域 Java1.6: JDK1.8 正如上图所示:Java...但是也是需要其它的运行时内存区域的配合比如程序计数器。 通过方法调用的数据都需要通过Java栈来进行传递,每一次方法调用都会有一个对应的栈压入栈中,每一个方法调用结束后都有一个栈弹出。...虚拟机要使用一个类的时候,它需要读取并解析Class文件获取的相关信息,再将信息存入方法区。方法区会存储已被虚拟机加载的类信息、字段信息、方法信息、常量、静态变量、即使编译器编译后的代码缓存等数据。...运行时常量池的功能类似于传统编程语言的符号表,尽管它包含了比常规的符号表更宽泛的数据 既然运行时常量池是方法区的一部分,自然而然也收到内存的限制,常量池无法申请到内存也会抛出OutOfMemoryError...这样一些场景中就能显著的提高性能,避免了Java堆和Native堆之间来回复制数据。 本机直接内存的分配不会受到Java堆的限制,但是既然是内存总会收到系统本机内存以及处理器寻址空间的限制。 ​

31710

作者学习完《浏览器基本原理与实践》后的 36 点总结

Chrome 架构:仅仅打开了 1 个页面,为什么有 4 个进程 线程和进程区别:多线程可以并行处理任务,线程不能单独存在,它是由进程来启动和管理的。一个进程是一个程序的运行实例。...2、线程之间共享进程中的数据。3、一个进程关闭后,操作系统会回收进程所占用的内存。4、进程之间的内容相互隔离。 进程 浏览器:1、不稳定。进程中的插件、渲染线程崩溃导致整个浏览器崩溃。...分配的调用栈空间被占满,会引发“堆栈溢出”问题。 块级作用域:var 缺陷以及为什么要引入 let 和 const let、const 申明的变量不会被提升。...; 多路复用的实现:HTTP/2 添加了二进制分层,将发送或响应数据经过二进制分处理,转化为一个个带有请求 ID 编号的,服务器或者浏览器接收到响应后,根据相同 ID 合并为一条完整信息; 设置请求优先级...,服务器用私钥解密出 pre-master 数据,结合 client-random 和 service-random 生成对称密钥,使用对称密钥传输加密数据; 引入数字证书是为了证明“就是”,防止

1.1K10

通过Node.js的Cluster模块源码,深入PM2原理

然而大家享受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。

2.9K30

前端监控的性能指标与数据采集

性能数据如何采集?本文围绕这些问题和你一起探讨。 一、为什么要做前端性能监控 可能你也有过这样的经历: 有用户反馈你的网站很慢,然后你立马紧张地浏览器上打开用户反馈的网站。...真实用户监控 真实用户监控, 记录的是真实的用户当时访问页面的真实的数据访问结果把采集到的数据上报到服务器,再经过数据清洗、加工等工作后,监控平台上呈现监控数据。 3....3)但是FID的计算有其明显的问题,如使用者Main Thread闲置操作,那FID可能就短,若不操作则FID则无法计算。...这个API会在任意时间上报layout-shift的条目,一个可见元素之间,改变了它的起始位置(默认的writing mode下指的是top和left属性)。这些元素被当成不稳定元素。...responseEnd 浏览器从服务器收到(或从本地缓存读取)最后一个字节时(如果在此之前HTTP连接已经关闭,则返回关闭)的时间戳。 domLoading 当前网页DOM结构开始解析的时间戳。

3.1K31

『互联网架构』软件架构-JVM(上)(25)

类加载过程 一个类加载器接收到一个类加载的任务,不会立即展开加载,而是将加载任务委托给它的父类加载器去执行,每一层的类都采用相同的方式,直至委托给最顶层的启动类加载器为止。...使用双亲委托机制的好处是:能够有效确保一个类的全局唯一性,程序中出现多个限定名相同的类,类加载器执行加载,始终只会加载其中的某一个类。...链接 链接阶段要做的是将加载到JVM中的二进制字节流的类数据信息合并到JVM的运行时状态中,经由验证、准备和解析三个阶段。...JVM运行时数据区 JVM执行Java代码都会把内存分为几个部分,即数据区来使用,这些区域都拥有自己的用途,并随着JVM进程的启动或者用户线程的启动和结束建立和销毁。 ?...Method Area(Non-Heap) 线程共享 存储 1.类信息 2.常量 3.静态变量 4.方法字节码 VM Stack / Native Method Stack 线程私有 方法行时会创建一个栈

52130

Python | Debugger和pdb,鸡肋否?

编译型语言会在编译时报错,而解释型语言确实在解释到某一行时报错。 上面这种属于语法错误,而语法错误之外还要一种语义错误,也就是我们常说的这段代码存在逻辑上的错误。明明没报错,却没有得到预期的结果。...第三个红框是程序行时的状态。 上面是Windows下的一些内容,接下来是Linux上的一些内容。 Linux使用pdb进行调试。...w(here) 打印堆栈跟踪,最近一底部。箭头表示当前,它决定了大多数命令的上下文。 d(own) [count] 移动当前计数(默认的)水平堆栈跟踪下(到较新的)。...u(p) [count] 将当前计数(默认的)水平,直至堆栈跟踪(到旧)。...如果省略计数,忽略计数设置为0.忽略计数为零,断点变为活动状态。非零,每次到达断点都会减少计数,并且不会禁用断点,并且任何关联的条件计算结果为true。

1.4K20

《菜农升职记》之 Websocket

小菜农尽管没啥经验,为了给导师留下良好的印象便一口爽快的接下需求。... WebSocket 中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,进行双向数据传输 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道...Socket.onmessage 客户端接收服务端数据触发 error Socket.onerror 通信发生错误时触发 close Socket.onclose 连接关闭触发 代码如下: 到这里...,websocket 通信便已经实现了,小菜农刚要准备提交的时候,一个念头兴起,websocket 是导师给我的建议,虽然已经完成了,但是会不会有更好的方式,能让导师眼前一亮?...stomp 拦截器: 接收客户端消息的地方: 发送消息: 到这里服务端部分的代码便已经实现了~客户端部分也很简单只需要引入两个 js 便可实现 这里为了客户端接收到消息,必须要先订阅一个目的地

42820

7-数据链路层-逻辑链路控制子层

标记前添加转义字符(这种方式解决了一部分问题,同时也带来了一些特殊情况,数据中包含转义字符,又必须在转义字符前添加转义字符避免混淆) 特殊情况下传输数据内容: 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号及之前元素,可以继续发送下一窗口了。

2K20

SDN:优雅的间歇性访问限制

正常访问,控制器通过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 这个连接守护者。

92140

面试中常见的计算机网络的问题

以下总结了一些面试中常问的问题: 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)实现以太网协议。

81930

CAN总线(一)

为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线 数据链路层 CAN总线传输的是CAN,CAN的通信分成五种,分别为数据、远程错误、过载间隔。...过载 某节点没有做好接收的"准备",将发送过载,以通知发送节点。 ? 间隔 用来隔离数据、远程与他们前面的错误和过载前面不加间隔。 ?...MCU负责实现对功能电路和CAN控制器的控制:节点启动,初始化CAN控制器参数;通过CAN控制器读取和发送CANCAN控制器发生中断,处理CAN控制器的中断异常;根据接收到数据输出控制信号...例如,我们将ID用来表示节点地址,收到ID与自身节点ID不通过时,就直接丢弃,否则交给上层处理;发送,将ID设置为接收节点的地址。...只检测模式:SJA1000发送CAN不检查应答位; 只听模式:此模式下SJA1000不会发送错误,用于自动检测波特率;SJA1000以不同的波特率接收CAN收到CAN,表明当前波特率与总线波特率相同

88220

嵌入式必懂的 CAN 总线,真的讲到位了!!

ACK段 接收节点接收到起始到CRC段都没错误时,它将在ACK段发送一个显性电平,发送节点发送隐性电平,线与结果为显性电平。...过载 某节点没有做好接收的"准备",将发送过载,以通知发送节点。 间隔 用来隔离数据、远程与他们前面的错误和过载前面不加间隔。...MCU负责实现对功能电路和CAN控制器的控制:节点启动,初始化CAN控制器参数;通过CAN控制器读取和发送CANCAN控制器发生中断,处理CAN控制器的中断异常;根据接收到数据输出控制信号...例如,我们将ID用来表示节点地址,收到ID与自身节点ID不通过时,就直接丢弃,否则交给上层处理;发送,将ID设置为接收节点的地址。...; 只听模式:此模式下SJA1000不会发送错误,用于自动检测波特率;SJA1000以不同的波特率接收CAN收到CAN,表明当前波特率与总线波特率相同。

1.2K50

用两张图告诉你,为什么你的App会卡顿?

的天,知识点来了! 可能很多同学也知道这个布局是被放到了一个叫做DecorView的父布局里,但是还是要再说一遍。且看下图。 ? 这个图可能和伙伴们书上或者网上常见的不太一样,为什么不太一样呢?...如图,帧率小于刷新率,比如图中的30FPS < 60HZ,就会出现相邻两看到的是同一个画面,这就造成了卡顿。...这使得HWComposer需要才产生Vsync信号(比如屏幕上的内容需要改变),不需要进入睡眠状态(比如屏幕上的内容保持不变,此时屏幕每次刷新都是显示缓冲区里没发生变化的内容)。...同时收到一个Vsync信号,第N开始绘制。等再收到一个Vsync信号,第N才被SurfaceFlinger合成。而需要显示到屏幕上,需要等都第三个Vsync信号。这是比较低效率。...UI线程中进行复杂的数据处理。说的是比如数据的加密、解密、编码等等。这些操作都需要进行复杂运算,特别是在数据比较复杂的时候。

87730

网络是如何连接的?网络发展简介(四)

ACK=0,确认号无效 TCP规定,连接建立后所有传送的报文段都必须把ACK置1 同步SYN 连接建立时用来同步序号 SYN=1而ACK=0,表明这是一个连接请求报文段。...断开过程 客户端无数据发送,请求关闭连接,好了,想断开连接了(FIN=1)的序号是u(u就是之前传送过的所有数据的最后一个字节的序号+1) 此时客户端转变为FIN-WAIT-1状态 服务器收到客户端的消息后...所以客户端请求断开,并不能立即断开,还需要等待服务器那边处理妥当,再来通知你的确是可以断开了 消息发出来谁知道别人收没收到,所以还需要一个确认 为什么还需要等待2MSL?...适配器收到有差错的,就把这个直接丢弃而不必通知计算机。 适配器收到正确的,它就使用中断来通知该计算机,并交付协议栈中的网络层。... FCS 一致,即确认数据没有错误时,接下来需要检查 MAC 头部中的接收方 MAC 地址,如果是发给自己的,就缓存下来,通知操作系统进行处理 路由器此时的处理是丢掉MAC头部,然后解析IP数据报信息

3.9K50

TCPIP中你不得不知的十大秘密

传送IP数据包发生错误。比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这 也就是为什么说建立IP层以上的协议是可能做到安全的原因。...为什么要三次握手? 为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。...ACK报文段,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;主机2也发送了FIN报文段,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,也没有数据要发送了,之后彼此就会愉快的中断这次...为什么要等待2MSL? MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间。...只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。 慢开始算法: 主机开始发送数据,如果立即所大量数据字节注入到网络,那么就有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。

93961

计算机网络:这是一份全面 & 详细 的TCP协议学习指南

工作原理 对于发送端: 每收到一个确认,发送窗口就向前滑动一个的距离 发送窗口内无可发送的(即窗口内的全部是已发送但未收到确认的),发送方就会停止发送,直到收到接收方发送的确认使窗口移动...对于接收端:收到数据后,将窗口向前移动一个位置,并发回确认,若收到数据落在接收窗口之外,则一律丢弃。 ?...滑动窗口 协议的重要特性 只有接收窗口向前滑动、接收方发送了确认,发送窗口才有可能(只有发送方收到确认才是一定)向前滑动 停止-等待协议、后退N协议 & 选择重传协议只是发送窗口大小和接收窗口大小上有所差别...接收窗口的大小为1,可保证有序接收。...即 出错重传 接收方来不及接收收到数据,可通知发送方降低发送数据的效率:即 速度匹配 针对上述2个问题,分别采用的解决方案是:自动重传协议 和 流量控制 & 拥塞控制协议 解决方案1:自动重传请求协议

52110

TVP思享 | 四个全新维度,极限优化HTTP性能

光盘有划痕,整张盘都无法播放,就是因为那时的视频做了增量压缩,而且关键太少,导致关键损坏,后面的增量全部无法播放了。 压缩分为无损压缩和有损压缩。...光盘有划痕,整张盘都无法播放,就是因为那时的视频做了增量压缩,而且关键太少,导致关键损坏,后面的增量全部无法播放了。...由于它是32位整数,所以最多可以处理232也就是4.2GB的飞行中报文。像上图中,1G-2G这些报文在网络中飞行时间过长,就会与5G-6G报文重叠,引发错误。...R1、R2中的TCP全速使用各自带宽,就会引发R3丢包。拥塞控制就是解决丢包问题的。 自1982年TCP诞生起,就在使用传统的拥塞控制算法,它是发现丢包后再刹车减速,效果很不好。为什么呢?...你可以观察下图,路由器中会有缓冲队列,队列为空,ping的延最短;队列将满,ping的延很大,还未发生丢包;队列已满,丢包才会发生。 所以,队列出现积压,丢包没有发生。

2.1K561
领券