9 OOM和JVM退出。OOM后JVM一定会退出吗?

首先我们把两个概念讲清楚

OOM是线程在申请堆内存,发现堆内存空间不足时候抛出的异常。

JVM退出的条件如下:
java虚拟机在没有守护线程的时候会退出。守护线程是启动JVM的线程,服务于用户线程。

我们简单说下守护线程的功能:

1.日志的记录和监控
2.资源的管理和清理
3.定时任务执行
4.后台服务
5.JVM内部服务
更加详细的这里不做熬述

我们知道线程是计算机资源调度的基本单位,我们去观察任何操作系统,都是线程作为资源调度的基本单位,在程序异常退出的时候不会操作系统关闭了。有人会说那我有时候打开应用程序的时候用着用着蓝屏了?那是windows操作系统没处理好一些问题造成的。
同样JVM也是虚拟机,遵从大部分计算机的设计理念,java的设计线程的时候也充分考虑了线程的独立性。
所以在未捕获异常的情况下,OOM是该线程异常中止执行,JVM并不会异常退出。这两个算是两个不同的操作,没有必然的联系。

有人会说,那为什么我写一个让JVM OOM的程序,触发之后JVM就退出了呢?那是因为我们在main函数执行的主线程中触发的OOM,线程退出就是main函数退出,当然JVM在main函数退出之后,做完相关的处理之后JVM接着退出了。

我们现在做个总结:

在我们在main函数内部启动的线程发生OOM的时候该线程退出,线程池OOM线程池创建的线程结束。要主线程无关,并且JVM不会退出

什么时候OOMJVM会退出呢?

1:所有的非守护线程由于申请不到内存而OOM,所有非守护线程退出,JVM退出,这个属于主动退出
OOM的发生表示了此刻JVM堆内存告罄,不能分配出更多的资源,或者GC回收效率不可观。
一个线程的OOM,在一定程度的并发下,若此时其他线程(含非守护线程)也需要申请堆内存,那么其他线程也会因为申请不到内存而OOM,甚至连锁反应导致整个JVM的退出

2:OOM溢出,说明内存耗尽,如果操作系统内存耗尽,就会发生OOM killer(Out OfMemory killer),干掉JVM进程,导致被动退出

Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉。内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory()被触发,然后调用select_bad_process()选择一个”bad”进程杀掉。如何判断和选择一个”bad进程呢?linux选择”bad”进程是通过调用oom_badness(),挑选的算法和想法都很简单很朴实:最bad的那个进程就是那个最占用内存的进程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/64526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试经典题目:LeetCode274_H指数

leetcode274——H指数 暴力循环代码分析性能分析 方法1:排序加线性扫描算法步骤: 方法2:计数排序(适用于引用次数有上限)算法步骤: 题目链接:leetcode274_H指数 暴力循环 class Solution { publ…

【前端爬虫】关于如何获取自己的请求头信息(user-agent和cookie)

注意:由于user-agent和cookie中保存了部分账户信息,所以一定不要随意泄露给他人!!! 1.首先打开某个页面,点击键盘的F12键进入控制台,或者鼠标右键页面选择打开控制台 2.然后点击控制台上方的网…

爬虫抓取的数据如何有效存储和管理?

在现代数据驱动的世界中,爬虫技术已成为获取网络数据的重要手段。然而,如何有效地存储和管理这些数据是一个关键问题。本文将详细介绍几种有效的数据存储和管理方法,并提供相应的Java代码示例。 1. 数据存储方式 1.1 文件存储 文件存储是最…

将java项目部署到linux

命令解析 Dockerfile: Dockerfile 是一个文本文件,包含了所有必要的指令来组装(build)一个 Docker 镜像。 docker build: 根据 Dockerfile 或标准指令来构建一个新的镜像。 docker save: 将本地镜像保存为一个 tar 文件。 docker load: 从…

Next.js 13 App Router实战踩坑与性能优化指南

去年年底,我接了一个海外客户的项目,要求使用 Next.js 13 的 App Router 开发一个数据分析平台。说实话,当时虽然对 Next.js 已经很熟悉了,但对 App Router 这个相对较新的特性还是有些忐忑。现在项目已经成功上线,我想…

MySQL 中快速插入大量数据

在 MySQL 中快速插入大量数据(例如 20 万条记录)可以通过多种方法实现。以下是一些优化技巧和步骤,可以帮助你高效地插入大量数据: 1. 禁用索引和约束(如果可能) 在插入大量数据之前,禁用索引和…

Chrome 浏览器原生功能截长屏

我偶尔需要截取一些网页内容作为素材,但偶尔内容很长无法截全,需要多次截屏再拼接,过于麻烦。所以记录下这个通过浏览器原生功能截长屏的方案。 注意 这种方案并不是百分百完美,如果涉及到一些需要滚动加载的数据或者悬浮区块&am…

Python+OpenCV系列:AI看图识人、识车、识万物

在人工智能风靡全球的今天,用 Python 和 OpenCV 结合机器学习实现物体识别,不仅是酷炫技能,更是掌握未来的敲门砖。本篇博文手把手教你如何通过摄像头或图片输入,识别人、动物、车辆及其他物品,让你的程序瞬间具备 AI …

关于如何正确在测试用例中mock静态方法的问题

文章目录 情况一:希望在测试用例中直接执行静态方法的逻辑情况二:不希望在测试用例中执行静态方法的逻辑插桩方法坑1: 报错SubclassByteBuddyMockMaker原因与解决方案坑2:报错 the existing static mock registration must be deregistered原…

Shell自定义(二)

1.Shell自定义 1.初始化 定义全局变量environ,把g_env的内容用memset初始化为0,这里用malloc开辟的空间为对应环境变量的长度1,多1位置是最后结束符0,strcpy把此时的对应的环境变量拷贝到g_env里面,下面是新增一个环…

PHPstudy中的数据库启动不了

法一 netstat -ano |findstr "3306" 查看占用该端口的进程号 taskkill /f /pid 6720 杀死进程 法二 sc delete mysql

安装与配置MongoDB 6.0以支持远程连接

安装与配置MongoDB 6.0以支持远程连接 目录 安装curl工具下载并导入MongoDB 6.0 PGP密钥向APT导入MongoDB 6.0版软件包的资源链接安装MongoDB依赖libssl1.1安装MongoDB启动并检查MongoDB服务状态进入MongoDB Shell交互式执行环境设置MongoDB开机自启配置MongoDB允许远程连接 …

Hive其一,简介、体系结构和内嵌模式、本地模式的安装

目录 一、Hive简介 二、体系结构 三、安装 1、内嵌模式 2、测试内嵌模式 3、本地模式--最常使用的模式 一、Hive简介 Hive 是一个框架,可以通过编写sql的方式,自动的编译为MR任务的一个工具。 在这个世界上,会写SQL的人远远大于会写ja…

百度智能云千帆AppBuilder升级,百度AI搜索组件上线,RAG支持无限容量向量存储!

百度智能云千帆 AppBuilder 发版升级! 进一步降低开发门槛,落地大模型到应用的最后一公里。在千帆 AppBuilder 最新升级的 V1.1版本中,企业级 RAG 和 Agent 能力再度提升,同时组件生态与应用集成分发更加优化。 • 企业级 RAG&am…

解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误

解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误 您在 Ubuntu 20.04 上编译 OpenCV 3.2 时遇到的错误与 C 标准库的头文件配置问题有关。错误消息指出系统无法找到 <stdlib.h>&#xff0c;这通常与预编译头文件的处理、GCC 版本或者头文件搜索路径有关。下面…

Swagger自动文档工具以及gin-swagger的使用

什么是 Swagger&#xff1f; Swagger 是一个开源的 API 设计和文档工具&#xff0c;旨在帮助开发者更高效地设计、构建、记录和测试 RESTful API。它基于 OpenAPI 规范&#xff08;前身为 Swagger 规范&#xff09;&#xff0c;通过自动化的方式生成交互式 API 文档、客户端 S…

网络视频监控平台/安防监控/视频综合管理Liveweb视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题&#xff1a; 1&#xff09;不同单位在视频平台建设中以所属领域为单位&#xff0c;设备品牌众多&#xff0c;存在的标准不一&#xff0c;各系统之间也没有统一标准&#xff1b; 2&#xff09;各单位视频平台建设分散、统筹性差&am…

为什么要用单例模式?

‌单例模式是一种创建型设计模式&#xff0c;用于确保某个类只有一个实例&#xff0c;并提供一个全局访问点&#xff0c;使得其他类可以轻松访问该实例‌。 使用单例模式的主要原因包括以下几点&#xff1a;‌ ‌确保唯一性‌&#xff1a;在某些情况下&#xff0c;我们需要确…

c语言——数据结构【链表:单向链表】

上篇→快速掌握C语言——数据结构【创建顺序表】多文件编译-CSDN博客 一、链表 二、单向链表 2.1 概念 2.2 单向链表的组成 2.3 单向链表节点的结构体原型 //类型重定义,表示存放的数据类型 typedef int DataType;//定义节点的结构体类型 typedef struct node {union{int l…

在Linux中使用`scp`进行远程目录文件复制

在Linux系统中&#xff0c;scp&#xff08;安全复制协议&#xff09;是一个使用SSH&#xff08;安全外壳协议&#xff09;进行文件和目录安全传输的命令。它允许在远程主机之间复制文件和目录&#xff0c;具有很强的安全性&#xff0c;是一种常用的文件传输工具。以下是如何使用…