简单考虑Java是可以的,因为本质上当某个请求发生OutOfMemoryError时,只是意味着JVM剩余的可用内存小于该请求所需的内存,所以抛出OutOfMemoryError。但是,如果其他请求所需的内存比较小,JVM 可以满足的话,JVM 仍然可以继续处理其他请求。
但是,如果Linux中有一种机制:OOM Killer(Out Of Memory Killer),这种机制会监控操作系统中占用过多内存的进程。一旦操作系统发现系统内存不足,就会删除占用内存最高的进程。杀掉它。因此,当Java进程发生OutOfMemoryError时,可能会触发OOM杀手机制,被操作系统杀死,导致无法对外提供服务。
例如,我有以下控制器:
每次访问/test都会消耗100m内存,但是访问/hello基本不消耗内存。
指定-Xms200m -Xmx200m 参数来运行项目。第一次访问/test会正常返回,第二次访问/test会抛出OutOfMemoryError。只要抛出OutOfMemoryError,就说明该请求没有消耗内存(因为没有足够的内存供其消耗),此时程序还在运行,访问/hello时可以正常获取结果。
接下来我们来验证一下OOM杀手机制,将上面的SpringBoot应用制作成可执行的Jar并上传到阿里云服务器。服务器内存为512m。通过运行以下命令启动程序:
我第一次访问测试时,我得到了正常的结果。第二次访问测试的时候,Java进程直接被kill了。截图是:
标题:如果发生OutOfMemoryError,请求还能正常处理吗?
链接:https://yyuanw.com/news/sypc/19271.html
版权:文章转载自网络,如有侵权,请联系删除!
用户评论
OutOfMemoryError 出现,请求还能正常处理?这可太难了,系统可能直接崩溃吧!
有7位网友表示赞同!
如果遇到 OutOfMemoryError,请求肯定处理不了,只能返回错误信息了。
有15位网友表示赞同!
这个问题很关键,OutOfMemoryError发生后,请求还能正常处理吗?
有12位网友表示赞同!
OutOfMemoryError 一般都是内存溢出了,请求肯定处理不了吧?
有14位网友表示赞同!
如果内存溢出了,请求还能正常处理吗?我觉得不太可能,应该会直接报错吧?
有20位网友表示赞同!
OutOfMemoryError 出现,请求处理会受到影响,甚至无法完成。
有12位网友表示赞同!
内存溢出后,请求处理就很困难了。
有8位网友表示赞同!
OutOfMemoryError 出现,程序可能直接崩溃,请求处理就无从谈起。
有9位网友表示赞同!
这种情况请求肯定无法正常处理,要先解决内存问题。
有8位网友表示赞同!
如果发生 OutOfMemoryError,请求可能无法得到响应。
有19位网友表示赞同!
OutOfMemoryError 发生后,请求处理会受到很大影响,甚至直接失败。
有19位网友表示赞同!
这种情况一般会直接导致请求失败,无法正常处理。
有12位网友表示赞同!
遇到 OutOfMemoryError,请求肯定没戏了。
有10位网友表示赞同!
程序出现内存溢出,请求还能正常处理吗?不太可能吧!
有8位网友表示赞同!
OutOfMemoryError 后,请求处理就变成不可能的任务。
有5位网友表示赞同!
内存溢出,程序会崩溃,请求肯定无法正常处理。
有13位网友表示赞同!
OutOfMemoryError 出现,请求处理会直接中断。
有18位网友表示赞同!
这种情况,请求处理会受到很大影响。
有20位网友表示赞同!
遇到 OutOfMemoryError,程序会崩溃,请求自然也就处理不了。
有9位网友表示赞同!
OutOfMemoryError 出现,请求处理会受到严重影响,甚至直接失败。
有19位网友表示赞同!